增加EventHandler类,用于处理消息;移除Node::onUpdate方法

This commit is contained in:
Nomango 2018-08-13 23:24:08 +08:00
parent 61b384767e
commit 857f13230f
9 changed files with 73 additions and 155 deletions

View File

@ -34,26 +34,22 @@ void e2d::Scene::render()
} }
} }
void e2d::Scene::update()
{
this->onUpdate();
_root->_update();
}
void e2d::Scene::dispatch(const MouseEvent & e) void e2d::Scene::dispatch(const MouseEvent & e)
{ {
if (onEvent(e)) auto dispatcher = dynamic_cast<EventHandler*>(this);
return; if (dispatcher)
dispatcher->handle(e);
_root->dispatch(e); _root->dispatch(e, false);
} }
void e2d::Scene::dispatch(const KeyEvent & e) void e2d::Scene::dispatch(const KeyEvent & e)
{ {
if (onEvent(e)) auto dispatcher = dynamic_cast<EventHandler*>(this);
return; if (dispatcher)
dispatcher->handle(e);
_root->dispatch(e); _root->dispatch(e, false);
} }
void e2d::Scene::add(Node * child, int order /* = 0 */) void e2d::Scene::add(Node * child, int order /* = 0 */)

View File

@ -77,12 +77,16 @@ void e2d::CollisionManager::__updateCollider(Collider* collider)
auto passiveNode = passive->getNode(); auto passiveNode = passive->getNode();
// 触发两次碰撞事件 // 触发两次碰撞事件
Collision activeCollision(passiveNode, relation); Collision activeCollision(passiveNode, relation);
activeNode->getParentScene()->onEvent(activeCollision); if (dynamic_cast<EventHandler*>(activeNode->getParentScene()))
activeNode->onEvent(activeCollision); dynamic_cast<EventHandler*>(activeNode->getParentScene())->handle(activeCollision);
if (dynamic_cast<EventHandler*>(activeNode))
dynamic_cast<EventHandler*>(activeNode)->handle(activeCollision);
Collision passiveCollision(activeNode, passive->getRelationWith(collider)); Collision passiveCollision(activeNode, passive->getRelationWith(collider));
passiveNode->getParentScene()->onEvent(passiveCollision); if (dynamic_cast<EventHandler*>(passiveNode->getParentScene()))
passiveNode->onEvent(passiveCollision); dynamic_cast<EventHandler*>(passiveNode->getParentScene())->handle(passiveCollision);
if (dynamic_cast<EventHandler*>(passiveNode))
dynamic_cast<EventHandler*>(passiveNode)->handle(passiveCollision);
} }
} }
} }

View File

@ -120,9 +120,6 @@ bool e2d::SceneManager::isTransitioning()
void e2d::SceneManager::update() void e2d::SceneManager::update()
{ {
if (_currScene) _currScene->update();
if (_nextScene) _nextScene->update();
if (_transition) if (_transition)
{ {
_transition->update(); _transition->update();

View File

@ -143,9 +143,9 @@ void e2d::Button::setPivot(float pivotX, float pivotY)
SAFE_SET(_disabled, setPivot, pivotX, pivotY); SAFE_SET(_disabled, setPivot, pivotX, pivotY);
} }
bool e2d::Button::dispatch(const MouseEvent & e) bool e2d::Button::dispatch(const MouseEvent & e, bool handled)
{ {
if (_enabled && _visible && _normal) if (!handled && _enabled && _visible && _normal)
{ {
bool contains = _normal->containsPoint(e.getPos()); bool contains = _normal->containsPoint(e.getPos());
if (e.getType() == MouseEvent::Type::LeftUp && _isSelected && contains) if (e.getType() == MouseEvent::Type::LeftUp && _isSelected && contains)
@ -186,7 +186,7 @@ bool e2d::Button::dispatch(const MouseEvent & e)
} }
} }
return Node::dispatch(e); return Node::dispatch(e, handled);
} }
void e2d::Button::_render() void e2d::Button::_render()

View File

@ -78,60 +78,6 @@ e2d::Node::~Node()
} }
} }
void e2d::Node::_update()
{
if (!_visible)
return;
if (_children.empty())
{
_updateSelf();
}
else
{
// 遍历子节点
size_t i;
for (i = 0; i < _children.size(); ++i)
{
auto child = _children[i];
// 访问 Order 小于零的节点
if (child->getOrder() < 0)
{
child->_update();
}
else
{
break;
}
}
_updateSelf();
// 访问其他节点
for (; i < _children.size(); ++i)
_children[i]->_update();
}
}
void e2d::Node::_updateSelf()
{
if (_needTransform)
{
updateTransform();
if (_collider.isEnabled() &&
_collider.isCollisionNotify() &&
_collider.getShape() != Collider::Shape::None)
{
CollisionManager::getInstance()->__updateCollider(&_collider);
}
}
if (!Game::getInstance()->isPaused())
{
this->onUpdate();
}
}
void e2d::Node::_render() void e2d::Node::_render()
{ {
if (!_visible) if (!_visible)
@ -139,6 +85,7 @@ void e2d::Node::_render()
// 更新转换矩阵 // 更新转换矩阵
updateTransform(); updateTransform();
// 保留差别属性 // 保留差别属性
_extrapolate = this->getProperty(); _extrapolate = this->getProperty();
@ -154,10 +101,8 @@ void e2d::Node::_render()
if (_children.empty()) if (_children.empty())
{ {
// 转换渲染器的转换矩阵
pRT->SetTransform(_finalMatri); pRT->SetTransform(_finalMatri);
// 渲染自身 this->draw();
this->onRender();
} }
else else
{ {
@ -179,10 +124,8 @@ void e2d::Node::_render()
} }
} }
// 转换渲染器的转换矩阵
pRT->SetTransform(_finalMatri); pRT->SetTransform(_finalMatri);
// 渲染自身 this->draw();
this->onRender();
// 访问剩余节点 // 访问剩余节点
for (; i < _children.size(); ++i) for (; i < _children.size(); ++i)
@ -263,54 +206,51 @@ void e2d::Node::updateTransform()
_finalMatri = _finalMatri * _parent->_initialMatri; _finalMatri = _finalMatri * _parent->_initialMatri;
} }
// 更新碰撞体
_collider.recreate();
// 通知子节点进行转换 // 通知子节点进行转换
for (const auto& child : _children) for (const auto& child : _children)
{ {
child->_needTransform = true; child->_needTransform = true;
} }
// ¸üÐÂÅöײÌå
_collider.recreate();
if (_collider.isEnabled() &&
_collider.isCollisionNotify() &&
_collider.getShape() != Collider::Shape::None)
{
CollisionManager::getInstance()->__updateCollider(&_collider);
}
} }
bool e2d::Node::dispatch(const MouseEvent & e) bool e2d::Node::dispatch(const MouseEvent & e, bool handled)
{ {
if (_visible) if (_visible)
{ {
if (onEvent(e)) auto dispatcher = dynamic_cast<EventHandler*>(this);
return true; if (dispatcher)
dispatcher->handle(e);
for (size_t i = _children.size(); i >= 0 && i < _children.size(); --i) for (auto riter = _children.crbegin(); riter != _children.crend(); ++riter)
{ handled = (*riter)->dispatch(e, handled);
if (_children[i]->dispatch(e))
return true;
if (i == 0)
break;
}
} }
return false; return handled;
} }
bool e2d::Node::dispatch(const KeyEvent & e) bool e2d::Node::dispatch(const KeyEvent & e, bool handled)
{ {
if (_visible) if (_visible)
{ {
if (onEvent(e)) auto dispatcher = dynamic_cast<EventHandler*>(this);
return true; if (dispatcher)
dispatcher->handle(e);
for (size_t i = _children.size(); i >= 0 && i < _children.size(); --i) for (auto riter = _children.crbegin(); riter != _children.crend(); ++riter)
{ handled = (*riter)->dispatch(e, handled);
if (_children[i]->dispatch(e))
return true;
if (i == 0)
break;
}
} }
return false; return handled;
} }
void e2d::Node::_sortChildren() void e2d::Node::_sortChildren()

View File

@ -92,7 +92,7 @@ e2d::Image * e2d::Sprite::getImage() const
return _image; return _image;
} }
void e2d::Sprite::onRender() const void e2d::Sprite::draw() const
{ {
if (_image && _image->getBitmap()) if (_image && _image->getBitmap())
{ {

View File

@ -287,7 +287,7 @@ void e2d::Text::setOutlineJoin(LineJoin outlineJoin)
_style.outlineJoin = outlineJoin; _style.outlineJoin = outlineJoin;
} }
void e2d::Text::onRender() const void e2d::Text::draw() const
{ {
if (_textLayout) if (_textLayout)
{ {

View File

@ -808,6 +808,21 @@ protected:
}; };
// 消息处理
class EventHandler
{
public:
// 处理按键消息
virtual void handle(KeyEvent e) { }
// 处理鼠标消息
virtual void handle(MouseEvent e) { }
// 处理碰撞消息
virtual void handle(Collision collision) { }
};
// 资源 // 资源
class Resource class Resource
{ {
@ -982,24 +997,10 @@ public:
// 退出场景 // 退出场景
virtual void onExit() {} virtual void onExit() {}
// 按键消息
// 说明:返回 true 将阻止消息继续传递
virtual bool onEvent(KeyEvent e) { return false; }
// 鼠标消息
// 说明:返回 true 将阻止消息继续传递
virtual bool onEvent(MouseEvent e) { return false; }
// 碰撞消息
virtual void onEvent(Collision collision) { }
// 关闭窗口 // 关闭窗口
// 说明:返回 false 将阻止窗口关闭 // 说明:返回 false 将阻止窗口关闭
virtual bool onCloseWindow() { return true; } virtual bool onCloseWindow() { return true; }
// 重写这个函数,它将在每一帧画面刷新时执行
virtual void onUpdate() {}
// 添加节点到场景 // 添加节点到场景
void add( void add(
Node * child, /* 要添加的节点 */ Node * child, /* 要添加的节点 */
@ -1036,9 +1037,6 @@ public:
// 渲染场景画面 // 渲染场景画面
void render(); void render();
// 更新场景内容
void update();
// 分发鼠标消息 // 分发鼠标消息
void dispatch( void dispatch(
const MouseEvent& e const MouseEvent& e

View File

@ -46,22 +46,8 @@ public:
virtual ~Node(); virtual ~Node();
// 更新节点
virtual void onUpdate() {}
// 渲染节点 // 渲染节点
virtual void onRender() const {} virtual void draw() const {}
// 按键消息
// 说明:返回 true 将阻止消息向下传递
virtual bool onEvent(KeyEvent e) { return false; }
// 鼠标消息
// 说明:返回 true 将阻止消息向下传递
virtual bool onEvent(MouseEvent e) { return false; }
// 碰撞消息
virtual void onEvent(Collision collision) { }
// 获取节点显示状态 // 获取节点显示状态
virtual bool isVisible() const; virtual bool isVisible() const;
@ -398,23 +384,19 @@ public:
// 分发鼠标消息 // 分发鼠标消息
virtual bool dispatch( virtual bool dispatch(
const MouseEvent& e const MouseEvent& e,
bool handled
); );
// 分发按键消息 // 分发按键消息
virtual bool dispatch( virtual bool dispatch(
const KeyEvent& e const KeyEvent& e,
bool handled
); );
protected: protected:
E2D_DISABLE_COPY(Node); E2D_DISABLE_COPY(Node);
// 更新节点
virtual void _update();
// 更新自身
virtual void _updateSelf();
// 渲染节点 // 渲染节点
virtual void _render(); virtual void _render();
@ -461,9 +443,9 @@ protected:
Scene * _parentScene; Scene * _parentScene;
Node * _parent; Node * _parent;
Property _extrapolate; Property _extrapolate;
std::vector<Node*> _children;
D2D1::Matrix3x2F _initialMatri; D2D1::Matrix3x2F _initialMatri;
D2D1::Matrix3x2F _finalMatri; D2D1::Matrix3x2F _finalMatri;
std::vector<Node*> _children;
}; };
@ -521,7 +503,7 @@ public:
virtual Image * getImage() const; virtual Image * getImage() const;
// 渲染精灵 // 渲染精灵
virtual void onRender() const override; virtual void draw() const override;
protected: protected:
E2D_DISABLE_COPY(Sprite); E2D_DISABLE_COPY(Sprite);
@ -725,7 +707,7 @@ public:
); );
// 渲染文字 // 渲染文字
virtual void onRender() const override; virtual void draw() const override;
protected: protected:
E2D_DISABLE_COPY(Text); E2D_DISABLE_COPY(Text);
@ -822,7 +804,8 @@ public:
// 分发鼠标消息 // 分发鼠标消息
virtual bool dispatch( virtual bool dispatch(
const MouseEvent& e const MouseEvent& e,
bool handled
) override; ) override;
protected: protected: