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();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
Action ** ppAction = &action1;
|
||||
|
||||
while (number > 0)
|
||||
{
|
||||
ASSERT((*ppAction) != nullptr, "ActionSequence NULL pointer exception!");
|
||||
this->add(*ppAction);
|
||||
ppAction++;
|
||||
number--;
|
||||
}
|
||||
this->add(vActions);
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
auto a = new ActionSequence();
|
||||
|
|
|
|||
|
|
@ -12,19 +12,9 @@ e2d::Animation::Animation(double interval)
|
|||
{
|
||||
}
|
||||
|
||||
e2d::Animation::Animation(int number, Image * frame, ...)
|
||||
: m_nFrameIndex(0)
|
||||
, m_fInterval(1)
|
||||
e2d::Animation::Animation(std::initializer_list<Image*>& vImages)
|
||||
{
|
||||
Image ** ppImage = &frame;
|
||||
|
||||
while (number > 0)
|
||||
{
|
||||
ASSERT((*ppImage) != nullptr, "Animation NULL pointer exception!");
|
||||
this->addKeyframe(*ppImage);
|
||||
ppImage++;
|
||||
number--;
|
||||
}
|
||||
this->add(vImages);
|
||||
}
|
||||
|
||||
e2d::Animation::~Animation()
|
||||
|
|
@ -78,7 +68,7 @@ void e2d::Animation::reset()
|
|||
m_nFrameIndex = 0;
|
||||
}
|
||||
|
||||
void e2d::Animation::addKeyframe(Image * frame)
|
||||
void e2d::Animation::add(Image * 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
|
||||
{
|
||||
auto a = new Animation(m_fInterval);
|
||||
for (auto frame : m_vFrames)
|
||||
{
|
||||
a->addKeyframe(frame);
|
||||
a->add(frame);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
#include "..\ebase.h"
|
||||
#include "..\etools.h"
|
||||
#include "..\emanagers.h"
|
||||
|
||||
#pragma comment(lib, "dinput8.lib")
|
||||
#pragma comment(lib, "dxguid.lib")
|
||||
|
|
@ -15,9 +17,6 @@ static DIMOUSESTATE s_MouseState; //
|
|||
static DIMOUSESTATE s_MouseRecordState; // 報炎佚連屈雫産喝
|
||||
static POINT s_MousePosition; // 報炎了崔贋刈潤更悶
|
||||
|
||||
// ¼àÌýÆ÷ÈÝÆ÷
|
||||
static std::vector<Listener*> s_vListeners;
|
||||
|
||||
|
||||
bool Input::__init()
|
||||
{
|
||||
|
|
@ -100,21 +99,7 @@ void Input::__uninit()
|
|||
void e2d::Input::__update()
|
||||
{
|
||||
Input::__updateDeviceState();
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
InputManager::__update();
|
||||
}
|
||||
|
||||
void Input::__updateDeviceState()
|
||||
|
|
@ -157,115 +142,6 @@ void Input::__updateDeviceState()
|
|||
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)
|
||||
{
|
||||
if (s_KeyBuffer[nKeyCode] & 0x80)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#include "..\ebase.h"
|
||||
#include "..\enodes.h"
|
||||
#include "..\emanagers.h"
|
||||
#include "..\etools.h"
|
||||
#include "..\eactions.h"
|
||||
|
||||
e2d::Scene::Scene()
|
||||
: 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)
|
||||
{
|
||||
this->setNormal(normal);
|
||||
this->setFunction(func);
|
||||
this->setClickFunc(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->setSelected(selected);
|
||||
this->setFunction(func);
|
||||
this->setClickFunc(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->setMouseOver(mouseover);
|
||||
this->setSelected(selected);
|
||||
this->setFunction(func);
|
||||
this->setClickFunc(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->setSelected(selected);
|
||||
this->setDisabled(disabled);
|
||||
this->setFunction(func);
|
||||
this->setClickFunc(func);
|
||||
}
|
||||
|
||||
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.");
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, F
|
|||
{
|
||||
this->setNormal(toggleOnNormal);
|
||||
this->setNormalOff(toggleOffNormal);
|
||||
this->setFunction(func);
|
||||
this->setClickFunc(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->setSelected(toggleOnSelected);
|
||||
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)
|
||||
|
|
@ -68,7 +68,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, N
|
|||
this->setMouseOverOff(toggleOffMouseOver);
|
||||
this->setSelected(toggleOnSelected);
|
||||
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)
|
||||
|
|
@ -91,7 +91,7 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, N
|
|||
this->setSelectedOff(toggleOffSelected);
|
||||
this->setDisabled(toggleOnDisabled);
|
||||
this->setDisabledOff(toggleOffDisabled);
|
||||
this->setFunction(func);
|
||||
this->setClickFunc(func);
|
||||
}
|
||||
|
||||
bool e2d::ButtonToggle::getState() const
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ e2d::Node::Node()
|
|||
e2d::Node::~Node()
|
||||
{
|
||||
ActionManager::__clearAllBindedWith(this);
|
||||
ShapeManager::__remove(m_pShape);
|
||||
CollisionManager::__removeShape(m_pShape);
|
||||
for (auto child : m_vChildren)
|
||||
{
|
||||
SafeRelease(&child);
|
||||
|
|
@ -288,6 +288,11 @@ e2d::String e2d::Node::getName() const
|
|||
return m_sName;
|
||||
}
|
||||
|
||||
unsigned int e2d::Node::getHashName() const
|
||||
{
|
||||
return m_nHashName;
|
||||
}
|
||||
|
||||
double e2d::Node::getPosX() const
|
||||
{
|
||||
return m_fPosX;
|
||||
|
|
@ -575,9 +580,9 @@ void e2d::Node::setShape(Shape::TYPE type)
|
|||
void e2d::Node::setShape(Shape * pShape)
|
||||
{
|
||||
// 删除旧的形状
|
||||
ShapeManager::__remove(m_pShape);
|
||||
CollisionManager::__removeShape(m_pShape);
|
||||
// 添加新的形状
|
||||
ShapeManager::__add(pShape);
|
||||
CollisionManager::__addShape(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 */)
|
||||
{
|
||||
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
|
||||
{
|
||||
return m_pParent;
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@
|
|||
#include "..\enodes.h"
|
||||
|
||||
e2d::Shape::Shape()
|
||||
: m_nCategoryBitmask(0)
|
||||
, m_nCollisionBitmask(0)
|
||||
, m_bIsVisiable(true)
|
||||
: m_bIsVisiable(true)
|
||||
, m_nColor(Color::RED)
|
||||
, m_fOpacity(1)
|
||||
, m_pParentNode(nullptr)
|
||||
|
|
@ -25,26 +23,6 @@ e2d::Node * e2d::Shape::getParentNode() const
|
|||
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)
|
||||
{
|
||||
m_bEnable = bEnable;
|
||||
|
|
@ -126,6 +104,6 @@ void e2d::Shape::_transform()
|
|||
&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 "..\ebase.h"
|
||||
#include "..\etools.h"
|
||||
|
||||
e2d::Listener::Listener()
|
||||
: m_bRunning(false)
|
||||
, m_callback(nullptr)
|
||||
, m_bClear(false)
|
||||
{
|
||||
Input::__add(this);
|
||||
}
|
||||
|
||||
e2d::Listener::Listener(Function func)
|
||||
: m_bRunning(false)
|
||||
, m_callback(func)
|
||||
, m_bClear(false)
|
||||
{
|
||||
Input::__add(this);
|
||||
}
|
||||
|
||||
e2d::Listener::Listener(Function func, String name)
|
||||
e2d::Listener::Listener(String name)
|
||||
: m_bRunning(false)
|
||||
, m_sName(name)
|
||||
, m_callback(func)
|
||||
, m_bClear(false)
|
||||
{
|
||||
Input::__add(this);
|
||||
}
|
||||
|
||||
void e2d::Listener::start()
|
||||
|
|
@ -56,16 +43,3 @@ void e2d::Listener::setName(String 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)
|
||||
{
|
||||
this->setName(name);
|
||||
this->setFunction(func);
|
||||
this->setFunc(func);
|
||||
this->setUpdateTimes(updateTimes);
|
||||
this->setInterval(interval);
|
||||
m_bAutoRelease = autoRelease;
|
||||
|
|
@ -59,7 +59,7 @@ void e2d::Timer::setInterval(double interval)
|
|||
m_fInterval = max(interval, 0);
|
||||
}
|
||||
|
||||
void e2d::Timer::setFunction(Function func)
|
||||
void e2d::Timer::setFunc(Function func)
|
||||
{
|
||||
m_Callback = func;
|
||||
}
|
||||
|
|
|
|||
134
core/eactions.h
134
core/eactions.h
|
|
@ -402,16 +402,19 @@ public:
|
|||
|
||||
// 创建顺序动作
|
||||
ActionSequence(
|
||||
int number, /* 顺序动作数量 */
|
||||
Action * action, /* 第一个动作 */
|
||||
...
|
||||
std::initializer_list<Action*>& vActions /* 动作数组 */
|
||||
);
|
||||
|
||||
virtual ~ActionSequence();
|
||||
|
||||
// 向顺序动作中添加动作
|
||||
// 在结尾添加动作
|
||||
void add(
|
||||
Action * action /* 将动作添加至顺序动作尾部 */
|
||||
Action * action
|
||||
);
|
||||
|
||||
// 在结尾添加多个动作
|
||||
void add(
|
||||
std::initializer_list<Action*>& vActions /* 动作数组 */
|
||||
);
|
||||
|
||||
// 获取该动作的拷贝对象
|
||||
|
|
@ -514,18 +517,21 @@ public:
|
|||
|
||||
// 创建帧动画
|
||||
Animation(
|
||||
int number, /* 帧数量 */
|
||||
Image * frame, /* 第一帧 */
|
||||
...
|
||||
std::initializer_list<Image*>& vImages
|
||||
);
|
||||
|
||||
virtual ~Animation();
|
||||
|
||||
// 添加关键帧
|
||||
void addKeyframe(
|
||||
void add(
|
||||
Image * frame /* 关键帧 */
|
||||
);
|
||||
|
||||
// 添加多个关键帧
|
||||
void add(
|
||||
std::initializer_list<Image*>& vImages /* 关键帧数组 */
|
||||
);
|
||||
|
||||
// 设置每一帧的时间间隔
|
||||
void setInterval(
|
||||
double interval /* 帧间隔(秒) */
|
||||
|
|
@ -664,9 +670,7 @@ namespace e2d
|
|||
|
||||
// 创建顺序动作
|
||||
ActionSequence* Sequence(
|
||||
int number, /* 顺序动作数量 */
|
||||
Action * action1, /* 第一个动作 */
|
||||
...
|
||||
std::initializer_list<Action*>& vActions /* 动作数组 */
|
||||
);
|
||||
|
||||
// 创建延时动作
|
||||
|
|
@ -682,10 +686,8 @@ namespace e2d
|
|||
|
||||
// 创建特定帧间隔的帧动画
|
||||
Animation* Animate(
|
||||
double interval, /* 帧间隔(秒) */
|
||||
int number, /* 帧数量 */
|
||||
Image * frame, /* 第一帧 */
|
||||
...
|
||||
double interval, /* 帧间隔(秒) */
|
||||
std::initializer_list<Image*>& vFrames /* 关键帧数组 */
|
||||
);
|
||||
|
||||
// 创建执行函数对象的动作
|
||||
|
|
@ -693,4 +695,104 @@ namespace e2d
|
|||
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
|
||||
{
|
||||
friend Game;
|
||||
friend Listener;
|
||||
|
||||
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(
|
||||
int nKeyCode
|
||||
|
|
@ -259,11 +220,6 @@ private:
|
|||
// 刷新设备状态
|
||||
static void __updateDeviceState();
|
||||
|
||||
// 添加输入监听
|
||||
static void __add(
|
||||
Listener * pListener
|
||||
);
|
||||
|
||||
// 卸载 DirectInput
|
||||
static void __uninit();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
#include "emacros.h"
|
||||
#include <set>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
|
|
@ -520,7 +521,6 @@ protected:
|
|||
|
||||
|
||||
class Node;
|
||||
class Action;
|
||||
class SceneManager;
|
||||
|
||||
// 场景
|
||||
|
|
@ -592,69 +592,13 @@ protected:
|
|||
};
|
||||
|
||||
|
||||
class Input;
|
||||
|
||||
// 监听器
|
||||
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 CollisionManager;
|
||||
|
||||
// 形状
|
||||
class Shape :
|
||||
public Object
|
||||
{
|
||||
friend ShapeManager;
|
||||
friend CollisionManager;
|
||||
friend Node;
|
||||
|
||||
public:
|
||||
|
|
@ -679,22 +623,6 @@ public:
|
|||
// 获取父节点
|
||||
Node * getParentNode() const;
|
||||
|
||||
// 获取类别掩码
|
||||
UINT32 getCategoryBitmask() const;
|
||||
|
||||
// 获取冲突掩码
|
||||
UINT32 getCollisionBitmask() const;
|
||||
|
||||
// 设置类别掩码
|
||||
void setCategoryBitmask(
|
||||
UINT32 mask
|
||||
);
|
||||
|
||||
// 设置冲突掩码
|
||||
void setCollisionBitmask(
|
||||
UINT32 mask
|
||||
);
|
||||
|
||||
// 启用或关闭该形状
|
||||
virtual void setEnable(
|
||||
bool bEnable
|
||||
|
|
@ -737,8 +665,6 @@ protected:
|
|||
bool m_bEnable;
|
||||
bool m_bIsVisiable;
|
||||
bool m_bAutoResize;
|
||||
UINT32 m_nCategoryBitmask;
|
||||
UINT32 m_nCollisionBitmask;
|
||||
UINT32 m_nColor;
|
||||
float m_fOpacity;
|
||||
Node * m_pParentNode;
|
||||
|
|
|
|||
125
core/emanagers.h
125
core/emanagers.h
|
|
@ -6,15 +6,15 @@ namespace e2d
|
|||
{
|
||||
|
||||
class Game;
|
||||
class Input;
|
||||
class Renderer;
|
||||
class Object;
|
||||
class Scene;
|
||||
class Node;
|
||||
class Timer;
|
||||
class Action;
|
||||
class Music;
|
||||
class Shape;
|
||||
class Transition;
|
||||
class InputListener;
|
||||
class CollisionListener;
|
||||
|
||||
// 对象管理器
|
||||
class ObjectManager
|
||||
|
|
@ -294,31 +294,134 @@ private:
|
|||
};
|
||||
|
||||
|
||||
class ShapeManager
|
||||
// 键盘和鼠标消息管理器
|
||||
class InputManager
|
||||
{
|
||||
friend Game;
|
||||
friend Node;
|
||||
friend Shape;
|
||||
friend Input;
|
||||
friend InputListener;
|
||||
|
||||
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
|
||||
);
|
||||
|
||||
// 添加碰撞监听
|
||||
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:
|
||||
// 添加碰撞监听
|
||||
static void __add(
|
||||
CollisionListener * pListener
|
||||
);
|
||||
|
||||
// 更新监听器
|
||||
static void __update();
|
||||
|
||||
// 更新形状
|
||||
static void __updateShape(
|
||||
Shape * pActiveShape
|
||||
);
|
||||
|
||||
// 添加形状
|
||||
static void __add(
|
||||
static void __addShape(
|
||||
Shape * pShape
|
||||
);
|
||||
|
||||
// 删除已绑定的形状
|
||||
static void __remove(
|
||||
static void __removeShape(
|
||||
Shape * pShape
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ namespace e2d
|
|||
|
||||
class Action;
|
||||
class Transition;
|
||||
class CollisionManager;
|
||||
|
||||
class Node :
|
||||
public Object
|
||||
|
|
@ -14,6 +15,7 @@ class Node :
|
|||
friend Scene;
|
||||
friend Shape;
|
||||
friend Transition;
|
||||
friend CollisionManager;
|
||||
|
||||
public:
|
||||
Node();
|
||||
|
|
@ -57,6 +59,9 @@ public:
|
|||
// 获取节点名称
|
||||
virtual String getName() const;
|
||||
|
||||
// 获取节点名称的 Hash 值
|
||||
virtual unsigned int getHashName() const;
|
||||
|
||||
// 获取节点绘图顺序
|
||||
virtual int getOrder() const;
|
||||
|
||||
|
|
@ -316,10 +321,31 @@ public:
|
|||
Shape * pShape
|
||||
);
|
||||
|
||||
// 添加可碰撞节点的名称
|
||||
virtual void addCollider(
|
||||
String collliderName
|
||||
);
|
||||
|
||||
// 添加多个可碰撞节点的名称
|
||||
virtual void addCollider(
|
||||
std::initializer_list<String>& vCollliderName /* 名称数组 */
|
||||
);
|
||||
|
||||
// 移除可碰撞节点的名称
|
||||
virtual void removeCollider(
|
||||
String collliderName
|
||||
);
|
||||
|
||||
// 添加子节点
|
||||
virtual void addChild(
|
||||
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;
|
||||
D2D1::Matrix3x2F m_MatriInitial;
|
||||
D2D1::Matrix3x2F m_MatriFinal;
|
||||
std::set<unsigned int> m_vColliders;
|
||||
std::vector<Node*> m_vChildren;
|
||||
};
|
||||
|
||||
|
|
@ -700,7 +727,7 @@ public:
|
|||
);
|
||||
|
||||
// 设置按钮点击后的执行函数
|
||||
void setFunction(
|
||||
void setClickFunc(
|
||||
Function func
|
||||
);
|
||||
|
||||
|
|
|
|||
104
core/etools.h
104
core/etools.h
|
|
@ -7,6 +7,7 @@ namespace e2d
|
|||
|
||||
class TimerManager;
|
||||
class MusicManager;
|
||||
class InputManager;
|
||||
|
||||
// 随机数产生器
|
||||
class Random
|
||||
|
|
@ -88,7 +89,7 @@ public:
|
|||
);
|
||||
|
||||
// 设置定时器的执行函数
|
||||
void setFunction(
|
||||
void setFunc(
|
||||
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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@
|
|||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<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\ActionMoveBy.cpp" />
|
||||
<ClCompile Include="..\..\core\Action\Animation.cpp" />
|
||||
|
|
@ -212,7 +212,6 @@
|
|||
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
||||
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
||||
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
||||
<ClCompile Include="..\..\core\Common\Listener.cpp" />
|
||||
<ClCompile Include="..\..\core\Common\Object.cpp" />
|
||||
<ClCompile Include="..\..\core\Common\Point.cpp" />
|
||||
<ClCompile Include="..\..\core\Common\Scene.cpp" />
|
||||
|
|
@ -220,9 +219,10 @@
|
|||
<ClCompile Include="..\..\core\Common\String.cpp" />
|
||||
<ClCompile Include="..\..\core\Common\Image.cpp" />
|
||||
<ClCompile Include="..\..\core\Manager\ActionManager.cpp" />
|
||||
<ClCompile Include="..\..\core\Manager\InputManager.cpp" />
|
||||
<ClCompile Include="..\..\core\Manager\MusicManager.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\TimerManager.cpp" />
|
||||
<ClCompile Include="..\..\core\Node\Button.cpp" />
|
||||
|
|
@ -235,7 +235,10 @@
|
|||
<ClCompile Include="..\..\core\Shape\ShapeEllipse.cpp" />
|
||||
<ClCompile Include="..\..\core\Shape\ShapeRectangle.cpp" />
|
||||
<ClCompile Include="..\..\core\Shape\Shape.cpp" />
|
||||
<ClCompile Include="..\..\core\Tool\CollisionListener.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\Music.cpp" />
|
||||
<ClCompile Include="..\..\core\Tool\Random.cpp" />
|
||||
|
|
|
|||
|
|
@ -36,9 +36,6 @@
|
|||
<ClCompile Include="..\..\core\Action\Action.cpp">
|
||||
<Filter>Action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\core\Action\ActionCallback.cpp">
|
||||
<Filter>Action</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\core\Action\ActionDelay.cpp">
|
||||
<Filter>Action</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -147,9 +144,6 @@
|
|||
<ClCompile Include="..\..\core\Manager\MusicManager.cpp">
|
||||
<Filter>Manager</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\core\Manager\ShapeManager.cpp">
|
||||
<Filter>Manager</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\core\Shape\Shape.cpp">
|
||||
<Filter>Shape</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -159,9 +153,6 @@
|
|||
<ClCompile Include="..\..\core\Common\Size.cpp">
|
||||
<Filter>Common</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\core\Common\Listener.cpp">
|
||||
<Filter>Common</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\core\Transition\Transition.cpp">
|
||||
<Filter>Transition</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -189,6 +180,24 @@
|
|||
<ClCompile Include="..\..\core\Shape\ShapeCircle.cpp">
|
||||
<Filter>Shape</Filter>
|
||||
</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>
|
||||
<ClInclude Include="..\..\core\etools.h" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue