监听器重做
This commit is contained in:
parent
f5185f5630
commit
da08f33a02
|
|
@ -1,17 +1,27 @@
|
||||||
#include "..\e2dbase.h"
|
#include "..\e2dbase.h"
|
||||||
|
|
||||||
// 上一帧与当前帧的时间间隔
|
// 上一帧与当前帧的时间间隔
|
||||||
static int s_nInterval = 0;
|
static unsigned int s_nInterval = 0;
|
||||||
// 游戏开始时长
|
// 游戏开始时长
|
||||||
static double s_fTotalTime = 0;
|
static unsigned int s_nTotalTime = 0;
|
||||||
|
|
||||||
|
|
||||||
double e2d::Time::getTotalTime()
|
double e2d::Time::getTotalTime()
|
||||||
{
|
{
|
||||||
return s_fTotalTime;
|
return s_nTotalTime / 1000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int e2d::Time::getDeltaTime()
|
unsigned int e2d::Time::getTotalTimeMilliseconds()
|
||||||
|
{
|
||||||
|
return s_nTotalTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
double e2d::Time::getDeltaTime()
|
||||||
|
{
|
||||||
|
return s_nInterval / 1000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int e2d::Time::getDeltaTimeMilliseconds()
|
||||||
{
|
{
|
||||||
return s_nInterval;
|
return s_nInterval;
|
||||||
}
|
}
|
||||||
|
|
@ -64,8 +74,8 @@ void e2d::Time::__updateLast()
|
||||||
s_tLastUpdate = s_tNow;
|
s_tLastUpdate = s_tNow;
|
||||||
|
|
||||||
s_tNow = steady_clock::now();
|
s_tNow = steady_clock::now();
|
||||||
s_nInterval = static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLastUpdate).count());
|
s_nInterval = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tLastUpdate).count());
|
||||||
s_fTotalTime = static_cast<double>(duration_cast<milliseconds>(s_tNow - s_tStart).count()) / 1000.0;
|
s_nTotalTime = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tStart).count());
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Time::__sleep()
|
void e2d::Time::__sleep()
|
||||||
|
|
@ -132,8 +142,8 @@ void e2d::Time::__updateLast()
|
||||||
s_tLastUpdate = s_tNow;
|
s_tLastUpdate = s_tNow;
|
||||||
|
|
||||||
::QueryPerformanceCounter(&s_tNow);
|
::QueryPerformanceCounter(&s_tNow);
|
||||||
s_nInterval = static_cast<int>((s_tNow.QuadPart - s_tLastUpdate.QuadPart) * 1000LL / s_tFreq.QuadPart);
|
s_nInterval = static_cast<unsigned int>((s_tNow.QuadPart - s_tLastUpdate.QuadPart) * 1000LL / s_tFreq.QuadPart);
|
||||||
s_fTotalTime = static_cast<double>(s_tNow.QuadPart - s_tStart.QuadPart) / s_tFreq.QuadPart;
|
s_nTotalTime = static_cast<unsigned int>(s_tNow.QuadPart - s_tStart.QuadPart) * 1000LL / s_tFreq.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Time::__sleep()
|
void e2d::Time::__sleep()
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,21 @@ bool e2d::Scene::remove(Node * child)
|
||||||
return m_pRoot->removeChild(child);
|
return m_pRoot->removeChild(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::Node*> e2d::Scene::get(String name) const
|
||||||
|
{
|
||||||
|
return m_pRoot->getChildren(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
e2d::Node * e2d::Scene::getOne(String name) const
|
||||||
|
{
|
||||||
|
return m_pRoot->getChild(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::Node*> e2d::Scene::getAll() const
|
||||||
|
{
|
||||||
|
return m_pRoot->getAllChildren();
|
||||||
|
}
|
||||||
|
|
||||||
e2d::Node * e2d::Scene::getRoot() const
|
e2d::Node * e2d::Scene::getRoot() const
|
||||||
{
|
{
|
||||||
return m_pRoot;
|
return m_pRoot;
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ void e2d::ActionManager::__uninit()
|
||||||
|
|
||||||
void e2d::ActionManager::resumeAll()
|
void e2d::ActionManager::resumeAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getChildren())
|
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getAllChildren())
|
||||||
{
|
{
|
||||||
ActionManager::__resumeAllBindedWith(child);
|
ActionManager::__resumeAllBindedWith(child);
|
||||||
}
|
}
|
||||||
|
|
@ -187,7 +187,7 @@ void e2d::ActionManager::resumeAll()
|
||||||
|
|
||||||
void e2d::ActionManager::pauseAll()
|
void e2d::ActionManager::pauseAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getChildren())
|
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getAllChildren())
|
||||||
{
|
{
|
||||||
ActionManager::__pauseAllBindedWith(child);
|
ActionManager::__pauseAllBindedWith(child);
|
||||||
}
|
}
|
||||||
|
|
@ -195,7 +195,7 @@ void e2d::ActionManager::pauseAll()
|
||||||
|
|
||||||
void e2d::ActionManager::stopAll()
|
void e2d::ActionManager::stopAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getChildren())
|
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getAllChildren())
|
||||||
{
|
{
|
||||||
ActionManager::__stopAllBindedWith(child);
|
ActionManager::__stopAllBindedWith(child);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,43 @@
|
||||||
#include "..\e2dcollider.h"
|
#include "..\e2dcollider.h"
|
||||||
#include "..\e2dtool.h"
|
#include "..\e2dtool.h"
|
||||||
|
|
||||||
|
// 监听器
|
||||||
|
class Listener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Listener(
|
||||||
|
e2d::Function func,
|
||||||
|
e2d::String name,
|
||||||
|
bool paused
|
||||||
|
)
|
||||||
|
: name(name)
|
||||||
|
, callback(func)
|
||||||
|
, running(!paused)
|
||||||
|
, stopped(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新监听器状态
|
||||||
|
virtual void update()
|
||||||
|
{
|
||||||
|
if (callback)
|
||||||
|
{
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool running;
|
||||||
|
bool stopped;
|
||||||
|
e2d::String name;
|
||||||
|
e2d::Function callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// 碰撞体集合
|
// 碰撞体集合
|
||||||
static std::vector<e2d::Collider*> s_vColliders;
|
static std::vector<e2d::Collider*> s_vColliders;
|
||||||
// 监听器容器
|
// 监听器容器
|
||||||
static std::vector<e2d::CollisionListener*> s_vListeners;
|
static std::vector<Listener*> s_vListeners;
|
||||||
// 碰撞触发状态
|
// 碰撞触发状态
|
||||||
static bool s_bCollisionEnable = false;
|
static bool s_bCollisionEnable = false;
|
||||||
// 发生碰撞的节点
|
// 发生碰撞的节点
|
||||||
|
|
@ -21,21 +54,23 @@ void e2d::ColliderManager::setEnable(bool bEnable)
|
||||||
|
|
||||||
void e2d::ColliderManager::__update()
|
void e2d::ColliderManager::__update()
|
||||||
{
|
{
|
||||||
if (s_vListeners.size() == 0)
|
if (s_vListeners.empty() || Game::isPaused())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (size_t i = 0; i < s_vListeners.size(); i++)
|
for (size_t i = 0; i < s_vListeners.size(); i++)
|
||||||
{
|
{
|
||||||
auto pListener = s_vListeners[i];
|
auto pListener = s_vListeners[i];
|
||||||
// ¸üмàÌýÆ÷
|
// 清除已停止的监听器
|
||||||
if (pListener->m_bClear)
|
if (pListener->stopped)
|
||||||
{
|
{
|
||||||
pListener->release();
|
delete pListener;
|
||||||
s_vListeners.erase(s_vListeners.begin() + i);
|
s_vListeners.erase(s_vListeners.begin() + i);
|
||||||
}
|
}
|
||||||
else if (pListener->isRunning())
|
else
|
||||||
{
|
{
|
||||||
pListener->_update();
|
// 更新监听器
|
||||||
|
pListener->update();
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -67,15 +102,16 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider)
|
||||||
pPassiveNode->getParentScene() == pCurrentScene)
|
pPassiveNode->getParentScene() == pCurrentScene)
|
||||||
{
|
{
|
||||||
// 判断两物体是否是相互冲突的物体
|
// 判断两物体是否是相互冲突的物体
|
||||||
auto IsCollideWith = [](Node * active, unsigned int hash) -> bool
|
auto IsCollideWith = [](Node * active, Node * passive) -> bool
|
||||||
{
|
{
|
||||||
|
unsigned int hash = passive->getHashName();
|
||||||
FOR_LOOP(collider, active->m_vColliders)
|
FOR_LOOP(collider, active->m_vColliders)
|
||||||
if (collider == hash)
|
if (collider == hash)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (IsCollideWith(pActiveNode, pPassiveNode->getHashName()))
|
if (IsCollideWith(pActiveNode, pPassiveNode))
|
||||||
{
|
{
|
||||||
// 判断两碰撞体交集情况
|
// 判断两碰撞体交集情况
|
||||||
int relation = pActiveCollider->getRelationWith(pPassiveCollider);
|
int relation = pActiveCollider->getRelationWith(pPassiveCollider);
|
||||||
|
|
@ -97,47 +133,30 @@ void e2d::ColliderManager::__updateCollider(e2d::Collider * pActiveCollider)
|
||||||
s_pPassiveNode = nullptr;
|
s_pPassiveNode = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ColliderManager::__add(CollisionListener * pListener)
|
void e2d::ColliderManager::add(Function func, String name, bool paused)
|
||||||
{
|
{
|
||||||
WARN_IF(pListener == nullptr, "CollisionListener NULL pointer exception!");
|
auto listener = new Listener(func, name, paused);
|
||||||
|
s_vListeners.push_back(listener);
|
||||||
|
}
|
||||||
|
|
||||||
if (pListener)
|
void e2d::ColliderManager::pause(String name)
|
||||||
|
{
|
||||||
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
auto findListener = [](CollisionListener * pListener) -> bool
|
if (pListener->name == name)
|
||||||
{
|
{
|
||||||
FOR_LOOP(l, s_vListeners)
|
pListener->running = false;
|
||||||
{
|
|
||||||
if (pListener == l)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool bHasListener = findListener(pListener);
|
|
||||||
WARN_IF(bHasListener, "The CollisionListener is already added, cannot be added again!");
|
|
||||||
|
|
||||||
if (!bHasListener)
|
|
||||||
{
|
|
||||||
pListener->retain();
|
|
||||||
s_vListeners.push_back(pListener);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ColliderManager::add(Function func, String name)
|
void e2d::ColliderManager::resume(String name)
|
||||||
{
|
|
||||||
(new CollisionListener(func, name))->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::ColliderManager::start(String name)
|
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
if (pListener->name == name)
|
||||||
{
|
{
|
||||||
pListener->start();
|
pListener->running = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -146,29 +165,26 @@ void e2d::ColliderManager::stop(String name)
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
if (pListener->name == name)
|
||||||
{
|
{
|
||||||
pListener->stop();
|
pListener->stopped = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ColliderManager::clear(String name)
|
void e2d::ColliderManager::pauseAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
pListener->running = false;
|
||||||
{
|
|
||||||
pListener->stopAndClear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ColliderManager::startAll()
|
void e2d::ColliderManager::resumeAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
pListener->start();
|
pListener->running = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -176,36 +192,10 @@ void e2d::ColliderManager::stopAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
pListener->stop();
|
pListener->stopped = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::ColliderManager::clearAll()
|
|
||||||
{
|
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
|
||||||
{
|
|
||||||
pListener->stopAndClear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<e2d::CollisionListener*> e2d::ColliderManager::get(String name)
|
|
||||||
{
|
|
||||||
std::vector<CollisionListener*> vListeners;
|
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener->getName() == name)
|
|
||||||
{
|
|
||||||
vListeners.push_back(pListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return std::move(vListeners);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<e2d::CollisionListener*> e2d::ColliderManager::getAll()
|
|
||||||
{
|
|
||||||
return s_vListeners;
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::Node * e2d::ColliderManager::getActiveNode()
|
e2d::Node * e2d::ColliderManager::getActiveNode()
|
||||||
{
|
{
|
||||||
return s_pActiveNode;
|
return s_pActiveNode;
|
||||||
|
|
@ -268,7 +258,7 @@ void e2d::ColliderManager::__uninit()
|
||||||
{
|
{
|
||||||
FOR_LOOP(listener, s_vListeners)
|
FOR_LOOP(listener, s_vListeners)
|
||||||
{
|
{
|
||||||
SafeRelease(&listener);
|
delete listener;
|
||||||
}
|
}
|
||||||
s_vListeners.clear();
|
s_vListeners.clear();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,78 +1,66 @@
|
||||||
#include "..\e2dmanager.h"
|
#include "..\e2dmanager.h"
|
||||||
#include "..\e2dtool.h"
|
#include "..\e2dtool.h"
|
||||||
|
|
||||||
|
// 监听器
|
||||||
|
class Listener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Listener(
|
||||||
|
e2d::Function func,
|
||||||
|
e2d::String name,
|
||||||
|
bool paused
|
||||||
|
)
|
||||||
|
: name(name)
|
||||||
|
, callback(func)
|
||||||
|
, running(!paused)
|
||||||
|
, stopped(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新监听器状态
|
||||||
|
virtual void update()
|
||||||
|
{
|
||||||
|
if (callback)
|
||||||
|
{
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool running;
|
||||||
|
bool stopped;
|
||||||
|
e2d::String name;
|
||||||
|
e2d::Function callback;
|
||||||
|
};
|
||||||
|
|
||||||
// ¼àÌýÆ÷ÈÝÆ÷
|
// ¼àÌýÆ÷ÈÝÆ÷
|
||||||
static std::vector<e2d::InputListener*> s_vListeners;
|
static std::vector<Listener*> s_vListeners;
|
||||||
|
|
||||||
|
|
||||||
void e2d::InputManager::__update()
|
void e2d::InputManager::add(Function func, String name, bool paused)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < s_vListeners.size(); i++)
|
auto listener = new Listener(func, name, paused);
|
||||||
{
|
s_vListeners.push_back(listener);
|
||||||
auto pListener = s_vListeners[i];
|
|
||||||
// ¸üмàÌýÆ÷
|
|
||||||
if (pListener->m_bClear)
|
|
||||||
{
|
|
||||||
pListener->release();
|
|
||||||
s_vListeners.erase(s_vListeners.begin() + i);
|
|
||||||
}
|
|
||||||
else if (pListener->isRunning())
|
|
||||||
{
|
|
||||||
pListener->_update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::InputManager::__uninit()
|
void e2d::InputManager::pause(String name)
|
||||||
{
|
|
||||||
FOR_LOOP(listener, s_vListeners)
|
|
||||||
{
|
|
||||||
SafeRelease(&listener);
|
|
||||||
}
|
|
||||||
s_vListeners.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::InputManager::__add(InputListener * pListener)
|
|
||||||
{
|
|
||||||
WARN_IF(pListener == nullptr, "InputListener NULL pointer exception!");
|
|
||||||
|
|
||||||
if (pListener)
|
|
||||||
{
|
|
||||||
auto findListener = [](InputListener * pListener) -> bool
|
|
||||||
{
|
|
||||||
FOR_LOOP(l, s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener == l)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool bHasListener = findListener(pListener);
|
|
||||||
WARN_IF(bHasListener, "The InputListener is already added, cannot be added again!");
|
|
||||||
|
|
||||||
if (!bHasListener)
|
|
||||||
{
|
|
||||||
pListener->retain();
|
|
||||||
s_vListeners.push_back(pListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::InputManager::add(Function func, String name)
|
|
||||||
{
|
|
||||||
(new InputListener(func, name))->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::InputManager::start(String name)
|
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
if (pListener->name == name)
|
||||||
{
|
{
|
||||||
pListener->start();
|
pListener->running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::InputManager::resume(String name)
|
||||||
|
{
|
||||||
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->name == name)
|
||||||
|
{
|
||||||
|
pListener->running = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -81,29 +69,26 @@ void e2d::InputManager::stop(String name)
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
if (pListener->name == name)
|
||||||
{
|
{
|
||||||
pListener->stop();
|
pListener->stopped = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::InputManager::clear(String name)
|
void e2d::InputManager::pauseAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
pListener->running = false;
|
||||||
{
|
|
||||||
pListener->stopAndClear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::InputManager::startAll()
|
void e2d::InputManager::resumeAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
pListener->start();
|
pListener->running = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -111,32 +96,38 @@ void e2d::InputManager::stopAll()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
FOR_LOOP(pListener, s_vListeners)
|
||||||
{
|
{
|
||||||
pListener->stop();
|
pListener->stopped = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::InputManager::clearAll()
|
void e2d::InputManager::__update()
|
||||||
{
|
{
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
if (s_vListeners.empty() || Game::isPaused())
|
||||||
{
|
return;
|
||||||
pListener->stopAndClear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<e2d::InputListener*> e2d::InputManager::get(String name)
|
for (size_t i = 0; i < s_vListeners.size(); i++)
|
||||||
{
|
|
||||||
std::vector<InputListener*> vListeners;
|
|
||||||
FOR_LOOP(pListener, s_vListeners)
|
|
||||||
{
|
{
|
||||||
if (pListener->getName() == name)
|
auto pListener = s_vListeners[i];
|
||||||
|
// 清除已停止的监听器
|
||||||
|
if (pListener->stopped)
|
||||||
{
|
{
|
||||||
vListeners.push_back(pListener);
|
delete pListener;
|
||||||
|
s_vListeners.erase(s_vListeners.begin() + i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 更新监听器
|
||||||
|
pListener->update();
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return std::move(vListeners);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<e2d::InputListener*> e2d::InputManager::getAll()
|
void e2d::InputManager::__uninit()
|
||||||
{
|
{
|
||||||
return s_vListeners;
|
FOR_LOOP(listener, s_vListeners)
|
||||||
|
{
|
||||||
|
delete listener;
|
||||||
|
}
|
||||||
|
s_vListeners.clear();
|
||||||
}
|
}
|
||||||
|
|
@ -692,7 +692,7 @@ e2d::Scene * e2d::Node::getParentScene() const
|
||||||
return m_pParentScene;
|
return m_pParentScene;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<e2d::Node*> e2d::Node::getChildren(String name)
|
std::vector<e2d::Node*> e2d::Node::getChildren(String name) const
|
||||||
{
|
{
|
||||||
std::vector<Node*> vChildren;
|
std::vector<Node*> vChildren;
|
||||||
unsigned int hash = name.getHashCode();
|
unsigned int hash = name.getHashCode();
|
||||||
|
|
@ -708,7 +708,22 @@ std::vector<e2d::Node*> e2d::Node::getChildren(String name)
|
||||||
return std::move(vChildren);
|
return std::move(vChildren);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<e2d::Node*> e2d::Node::getChildren()
|
e2d::Node * e2d::Node::getChild(String name) const
|
||||||
|
{
|
||||||
|
unsigned int hash = name.getHashCode();
|
||||||
|
|
||||||
|
FOR_LOOP(child, m_vChildren)
|
||||||
|
{
|
||||||
|
// 不同的名称可能会有相同的 Hash 值,但是先比较 Hash 可以提升搜索速度
|
||||||
|
if (child->m_nHashName == hash && child->m_sName == name)
|
||||||
|
{
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::Node*> e2d::Node::getAllChildren() const
|
||||||
{
|
{
|
||||||
return m_vChildren;
|
return m_vChildren;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#include "..\..\e2dtool.h"
|
|
||||||
#include "..\..\e2dmanager.h"
|
|
||||||
|
|
||||||
e2d::CollisionListener::CollisionListener()
|
|
||||||
: Listener()
|
|
||||||
{
|
|
||||||
ColliderManager::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::CollisionListener::CollisionListener(Function func)
|
|
||||||
: Listener()
|
|
||||||
, m_callback(func)
|
|
||||||
{
|
|
||||||
ColliderManager::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::CollisionListener::CollisionListener(Function func, String name)
|
|
||||||
: Listener(name)
|
|
||||||
, m_callback(func)
|
|
||||||
{
|
|
||||||
ColliderManager::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::CollisionListener::_update()
|
|
||||||
{
|
|
||||||
if (m_callback)
|
|
||||||
{
|
|
||||||
m_callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
#include "..\..\e2dtool.h"
|
|
||||||
#include "..\..\e2dmanager.h"
|
|
||||||
|
|
||||||
e2d::InputListener::InputListener()
|
|
||||||
: Listener()
|
|
||||||
, m_callback(nullptr)
|
|
||||||
{
|
|
||||||
InputManager::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::InputListener::InputListener(Function func)
|
|
||||||
: Listener()
|
|
||||||
, m_callback(func)
|
|
||||||
{
|
|
||||||
InputManager::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::InputListener::InputListener(Function func, String name)
|
|
||||||
: Listener(name)
|
|
||||||
, m_callback(func)
|
|
||||||
{
|
|
||||||
InputManager::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::InputListener::setFunc(Function func)
|
|
||||||
{
|
|
||||||
m_callback = func;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::InputListener::_update()
|
|
||||||
{
|
|
||||||
if (m_callback)
|
|
||||||
{
|
|
||||||
m_callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
#include "..\..\e2dtool.h"
|
|
||||||
|
|
||||||
e2d::Listener::Listener()
|
|
||||||
: m_bRunning(false)
|
|
||||||
, m_bClear(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::Listener::Listener(String name)
|
|
||||||
: m_bRunning(false)
|
|
||||||
, m_sName(name)
|
|
||||||
, m_bClear(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Listener::start()
|
|
||||||
{
|
|
||||||
m_bRunning = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Listener::stop()
|
|
||||||
{
|
|
||||||
m_bRunning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Listener::stopAndClear()
|
|
||||||
{
|
|
||||||
m_bRunning = false;
|
|
||||||
m_bClear = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool e2d::Listener::isRunning()
|
|
||||||
{
|
|
||||||
return m_bRunning;
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::String e2d::Listener::getName()
|
|
||||||
{
|
|
||||||
return m_sName;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Listener::setName(String name)
|
|
||||||
{
|
|
||||||
m_sName = name;
|
|
||||||
}
|
|
||||||
|
|
@ -176,5 +176,9 @@ void e2d::Timer::__resetAll()
|
||||||
|
|
||||||
void e2d::Timer::__uninit()
|
void e2d::Timer::__uninit()
|
||||||
{
|
{
|
||||||
|
FOR_LOOP(timer, s_vTimers)
|
||||||
|
{
|
||||||
|
delete timer;
|
||||||
|
}
|
||||||
s_vTimers.clear();
|
s_vTimers.clear();
|
||||||
}
|
}
|
||||||
|
|
@ -116,12 +116,18 @@ class Time
|
||||||
friend Game;
|
friend Game;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 获取上一帧与当前帧的时间间隔(毫秒)
|
// 获取上一帧与当前帧的时间间隔(秒)
|
||||||
static int getDeltaTime();
|
static double getDeltaTime();
|
||||||
|
|
||||||
// 获取游戏开始时长(秒)
|
// 获取上一帧与当前帧的时间间隔(毫秒)
|
||||||
|
static unsigned int getDeltaTimeMilliseconds();
|
||||||
|
|
||||||
|
// 获取游戏总时长(秒)
|
||||||
static double getTotalTime();
|
static double getTotalTime();
|
||||||
|
|
||||||
|
// 获取游戏总时长(毫秒)
|
||||||
|
static unsigned int getTotalTimeMilliseconds();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// 初始化计时操作
|
// 初始化计时操作
|
||||||
static bool __init();
|
static bool __init();
|
||||||
|
|
|
||||||
|
|
@ -740,6 +740,19 @@ public:
|
||||||
Node * child
|
Node * child
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 获取所有名称相同的子节点
|
||||||
|
std::vector<Node*> get(
|
||||||
|
String name
|
||||||
|
) const;
|
||||||
|
|
||||||
|
// 获取名称相同的子节点
|
||||||
|
Node* getOne(
|
||||||
|
String name
|
||||||
|
) const;
|
||||||
|
|
||||||
|
// 获取所有子节点
|
||||||
|
std::vector<Node*> getAll() const;
|
||||||
|
|
||||||
// 获取根节点
|
// 获取根节点
|
||||||
Node * getRoot() const;
|
Node * getRoot() const;
|
||||||
|
|
||||||
|
|
@ -768,6 +781,13 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
template<typename Object>
|
template<typename Object>
|
||||||
inline void SafeRelease(Object** p) { if (*p) { (*p)->release(); *p = nullptr; } }
|
inline void SafeRelease(Object** p)
|
||||||
|
{
|
||||||
|
if (*p)
|
||||||
|
{
|
||||||
|
(*p)->release();
|
||||||
|
(*p) = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -14,8 +14,6 @@ class Action;
|
||||||
class Music;
|
class Music;
|
||||||
class Collider;
|
class Collider;
|
||||||
class Transition;
|
class Transition;
|
||||||
class InputListener;
|
|
||||||
class CollisionListener;
|
|
||||||
|
|
||||||
// 对象管理器
|
// 对象管理器
|
||||||
class ObjectManager
|
class ObjectManager
|
||||||
|
|
@ -232,17 +230,22 @@ class InputManager
|
||||||
{
|
{
|
||||||
friend Game;
|
friend Game;
|
||||||
friend Input;
|
friend Input;
|
||||||
friend InputListener;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 添加输入监听
|
// 添加输入监听
|
||||||
static void add(
|
static void add(
|
||||||
Function func, /* 监听到用户输入时的执行函数 */
|
Function func, /* 监听到用户输入时的执行函数 */
|
||||||
String name = L"" /* 监听器名称 */
|
String name = L"", /* 监听器名称 */
|
||||||
|
bool paused = false /* 是否暂停 */
|
||||||
);
|
);
|
||||||
|
|
||||||
// 启动输入监听
|
// 暂停输入监听
|
||||||
static void start(
|
static void pause(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 暂停输入监听
|
||||||
|
static void resume(
|
||||||
String name
|
String name
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -251,34 +254,16 @@ public:
|
||||||
String name
|
String name
|
||||||
);
|
);
|
||||||
|
|
||||||
// 清除输入监听
|
// 暂停所有监听器
|
||||||
static void clear(
|
static void pauseAll();
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启动所有监听器
|
// 继续所有监听器
|
||||||
static void startAll();
|
static void resumeAll();
|
||||||
|
|
||||||
// 停止所有监听器
|
// 停止所有监听器
|
||||||
static void stopAll();
|
static void stopAll();
|
||||||
|
|
||||||
// 清除所有监听器
|
|
||||||
static void clearAll();
|
|
||||||
|
|
||||||
// 获取监听器
|
|
||||||
static std::vector<InputListener*> get(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 获取全部监听器
|
|
||||||
static std::vector<InputListener*> getAll();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// 添加输入监听
|
|
||||||
static void __add(
|
|
||||||
InputListener * pListener
|
|
||||||
);
|
|
||||||
|
|
||||||
// 更新监听器
|
// 更新监听器
|
||||||
static void __update();
|
static void __update();
|
||||||
|
|
||||||
|
|
@ -293,7 +278,6 @@ class ColliderManager
|
||||||
friend Game;
|
friend Game;
|
||||||
friend Node;
|
friend Node;
|
||||||
friend Collider;
|
friend Collider;
|
||||||
friend CollisionListener;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 开启或关闭碰撞监听功能(默认关闭)
|
// 开启或关闭碰撞监听功能(默认关闭)
|
||||||
|
|
@ -304,11 +288,17 @@ public:
|
||||||
// 添加碰撞监听
|
// 添加碰撞监听
|
||||||
static void add(
|
static void add(
|
||||||
Function func, /* 监听到碰撞时的执行函数 */
|
Function func, /* 监听到碰撞时的执行函数 */
|
||||||
String name = L"" /* 监听器名称 */
|
String name = L"", /* 监听器名称 */
|
||||||
|
bool paused = false /* 是否暂停 */
|
||||||
);
|
);
|
||||||
|
|
||||||
// 启动碰撞监听
|
// 暂停碰撞监听
|
||||||
static void start(
|
static void pause(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 暂停碰撞监听
|
||||||
|
static void resume(
|
||||||
String name
|
String name
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -317,28 +307,15 @@ public:
|
||||||
String name
|
String name
|
||||||
);
|
);
|
||||||
|
|
||||||
// 清除碰撞监听
|
// 暂停所有监听器
|
||||||
static void clear(
|
static void pauseAll();
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启动所有监听器
|
// 继续所有监听器
|
||||||
static void startAll();
|
static void resumeAll();
|
||||||
|
|
||||||
// 停止所有监听器
|
// 停止所有监听器
|
||||||
static void stopAll();
|
static void stopAll();
|
||||||
|
|
||||||
// 清除所有监听器
|
|
||||||
static void clearAll();
|
|
||||||
|
|
||||||
// 获取监听器
|
|
||||||
static std::vector<CollisionListener*> get(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 获取全部监听器
|
|
||||||
static std::vector<CollisionListener*> getAll();
|
|
||||||
|
|
||||||
// 获取碰撞发生时的主动体
|
// 获取碰撞发生时的主动体
|
||||||
static Node * getActiveNode();
|
static Node * getActiveNode();
|
||||||
|
|
||||||
|
|
@ -356,11 +333,6 @@ public:
|
||||||
);
|
);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// 添加碰撞监听
|
|
||||||
static void __add(
|
|
||||||
CollisionListener * pListener
|
|
||||||
);
|
|
||||||
|
|
||||||
// 更新监听器
|
// 更新监听器
|
||||||
static void __update();
|
static void __update();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -131,10 +131,15 @@ public:
|
||||||
// 获取所有名称相同的子节点
|
// 获取所有名称相同的子节点
|
||||||
virtual std::vector<Node*> getChildren(
|
virtual std::vector<Node*> getChildren(
|
||||||
String name
|
String name
|
||||||
);
|
) const;
|
||||||
|
|
||||||
|
// 获取名称相同的子节点
|
||||||
|
virtual Node* getChild(
|
||||||
|
String name
|
||||||
|
) const;
|
||||||
|
|
||||||
// 获取所有子节点
|
// 获取所有子节点
|
||||||
virtual std::vector<Node*> getChildren();
|
virtual std::vector<Node*> getAllChildren() const;
|
||||||
|
|
||||||
// 获取子节点数量
|
// 获取子节点数量
|
||||||
virtual int getChildrenCount() const;
|
virtual int getChildrenCount() const;
|
||||||
|
|
|
||||||
101
core/e2dtool.h
101
core/e2dtool.h
|
|
@ -234,107 +234,6 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 监听器
|
|
||||||
class Listener
|
|
||||||
: public Object
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Listener();
|
|
||||||
|
|
||||||
Listener(
|
|
||||||
String name /* 监听器名称 */
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启动
|
|
||||||
virtual void start();
|
|
||||||
|
|
||||||
// 停止
|
|
||||||
virtual void stop();
|
|
||||||
|
|
||||||
// 停止并清除
|
|
||||||
virtual void stopAndClear();
|
|
||||||
|
|
||||||
// 获取运行状态
|
|
||||||
virtual bool isRunning();
|
|
||||||
|
|
||||||
// 获取名称
|
|
||||||
virtual String getName();
|
|
||||||
|
|
||||||
// 修改名称
|
|
||||||
virtual void setName(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 更新监听器状态
|
|
||||||
virtual void _update() = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
String m_sName;
|
|
||||||
bool m_bRunning;
|
|
||||||
bool m_bClear;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 输入监听器
|
|
||||||
class InputListener
|
|
||||||
: public Listener
|
|
||||||
{
|
|
||||||
friend InputManager;
|
|
||||||
|
|
||||||
public:
|
|
||||||
InputListener();
|
|
||||||
|
|
||||||
InputListener(
|
|
||||||
Function func /* 监听到用户输入时的执行函数 */
|
|
||||||
);
|
|
||||||
|
|
||||||
InputListener(
|
|
||||||
Function func, /* 监听到用户输入时的执行函数 */
|
|
||||||
String name /* 监听器名称 */
|
|
||||||
);
|
|
||||||
|
|
||||||
// 设置监听到用户输入时的执行函数
|
|
||||||
virtual void setFunc(
|
|
||||||
Function func
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 更新监听器状态
|
|
||||||
virtual void _update();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Function m_callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 碰撞监听器
|
|
||||||
class CollisionListener
|
|
||||||
: public Listener
|
|
||||||
{
|
|
||||||
friend ColliderManager;
|
|
||||||
|
|
||||||
public:
|
|
||||||
CollisionListener();
|
|
||||||
|
|
||||||
CollisionListener(
|
|
||||||
Function func /* 监听到用户输入时的执行函数 */
|
|
||||||
);
|
|
||||||
|
|
||||||
CollisionListener(
|
|
||||||
Function func, /* 监听到用户输入时的执行函数 */
|
|
||||||
String name /* 监听器名称 */
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 更新监听器状态
|
|
||||||
virtual void _update();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Function m_callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 数据管理工具
|
// 数据管理工具
|
||||||
class Data
|
class Data
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -249,9 +249,6 @@
|
||||||
<ClCompile Include="..\..\core\Node\Sprite.cpp" />
|
<ClCompile Include="..\..\core\Node\Sprite.cpp" />
|
||||||
<ClCompile Include="..\..\core\Node\Text.cpp" />
|
<ClCompile Include="..\..\core\Node\Text.cpp" />
|
||||||
<ClCompile Include="..\..\core\Tool\Data.cpp" />
|
<ClCompile Include="..\..\core\Tool\Data.cpp" />
|
||||||
<ClCompile Include="..\..\core\Tool\Listener\CollisionListener.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Tool\Listener\InputListener.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Tool\Listener\Listener.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Tool\Path.cpp" />
|
<ClCompile Include="..\..\core\Tool\Path.cpp" />
|
||||||
<ClCompile Include="..\..\core\Tool\Music.cpp" />
|
<ClCompile Include="..\..\core\Tool\Music.cpp" />
|
||||||
<ClCompile Include="..\..\core\Tool\Random.cpp" />
|
<ClCompile Include="..\..\core\Tool\Random.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,6 @@
|
||||||
<Filter Include="Node\Shape">
|
<Filter Include="Node\Shape">
|
||||||
<UniqueIdentifier>{eb72b49a-5b2f-4fc0-9ad2-8f5e02efac6f}</UniqueIdentifier>
|
<UniqueIdentifier>{eb72b49a-5b2f-4fc0-9ad2-8f5e02efac6f}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Tool\Listener">
|
|
||||||
<UniqueIdentifier>{d3968182-2399-40d4-8e39-accb4711018c}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Custom">
|
<Filter Include="Custom">
|
||||||
<UniqueIdentifier>{3475b59d-d50c-43b1-8334-bcb9e1703ed2}</UniqueIdentifier>
|
<UniqueIdentifier>{3475b59d-d50c-43b1-8334-bcb9e1703ed2}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
|
@ -207,15 +204,6 @@
|
||||||
<ClCompile Include="..\..\core\Node\Shape\Ellipse.cpp">
|
<ClCompile Include="..\..\core\Node\Shape\Ellipse.cpp">
|
||||||
<Filter>Node\Shape</Filter>
|
<Filter>Node\Shape</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Tool\Listener\CollisionListener.cpp">
|
|
||||||
<Filter>Tool\Listener</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Tool\Listener\InputListener.cpp">
|
|
||||||
<Filter>Tool\Listener</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Tool\Listener\Listener.cpp">
|
|
||||||
<Filter>Tool\Listener</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Custom\CustomTextRenderer.cpp">
|
<ClCompile Include="..\..\core\Custom\CustomTextRenderer.cpp">
|
||||||
<Filter>Custom</Filter>
|
<Filter>Custom</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue