update collision detection method
Using initializer_list to implement variable parameters. Add InputListener & CollisionListener.
This commit is contained in:
parent
e78f8795e7
commit
2daa4d49ad
|
|
@ -100,119 +100,3 @@ void e2d::Action::_resetTime()
|
||||||
{
|
{
|
||||||
m_fLast = Time::getTotalTime();
|
m_fLast = Time::getTotalTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::ActionMoveBy * e2d::action::MoveBy(double duration, Vector vector)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionMoveBy(duration, vector);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionMoveTo * e2d::action::MoveTo(double duration, Point pos)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionMoveTo(duration, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionScaleBy * e2d::action::ScaleBy(double duration, double scale)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionScaleBy(duration, scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionScaleBy * e2d::action::ScaleBy(double duration, double scaleX, double scaleY)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionScaleBy(duration, scaleX, scaleY);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionScaleTo * e2d::action::ScaleTo(double duration, double scale)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionScaleTo(duration, scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionScaleTo * e2d::action::ScaleTo(double duration, double scaleX, double scaleY)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionScaleTo(duration, scaleX, scaleY);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionOpacityBy * e2d::action::OpacityBy(double duration, double opacity)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionOpacityBy(duration, opacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionOpacityTo * e2d::action::OpacityTo(double duration, double opacity)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionOpacityTo(duration, opacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionFadeIn * e2d::action::FadeIn(double duration)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionFadeIn(duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionFadeOut * e2d::action::FadeOut(double duration)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionFadeOut(duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionRotateBy * e2d::action::RotateBy(double duration, double rotation)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionRotateBy(duration, rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionRotateTo * e2d::action::RotateTo(double duration, double rotation)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionRotateTo(duration, rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionTwo * e2d::action::Two(Action * pActionFirst, Action * pActionSecond, bool bAtSameTime)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionTwo(pActionFirst, pActionSecond, bAtSameTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionSequence * e2d::action::Sequence(int number, Action * action1, ...)
|
|
||||||
{
|
|
||||||
auto action = new (std::nothrow) ActionSequence();
|
|
||||||
if (action)
|
|
||||||
{
|
|
||||||
Action ** ppAction = &action1;
|
|
||||||
|
|
||||||
while (number > 0)
|
|
||||||
{
|
|
||||||
ASSERT((*ppAction) != nullptr, "ActionSequence NULL pointer exception!");
|
|
||||||
action->add(*ppAction);
|
|
||||||
ppAction++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return action;
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionDelay * e2d::action::Delay(double duration)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionDelay(duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionLoop * e2d::action::Loop(Action * action, int times)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionLoop(action, times);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::Animation * e2d::action::Animate(double interval, int number, Image * frame, ...)
|
|
||||||
{
|
|
||||||
auto animation = new (std::nothrow) Animation(interval);
|
|
||||||
if (animation)
|
|
||||||
{
|
|
||||||
Image ** ppImage = &frame;
|
|
||||||
|
|
||||||
while (number > 0)
|
|
||||||
{
|
|
||||||
ASSERT((*ppImage) != nullptr, "Animation NULL pointer exception!");
|
|
||||||
animation->addKeyframe(*ppImage);
|
|
||||||
ppImage++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return animation;
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::ActionFunc * e2d::action::Func(Function func)
|
|
||||||
{
|
|
||||||
return new (std::nothrow) ActionFunc(func);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,10 @@ e2d::ActionSequence::ActionSequence() :
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::ActionSequence::ActionSequence(int number, Action * action1, ...) :
|
e2d::ActionSequence::ActionSequence(std::initializer_list<Action*>& vActions) :
|
||||||
m_nActionIndex(0)
|
m_nActionIndex(0)
|
||||||
{
|
{
|
||||||
Action ** ppAction = &action1;
|
this->add(vActions);
|
||||||
|
|
||||||
while (number > 0)
|
|
||||||
{
|
|
||||||
ASSERT((*ppAction) != nullptr, "ActionSequence NULL pointer exception!");
|
|
||||||
this->add(*ppAction);
|
|
||||||
ppAction++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::ActionSequence::~ActionSequence()
|
e2d::ActionSequence::~ActionSequence()
|
||||||
|
|
@ -90,6 +82,14 @@ void e2d::ActionSequence::add(Action * action)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void e2d::ActionSequence::add(std::initializer_list<Action*>& vActions)
|
||||||
|
{
|
||||||
|
for (const auto &action : vActions)
|
||||||
|
{
|
||||||
|
this->add(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
e2d::ActionSequence * e2d::ActionSequence::clone() const
|
e2d::ActionSequence * e2d::ActionSequence::clone() const
|
||||||
{
|
{
|
||||||
auto a = new ActionSequence();
|
auto a = new ActionSequence();
|
||||||
|
|
|
||||||
|
|
@ -12,19 +12,9 @@ e2d::Animation::Animation(double interval)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Animation::Animation(int number, Image * frame, ...)
|
e2d::Animation::Animation(std::initializer_list<Image*>& vImages)
|
||||||
: m_nFrameIndex(0)
|
|
||||||
, m_fInterval(1)
|
|
||||||
{
|
{
|
||||||
Image ** ppImage = &frame;
|
this->add(vImages);
|
||||||
|
|
||||||
while (number > 0)
|
|
||||||
{
|
|
||||||
ASSERT((*ppImage) != nullptr, "Animation NULL pointer exception!");
|
|
||||||
this->addKeyframe(*ppImage);
|
|
||||||
ppImage++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Animation::~Animation()
|
e2d::Animation::~Animation()
|
||||||
|
|
@ -78,7 +68,7 @@ void e2d::Animation::reset()
|
||||||
m_nFrameIndex = 0;
|
m_nFrameIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Animation::addKeyframe(Image * frame)
|
void e2d::Animation::add(Image * frame)
|
||||||
{
|
{
|
||||||
if (frame)
|
if (frame)
|
||||||
{
|
{
|
||||||
|
|
@ -87,12 +77,20 @@ void e2d::Animation::addKeyframe(Image * frame)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void e2d::Animation::add(std::initializer_list<Image*>& vImages)
|
||||||
|
{
|
||||||
|
for (const auto &image : vImages)
|
||||||
|
{
|
||||||
|
this->add(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
e2d::Animation * e2d::Animation::clone() const
|
e2d::Animation * e2d::Animation::clone() const
|
||||||
{
|
{
|
||||||
auto a = new Animation(m_fInterval);
|
auto a = new Animation(m_fInterval);
|
||||||
for (auto frame : m_vFrames)
|
for (auto frame : m_vFrames)
|
||||||
{
|
{
|
||||||
a->addKeyframe(frame);
|
a->add(frame);
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
#include "..\ebase.h"
|
#include "..\ebase.h"
|
||||||
|
#include "..\etools.h"
|
||||||
|
#include "..\emanagers.h"
|
||||||
|
|
||||||
#pragma comment(lib, "dinput8.lib")
|
#pragma comment(lib, "dinput8.lib")
|
||||||
#pragma comment(lib, "dxguid.lib")
|
#pragma comment(lib, "dxguid.lib")
|
||||||
|
|
@ -15,9 +17,6 @@ static DIMOUSESTATE s_MouseState; //
|
||||||
static DIMOUSESTATE s_MouseRecordState; // 報炎佚連屈雫産喝
|
static DIMOUSESTATE s_MouseRecordState; // 報炎佚連屈雫産喝
|
||||||
static POINT s_MousePosition; // 報炎了崔贋刈潤更悶
|
static POINT s_MousePosition; // 報炎了崔贋刈潤更悶
|
||||||
|
|
||||||
// ¼àÌýÆ÷ÈÝÆ÷
|
|
||||||
static std::vector<Listener*> s_vListeners;
|
|
||||||
|
|
||||||
|
|
||||||
bool Input::__init()
|
bool Input::__init()
|
||||||
{
|
{
|
||||||
|
|
@ -100,21 +99,7 @@ void Input::__uninit()
|
||||||
void e2d::Input::__update()
|
void e2d::Input::__update()
|
||||||
{
|
{
|
||||||
Input::__updateDeviceState();
|
Input::__updateDeviceState();
|
||||||
|
InputManager::__update();
|
||||||
for (size_t i = 0; i < s_vListeners.size(); i++)
|
|
||||||
{
|
|
||||||
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 Input::__updateDeviceState()
|
void Input::__updateDeviceState()
|
||||||
|
|
@ -157,115 +142,6 @@ void Input::__updateDeviceState()
|
||||||
ScreenToClient(Window::getHWnd(), &s_MousePosition);
|
ScreenToClient(Window::getHWnd(), &s_MousePosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Input::__add(Listener * pListener)
|
|
||||||
{
|
|
||||||
WARN_IF(pListener == nullptr, "Listener NULL pointer exception!");
|
|
||||||
|
|
||||||
if (pListener)
|
|
||||||
{
|
|
||||||
auto findListener = [](Listener * pListener) -> bool
|
|
||||||
{
|
|
||||||
for (const auto &l : s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener == l)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool bHasListener = findListener(pListener);
|
|
||||||
WARN_IF(bHasListener, "The listener is already added, cannot be added again!");
|
|
||||||
|
|
||||||
if (!bHasListener)
|
|
||||||
{
|
|
||||||
pListener->retain();
|
|
||||||
s_vListeners.push_back(pListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::add(Function func, String name)
|
|
||||||
{
|
|
||||||
(new Listener(func, name))->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::start(String name)
|
|
||||||
{
|
|
||||||
for (const auto & pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener->getName() == name)
|
|
||||||
{
|
|
||||||
pListener->start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::stop(String name)
|
|
||||||
{
|
|
||||||
for (const auto & pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener->getName() == name)
|
|
||||||
{
|
|
||||||
pListener->stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::clear(String name)
|
|
||||||
{
|
|
||||||
for (const auto & pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener->getName() == name)
|
|
||||||
{
|
|
||||||
pListener->stopAndClear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::startAll()
|
|
||||||
{
|
|
||||||
for (const auto & pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
pListener->start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::stopAll()
|
|
||||||
{
|
|
||||||
for (const auto & pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
pListener->stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Input::clearAll()
|
|
||||||
{
|
|
||||||
for (const auto & pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
pListener->stopAndClear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Listener*> e2d::Input::get(String name)
|
|
||||||
{
|
|
||||||
std::vector<Listener*> vListeners;
|
|
||||||
for (auto pListener : s_vListeners)
|
|
||||||
{
|
|
||||||
if (pListener->getName() == name)
|
|
||||||
{
|
|
||||||
vListeners.push_back(pListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return std::move(vListeners);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Listener*> e2d::Input::getAll()
|
|
||||||
{
|
|
||||||
return s_vListeners;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Input::isKeyDown(int nKeyCode)
|
bool Input::isKeyDown(int nKeyCode)
|
||||||
{
|
{
|
||||||
if (s_KeyBuffer[nKeyCode] & 0x80)
|
if (s_KeyBuffer[nKeyCode] & 0x80)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
#include "..\ebase.h"
|
#include "..\ebase.h"
|
||||||
#include "..\enodes.h"
|
#include "..\enodes.h"
|
||||||
#include "..\emanagers.h"
|
#include "..\emanagers.h"
|
||||||
#include "..\etools.h"
|
|
||||||
#include "..\eactions.h"
|
|
||||||
|
|
||||||
e2d::Scene::Scene()
|
e2d::Scene::Scene()
|
||||||
: m_bWillSave(true)
|
: m_bWillSave(true)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,227 @@
|
||||||
|
#include "..\emanagers.h"
|
||||||
|
#include "..\enodes.h"
|
||||||
|
#include "..\eshape.h"
|
||||||
|
#include "..\etools.h"
|
||||||
|
|
||||||
|
// 形状集合
|
||||||
|
static std::vector<e2d::Shape*> s_vShapes;
|
||||||
|
// 监听器容器
|
||||||
|
static std::vector<e2d::CollisionListener*> s_vListeners;
|
||||||
|
// 碰撞触发状态
|
||||||
|
static bool s_bCollisionEnable = false;
|
||||||
|
|
||||||
|
|
||||||
|
void e2d::CollisionManager::setEnable(bool bEnable)
|
||||||
|
{
|
||||||
|
s_bCollisionEnable = bEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::__update()
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < s_vListeners.size(); i++)
|
||||||
|
{
|
||||||
|
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::CollisionManager::__updateShape(e2d::Shape * pActiveShape)
|
||||||
|
{
|
||||||
|
// 判断碰撞触发是否打开
|
||||||
|
if (!s_bCollisionEnable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Node* pActiveNode = pActiveShape->m_pParentNode;
|
||||||
|
if (pActiveNode)
|
||||||
|
{
|
||||||
|
// 获取节点所在场景
|
||||||
|
Scene* pCurrentScene = pActiveNode->getParentScene();
|
||||||
|
|
||||||
|
// 判断与其他形状的交集情况
|
||||||
|
for (size_t i = 0; i < s_vShapes.size(); i++)
|
||||||
|
{
|
||||||
|
auto pPassiveShape = s_vShapes[i];
|
||||||
|
// 判断两个形状是否是同一个对象
|
||||||
|
if (pActiveShape == pPassiveShape)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 获取被碰撞节点
|
||||||
|
Node* pPassiveNode = pPassiveShape->m_pParentNode;
|
||||||
|
// 判断两节点是否处于同一场景中
|
||||||
|
if (pPassiveNode &&
|
||||||
|
pPassiveNode->getParentScene() == pCurrentScene)
|
||||||
|
{
|
||||||
|
// 判断两物体是否是相互冲突的物体
|
||||||
|
auto IsCollideWith = [](Node * active, unsigned int hash)
|
||||||
|
{
|
||||||
|
for (auto collider : active->m_vColliders)
|
||||||
|
if (collider == hash)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (IsCollideWith(pActiveNode, pPassiveNode->getHashName()))
|
||||||
|
{
|
||||||
|
// 判断两形状交集情况
|
||||||
|
int relation = pActiveShape->getRelationWith(pPassiveShape);
|
||||||
|
// 忽略 UNKNOWN 和 DISJOINT 情况
|
||||||
|
if (relation != Relation::UNKNOWN && relation != Relation::DISJOINT)
|
||||||
|
{
|
||||||
|
pActiveNode->onCollide(pPassiveNode, relation);
|
||||||
|
pPassiveNode->onCollide(pActiveNode, pPassiveShape->getRelationWith(pActiveShape));
|
||||||
|
pCurrentScene->onCollide(pActiveNode, pPassiveNode);
|
||||||
|
CollisionManager::__update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::__add(CollisionListener * pListener)
|
||||||
|
{
|
||||||
|
WARN_IF(pListener == nullptr, "CollisionListener NULL pointer exception!");
|
||||||
|
|
||||||
|
if (pListener)
|
||||||
|
{
|
||||||
|
auto findListener = [](CollisionListener * pListener) -> bool
|
||||||
|
{
|
||||||
|
for (const auto &l : s_vListeners)
|
||||||
|
{
|
||||||
|
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::CollisionManager::add(Function func, String name)
|
||||||
|
{
|
||||||
|
(new CollisionListener(func, name))->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::start(String name)
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
pListener->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::stop(String name)
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
pListener->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::clear(String name)
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
pListener->stopAndClear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::startAll()
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
pListener->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::stopAll()
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
pListener->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::clearAll()
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
pListener->stopAndClear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::CollisionListener*> e2d::CollisionManager::get(String name)
|
||||||
|
{
|
||||||
|
std::vector<CollisionListener*> vListeners;
|
||||||
|
for (auto pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
vListeners.push_back(pListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return std::move(vListeners);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::CollisionListener*> e2d::CollisionManager::getAll()
|
||||||
|
{
|
||||||
|
return s_vListeners;
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::__addShape(Shape * pShape)
|
||||||
|
{
|
||||||
|
if (pShape)
|
||||||
|
{
|
||||||
|
if (pShape->m_pParentNode)
|
||||||
|
{
|
||||||
|
WARN_IF(true, "CollisionManager::__add Failed! The shape is already added.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pShape->retain();
|
||||||
|
s_vShapes.push_back(pShape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionManager::__removeShape(Shape * pShape)
|
||||||
|
{
|
||||||
|
if (pShape)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < s_vShapes.size(); i++)
|
||||||
|
{
|
||||||
|
if (s_vShapes[i] == pShape)
|
||||||
|
{
|
||||||
|
SafeRelease(&pShape);
|
||||||
|
s_vShapes.erase(s_vShapes.begin() + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
#include "..\emanagers.h"
|
||||||
|
#include "..\etools.h"
|
||||||
|
|
||||||
|
// ¼àÌýÆ÷ÈÝÆ÷
|
||||||
|
static std::vector<e2d::InputListener*> s_vListeners;
|
||||||
|
|
||||||
|
|
||||||
|
void e2d::InputManager::__update()
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < s_vListeners.size(); i++)
|
||||||
|
{
|
||||||
|
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::__add(InputListener * pListener)
|
||||||
|
{
|
||||||
|
WARN_IF(pListener == nullptr, "InputListener NULL pointer exception!");
|
||||||
|
|
||||||
|
if (pListener)
|
||||||
|
{
|
||||||
|
auto findListener = [](InputListener * pListener) -> bool
|
||||||
|
{
|
||||||
|
for (const auto &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 (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
pListener->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::InputManager::stop(String name)
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
pListener->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::InputManager::clear(String name)
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
pListener->stopAndClear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::InputManager::startAll()
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
pListener->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::InputManager::stopAll()
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
pListener->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::InputManager::clearAll()
|
||||||
|
{
|
||||||
|
for (const auto & pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
pListener->stopAndClear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::InputListener*> e2d::InputManager::get(String name)
|
||||||
|
{
|
||||||
|
std::vector<InputListener*> vListeners;
|
||||||
|
for (auto pListener : s_vListeners)
|
||||||
|
{
|
||||||
|
if (pListener->getName() == name)
|
||||||
|
{
|
||||||
|
vListeners.push_back(pListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return std::move(vListeners);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<e2d::InputListener*> e2d::InputManager::getAll()
|
||||||
|
{
|
||||||
|
return s_vListeners;
|
||||||
|
}
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
#include "..\emanagers.h"
|
|
||||||
#include "..\enodes.h"
|
|
||||||
#include "..\eshape.h"
|
|
||||||
|
|
||||||
// 形状集合
|
|
||||||
static std::vector<e2d::Shape*> s_vShapes;
|
|
||||||
// 碰撞触发状态
|
|
||||||
static bool s_bCollisionEnable = false;
|
|
||||||
|
|
||||||
|
|
||||||
void e2d::ShapeManager::setCollisionEnable(bool bEnable)
|
|
||||||
{
|
|
||||||
s_bCollisionEnable = bEnable;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::ShapeManager::__updateShape(e2d::Shape * pActiveShape)
|
|
||||||
{
|
|
||||||
// 判断碰撞触发是否打开
|
|
||||||
if (!s_bCollisionEnable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Node* pActiveNode = pActiveShape->m_pParentNode;
|
|
||||||
if (pActiveNode)
|
|
||||||
{
|
|
||||||
// 获取节点所在场景
|
|
||||||
Scene* pCurrentScene = pActiveNode->getParentScene();
|
|
||||||
|
|
||||||
// 判断与其他形状的交集情况
|
|
||||||
for (size_t i = 0; i < s_vShapes.size(); i++)
|
|
||||||
{
|
|
||||||
auto pPassiveShape = s_vShapes[i];
|
|
||||||
// 判断两个形状是否是同一个对象
|
|
||||||
if (pActiveShape == pPassiveShape)
|
|
||||||
return;
|
|
||||||
// 判断两物体是否是相互冲突的物体
|
|
||||||
if (pActiveShape->m_nCollisionBitmask & pPassiveShape->m_nCategoryBitmask)
|
|
||||||
{
|
|
||||||
// 获取被碰撞节点
|
|
||||||
Node* pPassiveNode = pPassiveShape->m_pParentNode;
|
|
||||||
// 判断两节点是否处于同一场景中
|
|
||||||
if (pPassiveNode &&
|
|
||||||
pPassiveNode->getParentScene() == pCurrentScene)
|
|
||||||
{
|
|
||||||
// 判断两形状交集情况
|
|
||||||
int relation = pActiveShape->getRelationWith(pPassiveShape);
|
|
||||||
// 忽略 UNKNOWN 和 DISJOINT 情况
|
|
||||||
if (relation != Relation::UNKNOWN && relation != Relation::DISJOINT)
|
|
||||||
{
|
|
||||||
pActiveNode->onCollide(pPassiveNode, relation);
|
|
||||||
pPassiveNode->onCollide(pActiveNode, pPassiveShape->getRelationWith(pActiveShape));
|
|
||||||
pCurrentScene->onCollide(pActiveNode, pPassiveNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::ShapeManager::__add(Shape * pShape)
|
|
||||||
{
|
|
||||||
if (pShape)
|
|
||||||
{
|
|
||||||
if (pShape->m_pParentNode)
|
|
||||||
{
|
|
||||||
WARN_IF(true, "ShapeManager::__add Failed! The shape is already added.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pShape->retain();
|
|
||||||
s_vShapes.push_back(pShape);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::ShapeManager::__remove(Shape * pShape)
|
|
||||||
{
|
|
||||||
if (pShape)
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < s_vShapes.size(); i++)
|
|
||||||
{
|
|
||||||
if (s_vShapes[i] == pShape)
|
|
||||||
{
|
|
||||||
SafeRelease(&pShape);
|
|
||||||
s_vShapes.erase(s_vShapes.begin() + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -27,7 +27,7 @@ e2d::Button::Button(Node * normal, Function func)
|
||||||
, m_pDisabled(nullptr)
|
, m_pDisabled(nullptr)
|
||||||
{
|
{
|
||||||
this->setNormal(normal);
|
this->setNormal(normal);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Button::Button(Node * normal, Node * selected, Function func)
|
e2d::Button::Button(Node * normal, Node * selected, Function func)
|
||||||
|
|
@ -42,7 +42,7 @@ e2d::Button::Button(Node * normal, Node * selected, Function func)
|
||||||
{
|
{
|
||||||
this->setNormal(normal);
|
this->setNormal(normal);
|
||||||
this->setSelected(selected);
|
this->setSelected(selected);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Function func)
|
e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Function func)
|
||||||
|
|
@ -58,7 +58,7 @@ e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Function f
|
||||||
this->setNormal(normal);
|
this->setNormal(normal);
|
||||||
this->setMouseOver(mouseover);
|
this->setMouseOver(mouseover);
|
||||||
this->setSelected(selected);
|
this->setSelected(selected);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Node * disabled, Function func)
|
e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Node * disabled, Function func)
|
||||||
|
|
@ -75,7 +75,7 @@ e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Node * dis
|
||||||
this->setMouseOver(mouseover);
|
this->setMouseOver(mouseover);
|
||||||
this->setSelected(selected);
|
this->setSelected(selected);
|
||||||
this->setDisabled(disabled);
|
this->setDisabled(disabled);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool e2d::Button::isEnable() const
|
bool e2d::Button::isEnable() const
|
||||||
|
|
@ -170,7 +170,7 @@ void e2d::Button::setEnable(bool bEnable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Button::setFunction(Function func)
|
void e2d::Button::setClickFunc(Function func)
|
||||||
{
|
{
|
||||||
WARN_IF(m_pNormal == nullptr, "Button cannot work without anything to show. Please set its normal displayed.");
|
WARN_IF(m_pNormal == nullptr, "Button cannot work without anything to show. Please set its normal displayed.");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, F
|
||||||
{
|
{
|
||||||
this->setNormal(toggleOnNormal);
|
this->setNormal(toggleOnNormal);
|
||||||
this->setNormalOff(toggleOffNormal);
|
this->setNormalOff(toggleOffNormal);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnSelected, Node * toggleOffSelected, Function func)
|
e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnSelected, Node * toggleOffSelected, Function func)
|
||||||
|
|
@ -47,7 +47,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, N
|
||||||
this->setNormalOff(toggleOffNormal);
|
this->setNormalOff(toggleOffNormal);
|
||||||
this->setSelected(toggleOnSelected);
|
this->setSelected(toggleOnSelected);
|
||||||
this->setSelectedOff(toggleOffSelected);
|
this->setSelectedOff(toggleOffSelected);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnMouseOver, Node * toggleOffMouseOver, Node * toggleOnSelected, Node * toggleOffSelected, Function func)
|
e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnMouseOver, Node * toggleOffMouseOver, Node * toggleOnSelected, Node * toggleOffSelected, Function func)
|
||||||
|
|
@ -68,7 +68,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, N
|
||||||
this->setMouseOverOff(toggleOffMouseOver);
|
this->setMouseOverOff(toggleOffMouseOver);
|
||||||
this->setSelected(toggleOnSelected);
|
this->setSelected(toggleOnSelected);
|
||||||
this->setSelectedOff(toggleOffSelected);
|
this->setSelectedOff(toggleOffSelected);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnMouseOver, Node * toggleOffMouseOver, Node * toggleOnSelected, Node * toggleOffSelected, Node * toggleOnDisabled, Node * toggleOffDisabled, Function func)
|
e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnMouseOver, Node * toggleOffMouseOver, Node * toggleOnSelected, Node * toggleOffSelected, Node * toggleOnDisabled, Node * toggleOffDisabled, Function func)
|
||||||
|
|
@ -91,7 +91,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, N
|
||||||
this->setSelectedOff(toggleOffSelected);
|
this->setSelectedOff(toggleOffSelected);
|
||||||
this->setDisabled(toggleOnDisabled);
|
this->setDisabled(toggleOnDisabled);
|
||||||
this->setDisabledOff(toggleOffDisabled);
|
this->setDisabledOff(toggleOffDisabled);
|
||||||
this->setFunction(func);
|
this->setClickFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool e2d::ButtonToggle::getState() const
|
bool e2d::ButtonToggle::getState() const
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ e2d::Node::Node()
|
||||||
e2d::Node::~Node()
|
e2d::Node::~Node()
|
||||||
{
|
{
|
||||||
ActionManager::__clearAllBindedWith(this);
|
ActionManager::__clearAllBindedWith(this);
|
||||||
ShapeManager::__remove(m_pShape);
|
CollisionManager::__removeShape(m_pShape);
|
||||||
for (auto child : m_vChildren)
|
for (auto child : m_vChildren)
|
||||||
{
|
{
|
||||||
SafeRelease(&child);
|
SafeRelease(&child);
|
||||||
|
|
@ -288,6 +288,11 @@ e2d::String e2d::Node::getName() const
|
||||||
return m_sName;
|
return m_sName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int e2d::Node::getHashName() const
|
||||||
|
{
|
||||||
|
return m_nHashName;
|
||||||
|
}
|
||||||
|
|
||||||
double e2d::Node::getPosX() const
|
double e2d::Node::getPosX() const
|
||||||
{
|
{
|
||||||
return m_fPosX;
|
return m_fPosX;
|
||||||
|
|
@ -575,9 +580,9 @@ void e2d::Node::setShape(Shape::TYPE type)
|
||||||
void e2d::Node::setShape(Shape * pShape)
|
void e2d::Node::setShape(Shape * pShape)
|
||||||
{
|
{
|
||||||
// 删除旧的形状
|
// 删除旧的形状
|
||||||
ShapeManager::__remove(m_pShape);
|
CollisionManager::__removeShape(m_pShape);
|
||||||
// 添加新的形状
|
// 添加新的形状
|
||||||
ShapeManager::__add(pShape);
|
CollisionManager::__addShape(pShape);
|
||||||
|
|
||||||
if (pShape)
|
if (pShape)
|
||||||
{
|
{
|
||||||
|
|
@ -591,6 +596,26 @@ void e2d::Node::setShape(Shape * pShape)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void e2d::Node::addCollider(String collliderName)
|
||||||
|
{
|
||||||
|
unsigned int hash = collliderName.getHashCode();
|
||||||
|
m_vColliders.insert(hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Node::addCollider(std::initializer_list<String>& vCollliderName)
|
||||||
|
{
|
||||||
|
for (const auto &name : vCollliderName)
|
||||||
|
{
|
||||||
|
this->addCollider(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Node::removeCollider(String collliderName)
|
||||||
|
{
|
||||||
|
unsigned int hash = collliderName.getHashCode();
|
||||||
|
m_vColliders.erase(hash);
|
||||||
|
}
|
||||||
|
|
||||||
void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
||||||
{
|
{
|
||||||
WARN_IF(child == nullptr, "Node::addChild NULL pointer exception.");
|
WARN_IF(child == nullptr, "Node::addChild NULL pointer exception.");
|
||||||
|
|
@ -631,6 +656,14 @@ void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void e2d::Node::addChild(std::initializer_list<Node*>& vNodes, int order)
|
||||||
|
{
|
||||||
|
for (const auto &node : vNodes)
|
||||||
|
{
|
||||||
|
this->addChild(node, order);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
e2d::Node * e2d::Node::getParent() const
|
e2d::Node * e2d::Node::getParent() const
|
||||||
{
|
{
|
||||||
return m_pParent;
|
return m_pParent;
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,7 @@
|
||||||
#include "..\enodes.h"
|
#include "..\enodes.h"
|
||||||
|
|
||||||
e2d::Shape::Shape()
|
e2d::Shape::Shape()
|
||||||
: m_nCategoryBitmask(0)
|
: m_bIsVisiable(true)
|
||||||
, m_nCollisionBitmask(0)
|
|
||||||
, m_bIsVisiable(true)
|
|
||||||
, m_nColor(Color::RED)
|
, m_nColor(Color::RED)
|
||||||
, m_fOpacity(1)
|
, m_fOpacity(1)
|
||||||
, m_pParentNode(nullptr)
|
, m_pParentNode(nullptr)
|
||||||
|
|
@ -25,26 +23,6 @@ e2d::Node * e2d::Shape::getParentNode() const
|
||||||
return m_pParentNode;
|
return m_pParentNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 e2d::Shape::getCategoryBitmask() const
|
|
||||||
{
|
|
||||||
return m_nCategoryBitmask;
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT32 e2d::Shape::getCollisionBitmask() const
|
|
||||||
{
|
|
||||||
return m_nCollisionBitmask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Shape::setCategoryBitmask(UINT32 mask)
|
|
||||||
{
|
|
||||||
m_nCategoryBitmask = mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Shape::setCollisionBitmask(UINT32 mask)
|
|
||||||
{
|
|
||||||
m_nCollisionBitmask = mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Shape::setEnable(bool bEnable)
|
void e2d::Shape::setEnable(bool bEnable)
|
||||||
{
|
{
|
||||||
m_bEnable = bEnable;
|
m_bEnable = bEnable;
|
||||||
|
|
@ -126,6 +104,6 @@ void e2d::Shape::_transform()
|
||||||
&m_pTransformedShape
|
&m_pTransformedShape
|
||||||
);
|
);
|
||||||
|
|
||||||
ShapeManager::__updateShape(this);
|
CollisionManager::__updateShape(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include "..\etools.h"
|
||||||
|
#include "..\emanagers.h"
|
||||||
|
|
||||||
|
e2d::CollisionListener::CollisionListener()
|
||||||
|
: Listener()
|
||||||
|
{
|
||||||
|
CollisionManager::__add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
e2d::CollisionListener::CollisionListener(Function func)
|
||||||
|
: Listener()
|
||||||
|
, m_callback(func)
|
||||||
|
{
|
||||||
|
CollisionManager::__add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
e2d::CollisionListener::CollisionListener(Function func, String name)
|
||||||
|
: Listener(name)
|
||||||
|
, m_callback(func)
|
||||||
|
{
|
||||||
|
CollisionManager::__add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::CollisionListener::_update()
|
||||||
|
{
|
||||||
|
if (m_callback)
|
||||||
|
{
|
||||||
|
m_callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include "..\etools.h"
|
||||||
|
#include "..\emanagers.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,29 +1,16 @@
|
||||||
#include "..\ecommon.h"
|
#include "..\etools.h"
|
||||||
#include "..\ebase.h"
|
|
||||||
|
|
||||||
e2d::Listener::Listener()
|
e2d::Listener::Listener()
|
||||||
: m_bRunning(false)
|
: m_bRunning(false)
|
||||||
, m_callback(nullptr)
|
|
||||||
, m_bClear(false)
|
, m_bClear(false)
|
||||||
{
|
{
|
||||||
Input::__add(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Listener::Listener(Function func)
|
e2d::Listener::Listener(String name)
|
||||||
: m_bRunning(false)
|
|
||||||
, m_callback(func)
|
|
||||||
, m_bClear(false)
|
|
||||||
{
|
|
||||||
Input::__add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::Listener::Listener(Function func, String name)
|
|
||||||
: m_bRunning(false)
|
: m_bRunning(false)
|
||||||
, m_sName(name)
|
, m_sName(name)
|
||||||
, m_callback(func)
|
|
||||||
, m_bClear(false)
|
, m_bClear(false)
|
||||||
{
|
{
|
||||||
Input::__add(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Listener::start()
|
void e2d::Listener::start()
|
||||||
|
|
@ -56,16 +43,3 @@ void e2d::Listener::setName(String name)
|
||||||
{
|
{
|
||||||
m_sName = name;
|
m_sName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Listener::setFunction(Function func)
|
|
||||||
{
|
|
||||||
m_callback = func;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Listener::update()
|
|
||||||
{
|
|
||||||
if (m_callback)
|
|
||||||
{
|
|
||||||
m_callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -14,7 +14,7 @@ e2d::Timer::Timer(Function func, String name, double interval /* = 0 */, int upd
|
||||||
, m_bClear(true)
|
, m_bClear(true)
|
||||||
{
|
{
|
||||||
this->setName(name);
|
this->setName(name);
|
||||||
this->setFunction(func);
|
this->setFunc(func);
|
||||||
this->setUpdateTimes(updateTimes);
|
this->setUpdateTimes(updateTimes);
|
||||||
this->setInterval(interval);
|
this->setInterval(interval);
|
||||||
m_bAutoRelease = autoRelease;
|
m_bAutoRelease = autoRelease;
|
||||||
|
|
@ -59,7 +59,7 @@ void e2d::Timer::setInterval(double interval)
|
||||||
m_fInterval = max(interval, 0);
|
m_fInterval = max(interval, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Timer::setFunction(Function func)
|
void e2d::Timer::setFunc(Function func)
|
||||||
{
|
{
|
||||||
m_Callback = func;
|
m_Callback = func;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
132
core/eactions.h
132
core/eactions.h
|
|
@ -402,16 +402,19 @@ public:
|
||||||
|
|
||||||
// 创建顺序动作
|
// 创建顺序动作
|
||||||
ActionSequence(
|
ActionSequence(
|
||||||
int number, /* 顺序动作数量 */
|
std::initializer_list<Action*>& vActions /* 动作数组 */
|
||||||
Action * action, /* 第一个动作 */
|
|
||||||
...
|
|
||||||
);
|
);
|
||||||
|
|
||||||
virtual ~ActionSequence();
|
virtual ~ActionSequence();
|
||||||
|
|
||||||
// 向顺序动作中添加动作
|
// 在结尾添加动作
|
||||||
void add(
|
void add(
|
||||||
Action * action /* 将动作添加至顺序动作尾部 */
|
Action * action
|
||||||
|
);
|
||||||
|
|
||||||
|
// 在结尾添加多个动作
|
||||||
|
void add(
|
||||||
|
std::initializer_list<Action*>& vActions /* 动作数组 */
|
||||||
);
|
);
|
||||||
|
|
||||||
// 获取该动作的拷贝对象
|
// 获取该动作的拷贝对象
|
||||||
|
|
@ -514,18 +517,21 @@ public:
|
||||||
|
|
||||||
// 创建帧动画
|
// 创建帧动画
|
||||||
Animation(
|
Animation(
|
||||||
int number, /* 帧数量 */
|
std::initializer_list<Image*>& vImages
|
||||||
Image * frame, /* 第一帧 */
|
|
||||||
...
|
|
||||||
);
|
);
|
||||||
|
|
||||||
virtual ~Animation();
|
virtual ~Animation();
|
||||||
|
|
||||||
// 添加关键帧
|
// 添加关键帧
|
||||||
void addKeyframe(
|
void add(
|
||||||
Image * frame /* 关键帧 */
|
Image * frame /* 关键帧 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 添加多个关键帧
|
||||||
|
void add(
|
||||||
|
std::initializer_list<Image*>& vImages /* 关键帧数组 */
|
||||||
|
);
|
||||||
|
|
||||||
// 设置每一帧的时间间隔
|
// 设置每一帧的时间间隔
|
||||||
void setInterval(
|
void setInterval(
|
||||||
double interval /* 帧间隔(秒) */
|
double interval /* 帧间隔(秒) */
|
||||||
|
|
@ -664,9 +670,7 @@ namespace e2d
|
||||||
|
|
||||||
// 创建顺序动作
|
// 创建顺序动作
|
||||||
ActionSequence* Sequence(
|
ActionSequence* Sequence(
|
||||||
int number, /* 顺序动作数量 */
|
std::initializer_list<Action*>& vActions /* 动作数组 */
|
||||||
Action * action1, /* 第一个动作 */
|
|
||||||
...
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// 创建延时动作
|
// 创建延时动作
|
||||||
|
|
@ -683,9 +687,7 @@ namespace e2d
|
||||||
// 创建特定帧间隔的帧动画
|
// 创建特定帧间隔的帧动画
|
||||||
Animation* Animate(
|
Animation* Animate(
|
||||||
double interval, /* 帧间隔(秒) */
|
double interval, /* 帧间隔(秒) */
|
||||||
int number, /* 帧数量 */
|
std::initializer_list<Image*>& vFrames /* 关键帧数组 */
|
||||||
Image * frame, /* 第一帧 */
|
|
||||||
...
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// 创建执行函数对象的动作
|
// 创建执行函数对象的动作
|
||||||
|
|
@ -693,4 +695,104 @@ namespace e2d
|
||||||
Function func /* 函数对象 */
|
Function func /* 函数对象 */
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionMoveBy * e2d::action::MoveBy(double duration, Vector vector)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionMoveBy(duration, vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionMoveTo * e2d::action::MoveTo(double duration, Point pos)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionMoveTo(duration, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionScaleBy * e2d::action::ScaleBy(double duration, double scale)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionScaleBy(duration, scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionScaleBy * e2d::action::ScaleBy(double duration, double scaleX, double scaleY)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionScaleBy(duration, scaleX, scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionScaleTo * e2d::action::ScaleTo(double duration, double scale)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionScaleTo(duration, scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionScaleTo * e2d::action::ScaleTo(double duration, double scaleX, double scaleY)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionScaleTo(duration, scaleX, scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionOpacityBy * e2d::action::OpacityBy(double duration, double opacity)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionOpacityBy(duration, opacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionOpacityTo * e2d::action::OpacityTo(double duration, double opacity)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionOpacityTo(duration, opacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionFadeIn * e2d::action::FadeIn(double duration)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionFadeIn(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionFadeOut * e2d::action::FadeOut(double duration)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionFadeOut(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionRotateBy * e2d::action::RotateBy(double duration, double rotation)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionRotateBy(duration, rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionRotateTo * e2d::action::RotateTo(double duration, double rotation)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionRotateTo(duration, rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionTwo * e2d::action::Two(Action * pActionFirst, Action * pActionSecond, bool bAtSameTime)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionTwo(pActionFirst, pActionSecond, bAtSameTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionSequence * e2d::action::Sequence(std::initializer_list<Action*>& vActions)
|
||||||
|
{
|
||||||
|
auto action = new (std::nothrow) ActionSequence();
|
||||||
|
if (action)
|
||||||
|
{
|
||||||
|
action->add(vActions);
|
||||||
|
}
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionDelay * e2d::action::Delay(double duration)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionDelay(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionLoop * e2d::action::Loop(Action * action, int times)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionLoop(action, times);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::Animation * e2d::action::Animate(double interval, std::initializer_list<Image*>& vFrames)
|
||||||
|
{
|
||||||
|
auto animation = new (std::nothrow) Animation(interval);
|
||||||
|
if (animation)
|
||||||
|
{
|
||||||
|
animation->add(vFrames);
|
||||||
|
}
|
||||||
|
return animation;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline e2d::ActionFunc * e2d::action::Func(Function func)
|
||||||
|
{
|
||||||
|
return new (std::nothrow) ActionFunc(func);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
44
core/ebase.h
44
core/ebase.h
|
|
@ -148,47 +148,8 @@ private:
|
||||||
class Input
|
class Input
|
||||||
{
|
{
|
||||||
friend Game;
|
friend Game;
|
||||||
friend Listener;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 添加输入监听
|
|
||||||
static void add(
|
|
||||||
Function func, /* 监听到消息时的执行函数 */
|
|
||||||
String name = L"" /* 监听器名称 */
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启动输入监听
|
|
||||||
static void start(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 停止输入监听
|
|
||||||
static void stop(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 清除输入监听
|
|
||||||
static void clear(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启动所有监听器
|
|
||||||
static void startAll();
|
|
||||||
|
|
||||||
// 停止所有监听器
|
|
||||||
static void stopAll();
|
|
||||||
|
|
||||||
// 清除所有监听器
|
|
||||||
static void clearAll();
|
|
||||||
|
|
||||||
// 获取监听器
|
|
||||||
static std::vector<Listener*> get(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 获取全部监听器
|
|
||||||
static std::vector<Listener*> getAll();
|
|
||||||
|
|
||||||
// 检测键盘某按键是否正被按下
|
// 检测键盘某按键是否正被按下
|
||||||
static bool isKeyDown(
|
static bool isKeyDown(
|
||||||
int nKeyCode
|
int nKeyCode
|
||||||
|
|
@ -259,11 +220,6 @@ private:
|
||||||
// 刷新设备状态
|
// 刷新设备状态
|
||||||
static void __updateDeviceState();
|
static void __updateDeviceState();
|
||||||
|
|
||||||
// 添加输入监听
|
|
||||||
static void __add(
|
|
||||||
Listener * pListener
|
|
||||||
);
|
|
||||||
|
|
||||||
// 卸载 DirectInput
|
// 卸载 DirectInput
|
||||||
static void __uninit();
|
static void __uninit();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "emacros.h"
|
#include "emacros.h"
|
||||||
|
#include <set>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
@ -520,7 +521,6 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
class Node;
|
class Node;
|
||||||
class Action;
|
|
||||||
class SceneManager;
|
class SceneManager;
|
||||||
|
|
||||||
// 场景
|
// 场景
|
||||||
|
|
@ -592,69 +592,13 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Input;
|
class CollisionManager;
|
||||||
|
|
||||||
// 监听器
|
|
||||||
class Listener
|
|
||||||
: public Object
|
|
||||||
{
|
|
||||||
friend Input;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Listener();
|
|
||||||
|
|
||||||
Listener(
|
|
||||||
Function func /* 监听到消息时的执行函数 */
|
|
||||||
);
|
|
||||||
|
|
||||||
Listener(
|
|
||||||
Function func, /* 监听到消息时的执行函数 */
|
|
||||||
String name /* 监听器名称 */
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启动
|
|
||||||
void start();
|
|
||||||
|
|
||||||
// 停止
|
|
||||||
void stop();
|
|
||||||
|
|
||||||
// 停止并清除
|
|
||||||
void stopAndClear();
|
|
||||||
|
|
||||||
// 获取运行状态
|
|
||||||
bool isRunning();
|
|
||||||
|
|
||||||
// 获取名称
|
|
||||||
String getName();
|
|
||||||
|
|
||||||
// 修改名称
|
|
||||||
void setName(
|
|
||||||
String name
|
|
||||||
);
|
|
||||||
|
|
||||||
// 设置监听到消息时的执行函数
|
|
||||||
void setFunction(
|
|
||||||
Function func
|
|
||||||
);
|
|
||||||
|
|
||||||
// 更新
|
|
||||||
void update();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
String m_sName;
|
|
||||||
bool m_bRunning;
|
|
||||||
bool m_bClear;
|
|
||||||
Function m_callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class ShapeManager;
|
|
||||||
|
|
||||||
// 形状
|
// 形状
|
||||||
class Shape :
|
class Shape :
|
||||||
public Object
|
public Object
|
||||||
{
|
{
|
||||||
friend ShapeManager;
|
friend CollisionManager;
|
||||||
friend Node;
|
friend Node;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -679,22 +623,6 @@ public:
|
||||||
// 获取父节点
|
// 获取父节点
|
||||||
Node * getParentNode() const;
|
Node * getParentNode() const;
|
||||||
|
|
||||||
// 获取类别掩码
|
|
||||||
UINT32 getCategoryBitmask() const;
|
|
||||||
|
|
||||||
// 获取冲突掩码
|
|
||||||
UINT32 getCollisionBitmask() const;
|
|
||||||
|
|
||||||
// 设置类别掩码
|
|
||||||
void setCategoryBitmask(
|
|
||||||
UINT32 mask
|
|
||||||
);
|
|
||||||
|
|
||||||
// 设置冲突掩码
|
|
||||||
void setCollisionBitmask(
|
|
||||||
UINT32 mask
|
|
||||||
);
|
|
||||||
|
|
||||||
// 启用或关闭该形状
|
// 启用或关闭该形状
|
||||||
virtual void setEnable(
|
virtual void setEnable(
|
||||||
bool bEnable
|
bool bEnable
|
||||||
|
|
@ -737,8 +665,6 @@ protected:
|
||||||
bool m_bEnable;
|
bool m_bEnable;
|
||||||
bool m_bIsVisiable;
|
bool m_bIsVisiable;
|
||||||
bool m_bAutoResize;
|
bool m_bAutoResize;
|
||||||
UINT32 m_nCategoryBitmask;
|
|
||||||
UINT32 m_nCollisionBitmask;
|
|
||||||
UINT32 m_nColor;
|
UINT32 m_nColor;
|
||||||
float m_fOpacity;
|
float m_fOpacity;
|
||||||
Node * m_pParentNode;
|
Node * m_pParentNode;
|
||||||
|
|
|
||||||
125
core/emanagers.h
125
core/emanagers.h
|
|
@ -6,15 +6,15 @@ namespace e2d
|
||||||
{
|
{
|
||||||
|
|
||||||
class Game;
|
class Game;
|
||||||
|
class Input;
|
||||||
class Renderer;
|
class Renderer;
|
||||||
class Object;
|
|
||||||
class Scene;
|
|
||||||
class Node;
|
class Node;
|
||||||
class Timer;
|
class Timer;
|
||||||
class Action;
|
class Action;
|
||||||
class Music;
|
class Music;
|
||||||
class Shape;
|
|
||||||
class Transition;
|
class Transition;
|
||||||
|
class InputListener;
|
||||||
|
class CollisionListener;
|
||||||
|
|
||||||
// 对象管理器
|
// 对象管理器
|
||||||
class ObjectManager
|
class ObjectManager
|
||||||
|
|
@ -294,31 +294,134 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class ShapeManager
|
// 键盘和鼠标消息管理器
|
||||||
|
class InputManager
|
||||||
{
|
{
|
||||||
friend Game;
|
friend Input;
|
||||||
friend Node;
|
friend InputListener;
|
||||||
friend Shape;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 开启或禁用碰撞触发 onCollide 函数
|
// 添加输入监听
|
||||||
static void setCollisionEnable(
|
static void add(
|
||||||
|
Function func, /* 监听到用户输入时的执行函数 */
|
||||||
|
String name = L"" /* 监听器名称 */
|
||||||
|
);
|
||||||
|
|
||||||
|
// 启动输入监听
|
||||||
|
static void start(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 停止输入监听
|
||||||
|
static void stop(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 清除输入监听
|
||||||
|
static void clear(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 启动所有监听器
|
||||||
|
static void startAll();
|
||||||
|
|
||||||
|
// 停止所有监听器
|
||||||
|
static void stopAll();
|
||||||
|
|
||||||
|
// 清除所有监听器
|
||||||
|
static void clearAll();
|
||||||
|
|
||||||
|
// 获取监听器
|
||||||
|
static std::vector<InputListener*> get(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 获取全部监听器
|
||||||
|
static std::vector<InputListener*> getAll();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// 添加输入监听
|
||||||
|
static void __add(
|
||||||
|
InputListener * pListener
|
||||||
|
);
|
||||||
|
|
||||||
|
// 更新监听器
|
||||||
|
static void __update();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 碰撞管理器
|
||||||
|
class CollisionManager
|
||||||
|
{
|
||||||
|
friend Node;
|
||||||
|
friend Shape;
|
||||||
|
friend CollisionListener;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// 开启或关闭碰撞监听功能(默认关闭)
|
||||||
|
static void setEnable(
|
||||||
bool bEnable
|
bool bEnable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 添加碰撞监听
|
||||||
|
static void add(
|
||||||
|
Function func, /* 监听到碰撞时的执行函数 */
|
||||||
|
String name = L"" /* 监听器名称 */
|
||||||
|
);
|
||||||
|
|
||||||
|
// 启动碰撞监听
|
||||||
|
static void start(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 停止碰撞监听
|
||||||
|
static void stop(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 清除碰撞监听
|
||||||
|
static void clear(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 启动所有监听器
|
||||||
|
static void startAll();
|
||||||
|
|
||||||
|
// 停止所有监听器
|
||||||
|
static void stopAll();
|
||||||
|
|
||||||
|
// 清除所有监听器
|
||||||
|
static void clearAll();
|
||||||
|
|
||||||
|
// 获取监听器
|
||||||
|
static std::vector<CollisionListener*> get(
|
||||||
|
String name
|
||||||
|
);
|
||||||
|
|
||||||
|
// 获取全部监听器
|
||||||
|
static std::vector<CollisionListener*> getAll();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// 添加碰撞监听
|
||||||
|
static void __add(
|
||||||
|
CollisionListener * pListener
|
||||||
|
);
|
||||||
|
|
||||||
|
// 更新监听器
|
||||||
|
static void __update();
|
||||||
|
|
||||||
// 更新形状
|
// 更新形状
|
||||||
static void __updateShape(
|
static void __updateShape(
|
||||||
Shape * pActiveShape
|
Shape * pActiveShape
|
||||||
);
|
);
|
||||||
|
|
||||||
// 添加形状
|
// 添加形状
|
||||||
static void __add(
|
static void __addShape(
|
||||||
Shape * pShape
|
Shape * pShape
|
||||||
);
|
);
|
||||||
|
|
||||||
// 删除已绑定的形状
|
// 删除已绑定的形状
|
||||||
static void __remove(
|
static void __removeShape(
|
||||||
Shape * pShape
|
Shape * pShape
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ namespace e2d
|
||||||
|
|
||||||
class Action;
|
class Action;
|
||||||
class Transition;
|
class Transition;
|
||||||
|
class CollisionManager;
|
||||||
|
|
||||||
class Node :
|
class Node :
|
||||||
public Object
|
public Object
|
||||||
|
|
@ -14,6 +15,7 @@ class Node :
|
||||||
friend Scene;
|
friend Scene;
|
||||||
friend Shape;
|
friend Shape;
|
||||||
friend Transition;
|
friend Transition;
|
||||||
|
friend CollisionManager;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Node();
|
Node();
|
||||||
|
|
@ -57,6 +59,9 @@ public:
|
||||||
// 获取节点名称
|
// 获取节点名称
|
||||||
virtual String getName() const;
|
virtual String getName() const;
|
||||||
|
|
||||||
|
// 获取节点名称的 Hash 值
|
||||||
|
virtual unsigned int getHashName() const;
|
||||||
|
|
||||||
// 获取节点绘图顺序
|
// 获取节点绘图顺序
|
||||||
virtual int getOrder() const;
|
virtual int getOrder() const;
|
||||||
|
|
||||||
|
|
@ -316,10 +321,31 @@ public:
|
||||||
Shape * pShape
|
Shape * pShape
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 添加可碰撞节点的名称
|
||||||
|
virtual void addCollider(
|
||||||
|
String collliderName
|
||||||
|
);
|
||||||
|
|
||||||
|
// 添加多个可碰撞节点的名称
|
||||||
|
virtual void addCollider(
|
||||||
|
std::initializer_list<String>& vCollliderName /* 名称数组 */
|
||||||
|
);
|
||||||
|
|
||||||
|
// 移除可碰撞节点的名称
|
||||||
|
virtual void removeCollider(
|
||||||
|
String collliderName
|
||||||
|
);
|
||||||
|
|
||||||
// 添加子节点
|
// 添加子节点
|
||||||
virtual void addChild(
|
virtual void addChild(
|
||||||
Node * child,
|
Node * child,
|
||||||
int order = 0
|
int order = 0 /* 渲染顺序 */
|
||||||
|
);
|
||||||
|
|
||||||
|
// 添加多个子节点
|
||||||
|
virtual void addChild(
|
||||||
|
std::initializer_list<Node*>& vNodes, /* 节点数组 */
|
||||||
|
int order = 0 /* 渲染顺序 */
|
||||||
);
|
);
|
||||||
|
|
||||||
// 执行动画
|
// 执行动画
|
||||||
|
|
@ -435,6 +461,7 @@ protected:
|
||||||
Node * m_pParent;
|
Node * m_pParent;
|
||||||
D2D1::Matrix3x2F m_MatriInitial;
|
D2D1::Matrix3x2F m_MatriInitial;
|
||||||
D2D1::Matrix3x2F m_MatriFinal;
|
D2D1::Matrix3x2F m_MatriFinal;
|
||||||
|
std::set<unsigned int> m_vColliders;
|
||||||
std::vector<Node*> m_vChildren;
|
std::vector<Node*> m_vChildren;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -700,7 +727,7 @@ public:
|
||||||
);
|
);
|
||||||
|
|
||||||
// 设置按钮点击后的执行函数
|
// 设置按钮点击后的执行函数
|
||||||
void setFunction(
|
void setClickFunc(
|
||||||
Function func
|
Function func
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
104
core/etools.h
104
core/etools.h
|
|
@ -7,6 +7,7 @@ namespace e2d
|
||||||
|
|
||||||
class TimerManager;
|
class TimerManager;
|
||||||
class MusicManager;
|
class MusicManager;
|
||||||
|
class InputManager;
|
||||||
|
|
||||||
// 随机数产生器
|
// 随机数产生器
|
||||||
class Random
|
class Random
|
||||||
|
|
@ -88,7 +89,7 @@ public:
|
||||||
);
|
);
|
||||||
|
|
||||||
// 设置定时器的执行函数
|
// 设置定时器的执行函数
|
||||||
void setFunction(
|
void setFunc(
|
||||||
Function func
|
Function func
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -116,6 +117,107 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 监听器
|
||||||
|
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 CollisionManager;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CollisionListener();
|
||||||
|
|
||||||
|
CollisionListener(
|
||||||
|
Function func /* 监听到用户输入时的执行函数 */
|
||||||
|
);
|
||||||
|
|
||||||
|
CollisionListener(
|
||||||
|
Function func, /* 监听到用户输入时的执行函数 */
|
||||||
|
String name /* 监听器名称 */
|
||||||
|
);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// 更新监听器状态
|
||||||
|
virtual void _update();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Function m_callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// 数据管理工具
|
// 数据管理工具
|
||||||
class Data
|
class Data
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,7 @@
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\core\Action\Action.cpp" />
|
<ClCompile Include="..\..\core\Action\Action.cpp" />
|
||||||
<ClCompile Include="..\..\core\Action\ActionCallback.cpp" />
|
<ClCompile Include="..\..\core\Action\ActionFunc.cpp" />
|
||||||
<ClCompile Include="..\..\core\Action\ActionDelay.cpp" />
|
<ClCompile Include="..\..\core\Action\ActionDelay.cpp" />
|
||||||
<ClCompile Include="..\..\core\Action\ActionMoveBy.cpp" />
|
<ClCompile Include="..\..\core\Action\ActionMoveBy.cpp" />
|
||||||
<ClCompile Include="..\..\core\Action\Animation.cpp" />
|
<ClCompile Include="..\..\core\Action\Animation.cpp" />
|
||||||
|
|
@ -212,7 +212,6 @@
|
||||||
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Listener.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Common\Object.cpp" />
|
<ClCompile Include="..\..\core\Common\Object.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Point.cpp" />
|
<ClCompile Include="..\..\core\Common\Point.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Scene.cpp" />
|
<ClCompile Include="..\..\core\Common\Scene.cpp" />
|
||||||
|
|
@ -220,9 +219,10 @@
|
||||||
<ClCompile Include="..\..\core\Common\String.cpp" />
|
<ClCompile Include="..\..\core\Common\String.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Image.cpp" />
|
<ClCompile Include="..\..\core\Common\Image.cpp" />
|
||||||
<ClCompile Include="..\..\core\Manager\ActionManager.cpp" />
|
<ClCompile Include="..\..\core\Manager\ActionManager.cpp" />
|
||||||
|
<ClCompile Include="..\..\core\Manager\InputManager.cpp" />
|
||||||
<ClCompile Include="..\..\core\Manager\MusicManager.cpp" />
|
<ClCompile Include="..\..\core\Manager\MusicManager.cpp" />
|
||||||
<ClCompile Include="..\..\core\Manager\ObjectManager.cpp" />
|
<ClCompile Include="..\..\core\Manager\ObjectManager.cpp" />
|
||||||
<ClCompile Include="..\..\core\Manager\ShapeManager.cpp" />
|
<ClCompile Include="..\..\core\Manager\CollisionManager.cpp" />
|
||||||
<ClCompile Include="..\..\core\Manager\SceneManager.cpp" />
|
<ClCompile Include="..\..\core\Manager\SceneManager.cpp" />
|
||||||
<ClCompile Include="..\..\core\Manager\TimerManager.cpp" />
|
<ClCompile Include="..\..\core\Manager\TimerManager.cpp" />
|
||||||
<ClCompile Include="..\..\core\Node\Button.cpp" />
|
<ClCompile Include="..\..\core\Node\Button.cpp" />
|
||||||
|
|
@ -235,7 +235,10 @@
|
||||||
<ClCompile Include="..\..\core\Shape\ShapeEllipse.cpp" />
|
<ClCompile Include="..\..\core\Shape\ShapeEllipse.cpp" />
|
||||||
<ClCompile Include="..\..\core\Shape\ShapeRectangle.cpp" />
|
<ClCompile Include="..\..\core\Shape\ShapeRectangle.cpp" />
|
||||||
<ClCompile Include="..\..\core\Shape\Shape.cpp" />
|
<ClCompile Include="..\..\core\Shape\Shape.cpp" />
|
||||||
|
<ClCompile Include="..\..\core\Tool\CollisionListener.cpp" />
|
||||||
<ClCompile Include="..\..\core\Tool\Data.cpp" />
|
<ClCompile Include="..\..\core\Tool\Data.cpp" />
|
||||||
|
<ClCompile Include="..\..\core\Tool\InputListener.cpp" />
|
||||||
|
<ClCompile Include="..\..\core\Tool\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" />
|
||||||
|
|
|
||||||
|
|
@ -36,9 +36,6 @@
|
||||||
<ClCompile Include="..\..\core\Action\Action.cpp">
|
<ClCompile Include="..\..\core\Action\Action.cpp">
|
||||||
<Filter>Action</Filter>
|
<Filter>Action</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Action\ActionCallback.cpp">
|
|
||||||
<Filter>Action</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Action\ActionDelay.cpp">
|
<ClCompile Include="..\..\core\Action\ActionDelay.cpp">
|
||||||
<Filter>Action</Filter>
|
<Filter>Action</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
@ -147,9 +144,6 @@
|
||||||
<ClCompile Include="..\..\core\Manager\MusicManager.cpp">
|
<ClCompile Include="..\..\core\Manager\MusicManager.cpp">
|
||||||
<Filter>Manager</Filter>
|
<Filter>Manager</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Manager\ShapeManager.cpp">
|
|
||||||
<Filter>Manager</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Shape\Shape.cpp">
|
<ClCompile Include="..\..\core\Shape\Shape.cpp">
|
||||||
<Filter>Shape</Filter>
|
<Filter>Shape</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
@ -159,9 +153,6 @@
|
||||||
<ClCompile Include="..\..\core\Common\Size.cpp">
|
<ClCompile Include="..\..\core\Common\Size.cpp">
|
||||||
<Filter>Common</Filter>
|
<Filter>Common</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Common\Listener.cpp">
|
|
||||||
<Filter>Common</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Transition\Transition.cpp">
|
<ClCompile Include="..\..\core\Transition\Transition.cpp">
|
||||||
<Filter>Transition</Filter>
|
<Filter>Transition</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
@ -189,6 +180,24 @@
|
||||||
<ClCompile Include="..\..\core\Shape\ShapeCircle.cpp">
|
<ClCompile Include="..\..\core\Shape\ShapeCircle.cpp">
|
||||||
<Filter>Shape</Filter>
|
<Filter>Shape</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Tool\InputListener.cpp">
|
||||||
|
<Filter>Tool</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Manager\CollisionManager.cpp">
|
||||||
|
<Filter>Manager</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Tool\CollisionListener.cpp">
|
||||||
|
<Filter>Tool</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Manager\InputManager.cpp">
|
||||||
|
<Filter>Manager</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Tool\Listener.cpp">
|
||||||
|
<Filter>Tool</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Action\ActionFunc.cpp">
|
||||||
|
<Filter>Action</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\core\etools.h" />
|
<ClInclude Include="..\..\core\etools.h" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue