增加按键消息、鼠标消息、碰撞消息

This commit is contained in:
Nomango 2018-07-16 22:11:27 +08:00
parent f6d044def0
commit d180c4dd74
28 changed files with 573 additions and 729 deletions

View File

@ -58,7 +58,6 @@ e2d::GC::~GC()
Player::destroyInstance();
SceneManager::destroyInstance();
ActionManager::destroyInstance();
InputManager::destroyInstance();
CollisionManager::destroyInstance();
}

View File

@ -44,7 +44,6 @@ void e2d::Game::start(bool cleanup)
auto timer = Timer::getInstance();
auto sceneManager = SceneManager::getInstance();
auto actionManager = ActionManager::getInstance();
auto inputManager = InputManager::getInstance();
// 显示窗口
::ShowWindow(window->getHWnd(), SW_SHOWNORMAL);
@ -75,7 +74,6 @@ void e2d::Game::start(bool cleanup)
input->update(); // 获取用户输入
timer->update(); // 更新定时器
actionManager->update(); // 更新动作管理器
inputManager->update(); // 更新输入监听器
sceneManager->update(); // 更新场景内容
renderer->render(); // 渲染游戏画面
GC::flush(); // 刷新内存池
@ -146,10 +144,6 @@ void e2d::Game::cleanup()
Timer::getInstance()->clearAllTasks();
// 清除所有动作
ActionManager::getInstance()->clearAll();
// 删除碰撞监听器
CollisionManager::getInstance()->clearAllListeners();
// 删除输入监听器
InputManager::getInstance()->clearAllListeners();
// 清空图片缓存
Image::clearCache();
// 清空音乐缓存

View File

@ -151,14 +151,14 @@ void e2d::Input::update()
ScreenToClient(Window::getInstance()->getHWnd(), &_mousePos);
}
bool e2d::Input::isDown(Key key)
bool e2d::Input::isDown(KeyCode key)
{
if (s_KeyBuffer[static_cast<int>(key)] & 0x80)
return true;
return false;
}
bool e2d::Input::isPress(Key key)
bool e2d::Input::isPress(KeyCode key)
{
if ((s_KeyBuffer[static_cast<int>(key)] & 0x80) &&
!(s_KeyRecordBuffer[static_cast<int>(key)] & 0x80))
@ -166,7 +166,7 @@ bool e2d::Input::isPress(Key key)
return false;
}
bool e2d::Input::isRelease(Key key)
bool e2d::Input::isRelease(KeyCode key)
{
if (!(s_KeyBuffer[static_cast<int>(key)] & 0x80) &&
(s_KeyRecordBuffer[static_cast<int>(key)] & 0x80))
@ -174,14 +174,14 @@ bool e2d::Input::isRelease(Key key)
return false;
}
bool e2d::Input::isDown(Mouse code)
bool e2d::Input::isDown(MouseCode code)
{
if (_mouseState.rgbButtons[static_cast<int>(code)] & 0x80)
return true;
return false;
}
bool e2d::Input::isPress(Mouse code)
bool e2d::Input::isPress(MouseCode code)
{
if ((_mouseState.rgbButtons[static_cast<int>(code)] & 0x80) &&
!(_mouseStateRecord.rgbButtons[static_cast<int>(code)] & 0x80))
@ -189,7 +189,7 @@ bool e2d::Input::isPress(Mouse code)
return false;
}
bool e2d::Input::isRelease(Mouse code)
bool e2d::Input::isRelease(MouseCode code)
{
if (!(_mouseState.rgbButtons[static_cast<int>(code)] & 0x80) &&
(_mouseStateRecord.rgbButtons[static_cast<int>(code)] & 0x80))

View File

@ -90,7 +90,7 @@ HWND e2d::Window::__create()
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpszClassName = L"Easy2DApp";
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wcex.lpfnWndProc = Window::WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG_PTR);
@ -385,6 +385,35 @@ LRESULT e2d::Window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
switch (message)
{
// 处理鼠标消息
case WM_LBUTTONUP:
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_MBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_RBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_MOUSEMOVE:
case WM_MOUSEWHEEL:
{
SceneManager::getInstance()->dispatch(MouseEvent(message, wParam, lParam));
}
result = 0;
hasHandled = true;
break;
// 处理按键消息
case WM_KEYDOWN:
case WM_KEYUP:
{
SceneManager::getInstance()->dispatch(KeyEvent(message, wParam, lParam));
}
result = 0;
hasHandled = true;
break;
// 处理窗口大小变化消息
case WM_SIZE:
{

View File

@ -1,34 +0,0 @@
#include "..\e2dcommon.h"
e2d::Collision::Collision()
: _active(nullptr)
, _passive(nullptr)
, _relation(Collider::Relation::Unknown)
{
}
e2d::Collision::Collision(Node* active, Node* passive, Collider::Relation relation)
: _active(active)
, _passive(passive)
, _relation(relation)
{
}
e2d::Collision::~Collision()
{
}
e2d::Node * e2d::Collision::getActive() const
{
return _active;
}
e2d::Node * e2d::Collision::getPassive() const
{
return _passive;
}
e2d::Collider::Relation e2d::Collision::getRelation() const
{
return _relation;
}

View File

@ -8,7 +8,7 @@ e2d::Resource::Resource(const String & fileName)
{
}
e2d::Resource::Resource(int resNameId, const String & resType)
e2d::Resource::Resource(size_t resNameId, const String & resType)
: _isResource(true)
, _fileName()
, _resNameId(resNameId)
@ -26,7 +26,7 @@ const e2d::String & e2d::Resource::getFileName() const
return _fileName;
}
int e2d::Resource::getResNameId() const
size_t e2d::Resource::getResNameId() const
{
return _resNameId;
}
@ -36,16 +36,9 @@ const e2d::String & e2d::Resource::getResType() const
return _resType;
}
int e2d::Resource::getKey() const
size_t e2d::Resource::getKey() const
{
if (_isResource)
{
return _resNameId;
}
else
{
return _fileName.getHashCode();
}
return _isResource ? _resNameId : _fileName.getHashCode();
}
bool e2d::Resource::operator>(const Resource &res) const

View File

@ -44,6 +44,22 @@ void e2d::Scene::update()
_root->_update();
}
void e2d::Scene::dispatch(const MouseEvent & e)
{
if (this->onMouseEvent(e))
{
_root->dispatch(e);
}
}
void e2d::Scene::dispatch(const KeyEvent & e)
{
if (this->onKeyEvent(e))
{
_root->dispatch(e);
}
}
void e2d::Scene::setAutoUpdate(bool bAutoUpdate)
{
_autoUpdate = bAutoUpdate;

View File

@ -357,7 +357,7 @@ int e2d::String::getLength() const
return static_cast<int>(_str.size());
}
unsigned int e2d::String::getHashCode() const
size_t e2d::String::getHashCode() const
{
std::hash<std::wstring> hash;
return hash(_str);

27
core/Event/Collision.cpp Normal file
View File

@ -0,0 +1,27 @@
#include "..\e2dcommon.h"
e2d::Collision::Collision()
: _node(nullptr)
, _relation(Collider::Relation::Unknown)
{
}
e2d::Collision::Collision(Node* node, Collider::Relation relation)
: _node(node)
, _relation(relation)
{
}
e2d::Collision::~Collision()
{
}
e2d::Node * e2d::Collision::getNode() const
{
return _node;
}
e2d::Collider::Relation e2d::Collision::getRelation() const
{
return _relation;
}

85
core/Event/KeyEvent.cpp Normal file
View File

@ -0,0 +1,85 @@
#include "..\e2dcommon.h"
e2d::KeyEvent::KeyEvent(UINT message, WPARAM wParam, LPARAM lParam)
: _code(KeyCode(wParam))
, _type(Type(message))
, _count(static_cast<int>((DWORD)lParam & 0x0000FFFF))
{
}
e2d::KeyCode e2d::KeyEvent::getCode() const
{
return _code;
}
int e2d::KeyEvent::getCount() const
{
return _count;
}
e2d::KeyEvent::Type e2d::KeyEvent::getType() const
{
return _type;
}
e2d::KeyCode e2d::KeyEvent::convertKeyCode(WPARAM wParam)
{
switch (wParam)
{
case 'A': return KeyCode::A;
case 'B': return KeyCode::B;
case 'C': return KeyCode::C;
case 'D': return KeyCode::D;
case 'E': return KeyCode::E;
case 'F': return KeyCode::F;
case 'G': return KeyCode::G;
case 'H': return KeyCode::H;
case 'I': return KeyCode::I;
case 'J': return KeyCode::J;
case 'K': return KeyCode::K;
case 'L': return KeyCode::L;
case 'M': return KeyCode::M;
case 'N': return KeyCode::N;
case 'O': return KeyCode::O;
case 'P': return KeyCode::P;
case 'Q': return KeyCode::Q;
case 'R': return KeyCode::R;
case 'S': return KeyCode::S;
case 'T': return KeyCode::T;
case 'U': return KeyCode::U;
case 'V': return KeyCode::V;
case 'W': return KeyCode::W;
case 'X': return KeyCode::X;
case 'Y': return KeyCode::Y;
case 'Z': return KeyCode::Z;
case '0': return KeyCode::Num0;
case '1': return KeyCode::Num1;
case '2': return KeyCode::Num2;
case '3': return KeyCode::Num3;
case '4': return KeyCode::Num4;
case '5': return KeyCode::Num5;
case '6': return KeyCode::Num6;
case '7': return KeyCode::Num7;
case '8': return KeyCode::Num8;
case '9': return KeyCode::Num9;
case VK_NUMPAD0: return KeyCode::Numpad0;
case VK_NUMPAD1: return KeyCode::Numpad1;
case VK_NUMPAD2: return KeyCode::Numpad2;
case VK_NUMPAD3: return KeyCode::Numpad3;
case VK_NUMPAD4: return KeyCode::Numpad4;
case VK_NUMPAD5: return KeyCode::Numpad5;
case VK_NUMPAD6: return KeyCode::Numpad6;
case VK_NUMPAD7: return KeyCode::Numpad7;
case VK_NUMPAD8: return KeyCode::Numpad8;
case VK_NUMPAD9: return KeyCode::Numpad9;
case VK_UP: return KeyCode::Up;
case VK_DOWN: return KeyCode::Down;
case VK_LEFT: return KeyCode::Left;
case VK_RIGHT: return KeyCode::Right;
case VK_RETURN: return KeyCode::Enter;
case VK_SPACE: return KeyCode::Space;
case VK_ESCAPE: return KeyCode::Esc;
default: return KeyCode::Unknown;
}
}

46
core/Event/MouseEvent.cpp Normal file
View File

@ -0,0 +1,46 @@
#include "..\e2dcommon.h"
e2d::MouseEvent::MouseEvent(UINT message, WPARAM wParam, LPARAM lParam)
: _pos(LOWORD(lParam), HIWORD(lParam))
, _shiftDown(GET_KEYSTATE_WPARAM(wParam) == MK_SHIFT)
, _ctrlDown(GET_KEYSTATE_WPARAM(wParam) == MK_CONTROL)
, _wheelDelta(GET_WHEEL_DELTA_WPARAM(wParam))
, _type(Type(message))
{
}
double e2d::MouseEvent::getX() const
{
return _pos.x;
}
double e2d::MouseEvent::getY() const
{
return _pos.y;
}
e2d::Point e2d::MouseEvent::getPos() const
{
return _pos;
}
bool e2d::MouseEvent::isShiftDown() const
{
return _shiftDown;
}
bool e2d::MouseEvent::isCtrlDown() const
{
return _ctrlDown;
}
double e2d::MouseEvent::getWheelDelta() const
{
return _wheelDelta;
}
e2d::MouseEvent::Type e2d::MouseEvent::getType() const
{
return _type;
}

View File

@ -70,13 +70,11 @@ void e2d::CollisionManager::__updateCollider(Collider* collider)
if (relation != Collider::Relation::Unknown &&
relation != Collider::Relation::Disjoin)
{
_collision = Collision(active, passive, relation);
active->onCollision(_collision);
// 更新碰撞监听器
CollisionManager::__updateListeners();
Collision collision(passive, relation);
SceneManager::getInstance()->getCurrentScene()->onCollision(collision);
active->onCollision(collision);
}
}
_collision = Collision();
}
void e2d::CollisionManager::addName(const String & name1, const String & name2)
@ -105,7 +103,7 @@ bool e2d::CollisionManager::isCollidable(Node * node1, Node * node2)
bool e2d::CollisionManager::isCollidable(const String & name1, const String & name2)
{
UINT hashName1 = name1.getHashCode(),
size_t hashName1 = name1.getHashCode(),
hashName2 = name2.getHashCode();
auto pair1 = std::make_pair(hashName1, hashName2),
pair2 = std::make_pair(hashName2, hashName1);
@ -118,140 +116,3 @@ bool e2d::CollisionManager::isCollidable(const String & name1, const String & na
}
return false;
}
e2d::Collision e2d::CollisionManager::getCollision() const
{
return _collision;
}
void e2d::CollisionManager::__updateListeners()
{
if (_listeners.empty() || Game::getInstance()->isPaused())
return;
for (size_t i = 0; i < _listeners.size(); ++i)
{
auto listener = _listeners[i];
// 清除已停止的监听器
if (listener->_stopped)
{
GC::safeRelease(listener);
_listeners.erase(_listeners.begin() + i);
}
else
{
// 更新监听器
listener->_update();
++i;
}
}
}
e2d::Listener * e2d::CollisionManager::addListener(const Function& func, const String& name, bool paused)
{
auto listener = new (e2d::autorelease) Listener(func, name, paused);
GC::retain(listener);
_listeners.push_back(listener);
return listener;
}
void e2d::CollisionManager::addListener(Listener * listener)
{
if (listener)
{
auto iter = std::find(_listeners.begin(), _listeners.end(), listener);
if (iter == _listeners.end())
{
GC::retain(listener);
_listeners.push_back(listener);
}
}
}
void e2d::CollisionManager::removeListener(Listener * listener)
{
if (listener)
{
auto iter = std::find(_listeners.begin(), _listeners.end(), listener);
if (iter != _listeners.end())
{
GC::safeRelease(listener);
_listeners.erase(iter);
}
}
}
void e2d::CollisionManager::stopListener(const String& name)
{
if (_listeners.empty() || name.isEmpty())
return;
for (auto listener : _listeners)
{
if (listener->_name == name)
{
listener->stop();
}
}
}
void e2d::CollisionManager::startListener(const String& name)
{
if (_listeners.empty() || name.isEmpty())
return;
for (auto listener : _listeners)
{
if (listener->_name == name)
{
listener->start();
}
}
}
void e2d::CollisionManager::removeListener(const String& name)
{
if (_listeners.empty() || name.isEmpty())
return;
for (auto listener : _listeners)
{
if (listener->_name == name)
{
listener->_stopped = true;
}
}
}
void e2d::CollisionManager::stopAllListeners()
{
for (auto listener : _listeners)
{
listener->stop();
}
}
void e2d::CollisionManager::startAllListeners()
{
for (auto listener : _listeners)
{
listener->start();
}
}
void e2d::CollisionManager::removeAllListeners()
{
for (auto listener : _listeners)
{
listener->_stopped = true;
}
}
void e2d::CollisionManager::clearAllListeners()
{
for (auto listener : _listeners)
{
GC::release(listener);
}
_listeners.clear();
}

View File

@ -1,162 +0,0 @@
#include "..\e2dbase.h"
#include "..\e2dmanager.h"
#include "..\e2dtool.h"
e2d::InputManager * e2d::InputManager::_instance = nullptr;
e2d::InputManager * e2d::InputManager::getInstance()
{
if (!_instance)
_instance = new (std::nothrow) InputManager;
return _instance;
}
void e2d::InputManager::destroyInstance()
{
if (_instance)
{
delete _instance;
_instance = nullptr;
}
}
e2d::InputManager::InputManager()
{
}
e2d::InputManager::~InputManager()
{
}
e2d::Listener * e2d::InputManager::addListener(const Function& func, const String& name, bool paused)
{
auto listener = new (e2d::autorelease) Listener(func, name, paused);
GC::retain(listener);
_listeners.push_back(listener);
return listener;
}
void e2d::InputManager::addListener(Listener * listener)
{
if (listener)
{
auto iter = std::find(_listeners.begin(), _listeners.end(), listener);
if (iter == _listeners.end())
{
GC::retain(listener);
_listeners.push_back(listener);
}
}
}
void e2d::InputManager::removeListener(Listener * listener)
{
if (listener)
{
auto iter = std::find(_listeners.begin(), _listeners.end(), listener);
if (iter != _listeners.end())
{
GC::safeRelease(listener);
_listeners.erase(iter);
}
}
}
void e2d::InputManager::stopListener(const String& name)
{
if (_listeners.empty() || name.isEmpty())
return;
for (auto listener : _listeners)
{
if (listener->_name == name)
{
listener->stop();
}
}
}
void e2d::InputManager::startListener(const String& name)
{
if (_listeners.empty() || name.isEmpty())
return;
for (auto listener : _listeners)
{
if (listener->_name == name)
{
listener->start();
}
}
}
void e2d::InputManager::removeListener(const String& name)
{
if (_listeners.empty() || name.isEmpty())
return;
for (auto listener : _listeners)
{
if (listener->_name == name)
{
listener->_stopped = true;
}
}
}
void e2d::InputManager::stopAllListeners()
{
for (auto listener : _listeners)
{
listener->stop();
}
}
void e2d::InputManager::startAllListeners()
{
for (auto listener : _listeners)
{
listener->start();
}
}
void e2d::InputManager::removeAllListeners()
{
for (auto listener : _listeners)
{
listener->_stopped = true;
}
}
void e2d::InputManager::clearAllListeners()
{
for (auto listener : _listeners)
{
GC::release(listener);
}
_listeners.clear();
}
void e2d::InputManager::update()
{
if (_listeners.empty() || Game::getInstance()->isPaused())
return;
for (size_t i = 0; i < _listeners.size(); ++i)
{
auto listener = _listeners[i];
// 清除已停止的监听器
if (listener->_stopped)
{
GC::safeRelease(listener);
_listeners.erase(_listeners.begin() + i);
}
else
{
// 更新监听器
listener->_update();
++i;
}
}
}

View File

@ -183,3 +183,25 @@ void e2d::SceneManager::render()
}
}
}
void e2d::SceneManager::dispatch(const MouseEvent & e)
{
if (_transition != nullptr)
return;
if (_currScene)
{
_currScene->dispatch(e);
}
}
void e2d::SceneManager::dispatch(const KeyEvent & e)
{
if (_transition != nullptr)
return;
if (_currScene)
{
_currScene->dispatch(e);
}
}

View File

@ -185,7 +185,7 @@ void e2d::Button::_fixedUpdate()
if (_enabled && _visible && _normal)
{
if (input->isRelease(Input::Mouse::Left))
if (input->isRelease(MouseCode::Left))
{
// 鼠标左键抬起时,判断鼠标坐标是否在按钮内部
if (_isSelected &&
@ -197,7 +197,7 @@ void e2d::Button::_fixedUpdate()
_isSelected = false;
}
if (input->isPress(Input::Mouse::Left))
if (input->isPress(MouseCode::Left))
{
if (_normal->containsPoint(input->getMousePos()))
{
@ -207,7 +207,7 @@ void e2d::Button::_fixedUpdate()
}
}
if (_isSelected && input->isDown(Input::Mouse::Left))
if (_isSelected && input->isDown(MouseCode::Left))
{
if (_normal->containsPoint(input->getMousePos()))
{

View File

@ -94,9 +94,6 @@ void e2d::Node::_update()
}
else
{
// 子节点排序
_sortChildren();
// 遍历子节点
size_t i;
for (i = 0; i < _children.size(); ++i)
@ -286,6 +283,82 @@ void e2d::Node::updateTransform()
}
}
bool e2d::Node::dispatch(const MouseEvent & e)
{
if (_children.empty())
{
return onMouseEvent(e);
}
else
{
size_t i;
for (i = 0; i < _children.size(); ++i)
{
auto child = _children[i];
if (child->getOrder() < 0)
{
if (!child->dispatch(e))
{
return false;
}
}
else
{
break;
}
}
if (!onMouseEvent(e))
{
return false;
}
for (; i < _children.size(); ++i)
if (!_children[i]->dispatch(e))
return false;
return true;
}
}
bool e2d::Node::dispatch(const KeyEvent & e)
{
if (_children.empty())
{
return onKeyEvent(e);
}
else
{
size_t i;
for (i = 0; i < _children.size(); ++i)
{
auto child = _children[i];
if (child->getOrder() < 0)
{
if (!child->dispatch(e))
{
return false;
}
}
else
{
break;
}
}
if (!onKeyEvent(e))
{
return false;
}
for (; i < _children.size(); ++i)
if (!_children[i]->dispatch(e))
return false;
return true;
}
}
void e2d::Node::_sortChildren()
{
if (_needSort)
@ -322,7 +395,7 @@ e2d::String e2d::Node::getName() const
return _name;
}
unsigned int e2d::Node::getHashName() const
size_t e2d::Node::getHashName() const
{
return _hashName;
}
@ -680,7 +753,7 @@ e2d::Scene * e2d::Node::getParentScene() const
std::vector<e2d::Node*> e2d::Node::getChildren(const String& name) const
{
std::vector<Node*> vChildren;
unsigned int hash = name.getHashCode();
size_t hash = name.getHashCode();
for (auto child : _children)
{
@ -695,7 +768,7 @@ std::vector<e2d::Node*> e2d::Node::getChildren(const String& name) const
e2d::Node * e2d::Node::getChild(const String& name) const
{
unsigned int hash = name.getHashCode();
size_t hash = name.getHashCode();
for (auto child : _children)
{
@ -765,7 +838,7 @@ void e2d::Node::removeChildren(const String& childName)
}
// 计算名称 Hash 值
unsigned int hash = childName.getHashCode();
size_t hash = childName.getHashCode();
size_t size = _children.size();
for (size_t i = 0; i < size; ++i)

View File

@ -1,57 +0,0 @@
#include "..\e2dcommon.h"
#include "..\e2dtool.h"
e2d::Listener::Listener()
: _name()
, _callback()
, _running(true)
, _stopped(false)
{
}
e2d::Listener::Listener(const Function & func, const String & name, bool paused)
: _name(name)
, _callback(func)
, _running(!paused)
, _stopped(false)
{
}
void e2d::Listener::_update()
{
if (_callback)
{
_callback();
}
}
bool e2d::Listener::isRunning() const
{
return _running;
}
e2d::String e2d::Listener::getName() const
{
return _name;
}
void e2d::Listener::setName(const String & name)
{
_name = name;
}
void e2d::Listener::setFunc(const Function & func)
{
_callback = func;
}
void e2d::Listener::start()
{
_running = true;
}
void e2d::Listener::stop()
{
_running = false;
}

View File

@ -229,73 +229,6 @@ private:
// 输入设备
class Input
{
public:
// 報炎囚峙
enum class Mouse : int
{
Left, /* 報炎恣囚 */
Right, /* 報炎嘔囚 */
Middle /* 報炎嶄囚 */
};
// 囚徒囚峙
enum class Key : int
{
Up = 0xC8,
Left = 0xCB,
Right = 0xCD,
Down = 0xD0,
Enter = 0x1C,
Space = 0x39,
Esc = 0x01,
Q = 0x10,
W = 0x11,
E = 0x12,
R = 0x13,
T = 0x14,
Y = 0x15,
U = 0x16,
I = 0x17,
O = 0x18,
P = 0x19,
A = 0x1E,
S = 0x1F,
D = 0x20,
F = 0x21,
G = 0x22,
H = 0x23,
J = 0x24,
K = 0x25,
L = 0x26,
Z = 0x2C,
X = 0x2D,
C = 0x2E,
V = 0x2F,
B = 0x30,
N = 0x31,
M = 0x32,
Num1 = 0x02,
Num2 = 0x03,
Num3 = 0x04,
Num4 = 0x05,
Num5 = 0x06,
Num6 = 0x07,
Num7 = 0x08,
Num8 = 0x09,
Num9 = 0x0A,
Num0 = 0x0B,
Numpad7 = 0x47,
Numpad8 = 0x48,
Numpad9 = 0x49,
Numpad4 = 0x4B,
Numpad5 = 0x4C,
Numpad6 = 0x4D,
Numpad1 = 0x4F,
Numpad2 = 0x50,
Numpad3 = 0x51,
Numpad0 = 0x52
};
public:
// 获取输入设备实例
static Input * getInstance();
@ -305,32 +238,32 @@ public:
// 检测键盘某按键是否正被按下
bool isDown(
Key key
KeyCode key
);
// 检测键盘某按键是否被点击
bool isPress(
Key key
KeyCode key
);
// 检测键盘某按键是否正在松开
bool isRelease(
Key key
KeyCode key
);
// 检测鼠标按键是否正被按下
bool isDown(
Mouse code
MouseCode code
);
// 检测鼠标按键是否被点击
bool isPress(
Mouse code
MouseCode code
);
// 检测鼠标按键是否正在松开
bool isRelease(
Mouse code
MouseCode code
);
// 获得鼠标X轴坐标值

View File

@ -142,7 +142,7 @@ public:
int getLength() const;
// 获取该字符串的散列值
unsigned int getHashCode() const;
size_t getHashCode() const;
// 获取 Unicode 字符串
std::wstring getWString() const;
@ -440,6 +440,167 @@ public:
};
// 鼠标键值
enum class MouseCode : int
{
Left, /* 鼠标左键 */
Right, /* 鼠标右键 */
Middle /* 鼠标中键 */
};
// 键盘键值
enum class KeyCode : int
{
Unknown = 0,
Up = 0xC8,
Left = 0xCB,
Right = 0xCD,
Down = 0xD0,
Enter = 0x1C,
Space = 0x39,
Esc = 0x01,
Q = 0x10,
W = 0x11,
E = 0x12,
R = 0x13,
T = 0x14,
Y = 0x15,
U = 0x16,
I = 0x17,
O = 0x18,
P = 0x19,
A = 0x1E,
S = 0x1F,
D = 0x20,
F = 0x21,
G = 0x22,
H = 0x23,
J = 0x24,
K = 0x25,
L = 0x26,
Z = 0x2C,
X = 0x2D,
C = 0x2E,
V = 0x2F,
B = 0x30,
N = 0x31,
M = 0x32,
Num1 = 0x02,
Num2 = 0x03,
Num3 = 0x04,
Num4 = 0x05,
Num5 = 0x06,
Num6 = 0x07,
Num7 = 0x08,
Num8 = 0x09,
Num9 = 0x0A,
Num0 = 0x0B,
Numpad7 = 0x47,
Numpad8 = 0x48,
Numpad9 = 0x49,
Numpad4 = 0x4B,
Numpad5 = 0x4C,
Numpad6 = 0x4D,
Numpad1 = 0x4F,
Numpad2 = 0x50,
Numpad3 = 0x51,
Numpad0 = 0x52,
};
// 按键消息
class KeyEvent
{
public:
// 按键消息类型
enum class Type : int
{
Down = 0x0100, // 按下
Up // 抬起
};
public:
explicit KeyEvent(
UINT message,
WPARAM wParam,
LPARAM lParam
);
// 获取按键键值
KeyCode getCode() const;
// 获取按键次数
int getCount() const;
// 获取事件类型
KeyEvent::Type getType() const;
// VK 键值转换
static KeyCode convertKeyCode(
WPARAM wParam
);
protected:
int _count;
KeyCode _code;
KeyEvent::Type _type;
};
// 鼠标消息
class MouseEvent
{
public:
// 鼠标消息类型
enum class Type : int
{
Move = 0x0200, // 鼠标移动
LeftDown, // 鼠标左键按下
LeftUp, // 鼠标左键抬起
LeftDoubleClick, // 鼠标左键双击
RightDown, // 鼠标右键按下
RightUp, // 鼠标右键抬起
RightDoubleClick, // 鼠标右键双击
MiddleDown, // 鼠标中键按下
MiddleUp, // 鼠标中键抬起
MiddleDoubleClick, // 鼠标中键双击
Wheel // 滑动滚轮
};
public:
explicit MouseEvent(
UINT message,
WPARAM wParam,
LPARAM lParam
);
double getX() const;
double getY() const;
Point getPos() const;
// 获取事件类型
MouseEvent::Type getType() const;
double getWheelDelta() const;
// Shift 键是否按下
bool isShiftDown() const;
// Ctrl 键是否按下
bool isCtrlDown() const;
protected:
bool _shiftDown;
bool _ctrlDown;
double _wheelDelta;
Point _pos;
MouseEvent::Type _type;
};
class Node;
// 碰撞体
@ -466,7 +627,7 @@ public:
};
public:
Collider(
explicit Collider(
Node * parent
);
@ -549,26 +710,21 @@ class Collision
public:
Collision();
Collision(
Node* active,
Node* passive,
explicit Collision(
Node* node,
Collider::Relation relation
);
~Collision();
// 获取发生碰撞的主动方
Node* getActive() const;
// 获取发生碰撞的被动方
Node* getPassive() const;
// 获取发生碰撞节点
Node* getNode() const;
// 获取交集关系
Collider::Relation getRelation() const;
protected:
Node * _active;
Node* _passive;
Node* _node;
Collider::Relation _relation;
};
@ -582,7 +738,7 @@ public:
);
Resource(
int resNameId, /* 资源名称 */
size_t resNameId, /* 资源名称 */
const String& resType /* 资源类型 */
);
@ -591,11 +747,11 @@ public:
const String& getFileName() const;
int getResNameId() const;
size_t getResNameId() const;
const String& getResType() const;
int getKey() const;
size_t getKey() const;
// 比较运算符
bool operator> (const Resource &) const;
@ -605,7 +761,7 @@ public:
protected:
bool _isResource;
int _resNameId;
size_t _resNameId;
String _resType;
String _fileName;
};
@ -741,13 +897,25 @@ public:
virtual ~Scene();
// 重写这个函数,它将在进入这个场景时自动执行
// 进入场景
virtual void onEnter() {}
// 重写这个函数,它将在离开这个场景时自动执行
// 退出场景
virtual void onExit() {}
// 重写这个函数,它将在关闭窗口时执行(返回 false 将阻止窗口关闭)
// 按键消息
// 说明:返回 false 将阻止消息继续传递
virtual bool onKeyEvent(KeyEvent e) { return true; }
// 鼠标消息
// 说明:返回 false 将阻止消息继续传递
virtual bool onMouseEvent(MouseEvent e) { return true; }
// 碰撞消息
virtual void onCollision(Collision collision) { }
// 关闭窗口
// 说明:返回 false 将阻止窗口关闭
virtual bool onCloseWindow() { return true; }
// 重写这个函数,它将在每一帧画面刷新时执行
@ -797,6 +965,16 @@ public:
// 更新场景内容
void update();
// 分发鼠标消息
void dispatch(
const MouseEvent& e
);
// 分发按键消息
void dispatch(
const KeyEvent& e
);
protected:
E2D_DISABLE_COPY(Scene);

View File

@ -52,6 +52,16 @@ public:
// 渲染场景画面
void render();
// 分发鼠标消息
void dispatch(
const MouseEvent& e
);
// 分发按键消息
void dispatch(
const KeyEvent& e
);
private:
SceneManager();
@ -166,81 +176,6 @@ private:
};
class Listener;
// 用户输入管理器
class InputManager
{
friend class Node;
public:
// 获取碰撞体管理器实例
static InputManager * getInstance();
// 销毁实例
static void destroyInstance();
// 添加输入监听
Listener * addListener(
const Function& func, /* 监听到用户输入时的执行函数 */
const String& name = L"", /* 监听器名称 */
bool paused = false /* 是否暂停 */
);
// 添加碰撞监听
void addListener(
Listener * listener /* 监听器 */
);
// 移除监听器
void removeListener(
Listener * listener /* 监听器 */
);
// 启动输入监听
void startListener(
const String& name
);
// 停止输入监听
void stopListener(
const String& name
);
// 移除输入监听
void removeListener(
const String& name
);
// 启动所有监听器
void startAllListeners();
// 停止所有监听器
void stopAllListeners();
// 移除所有监听器
void removeAllListeners();
// 强制清空所有监听器
void clearAllListeners();
// 更新监听器
void update();
private:
InputManager();
~InputManager();
E2D_DISABLE_COPY(InputManager);
private:
std::vector<Listener*> _listeners;
static InputManager * _instance;
};
// 碰撞体管理器
class CollisionManager
{
@ -277,53 +212,6 @@ public:
const String& name2
);
// 获取碰撞事件
Collision getCollision() const;
// 添加碰撞监听
Listener * addListener(
const Function& func, /* 监听到碰撞时的执行函数 */
const String& name = L"", /* 监听器名称 */
bool paused = false /* 是否暂停 */
);
// 添加碰撞监听
void addListener(
Listener * listener /* 监听器 */
);
// 移除监听器
void removeListener(
Listener * listener /* 监听器 */
);
// 启动碰撞监听
void startListener(
const String& name
);
// 停止碰撞监听
void stopListener(
const String& name
);
// 移除碰撞监听
void removeListener(
const String& name
);
// 启动所有监听器
void startAllListeners();
// 停止所有监听器
void stopAllListeners();
// 移除所有监听器
void removeAllListeners();
// 强制清除所有监听器
void clearAllListeners();
private:
CollisionManager();
@ -346,14 +234,9 @@ private:
Collider* collider
);
// 更新监听器
void __updateListeners();
private:
Collision _collision;
std::vector<Collider*> _colliders;
std::vector<Listener*> _listeners;
std::set<std::pair<UINT, UINT>> _collisionList;
std::set<std::pair<size_t, size_t>> _collisionList;
static CollisionManager * _instance;
};

View File

@ -50,10 +50,16 @@ public:
// 渲染节点
virtual void onRender() {}
// 节点发生碰撞
virtual void onCollision(
Collision other
) {}
// 按键消息
// 说明:返回 false 将阻止消息继续传递
virtual bool onKeyEvent(KeyEvent e) { return true; }
// 鼠标消息
// 说明:返回 false 将阻止消息继续传递
virtual bool onMouseEvent(MouseEvent e) { return true; }
// 碰撞消息
virtual void onCollision(Collision collision) { }
// 获取节点显示状态
virtual bool isVisible() const;
@ -72,7 +78,7 @@ public:
virtual String getName() const;
// 获取节点名称的 Hash 值
virtual unsigned int getHashName() const;
virtual size_t getHashName() const;
// 获取节点绘图顺序
virtual int getOrder() const;
@ -388,6 +394,16 @@ public:
// 更新转换矩阵
void updateTransform();
// 分发鼠标消息
bool dispatch(
const MouseEvent& e
);
// 分发按键消息
bool dispatch(
const KeyEvent& e
);
protected:
E2D_DISABLE_COPY(Node);
@ -422,7 +438,7 @@ protected:
protected:
String _name;
unsigned _hashName;
size_t _hashName;
float _posX;
float _posY;
float _width;

View File

@ -377,59 +377,6 @@ private:
};
class InputManager;
class CollisionManager;
// 监听器
class Listener :
public Ref
{
friend class InputManager;
friend class CollisionManager;
public:
Listener();
explicit Listener(
const Function& func,
const String& name,
bool paused
);
// 启动监听
void start();
// 停止监听
void stop();
// 获取监听器运行状态
bool isRunning() const;
// 获取名称
String getName() const;
// 设置名称
void setName(
const String& name
);
// 设置监听回调函数
void setFunc(
const Function& func
);
protected:
// 更新监听器状态
virtual void _update();
protected:
bool _running;
bool _stopped;
String _name;
Function _callback;
};
// 数据管理工具
class Data
{

View File

@ -93,7 +93,6 @@
<ClCompile Include="..\..\core\Node\ToggleButton.cpp" />
<ClCompile Include="..\..\core\Tool\Data.cpp" />
<ClCompile Include="..\..\core\Tool\File.cpp" />
<ClCompile Include="..\..\core\Tool\Listener.cpp" />
<ClCompile Include="..\..\core\Tool\Music.cpp" />
<ClCompile Include="..\..\core\Tool\Path.cpp" />
<ClCompile Include="..\..\core\Tool\Player.cpp" />

View File

@ -212,9 +212,6 @@
<ClCompile Include="..\..\core\Tool\Data.cpp">
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Tool\Listener.cpp">
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Tool\Music.cpp">
<Filter>Tool</Filter>
</ClCompile>

View File

@ -237,7 +237,6 @@
<ClCompile Include="..\..\core\Node\ToggleButton.cpp" />
<ClCompile Include="..\..\core\Tool\Data.cpp" />
<ClCompile Include="..\..\core\Tool\File.cpp" />
<ClCompile Include="..\..\core\Tool\Listener.cpp" />
<ClCompile Include="..\..\core\Tool\Music.cpp" />
<ClCompile Include="..\..\core\Tool\Path.cpp" />
<ClCompile Include="..\..\core\Tool\Player.cpp" />

View File

@ -212,9 +212,6 @@
<ClCompile Include="..\..\core\Tool\Data.cpp">
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Tool\Listener.cpp">
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Tool\Music.cpp">
<Filter>Tool</Filter>
</ClCompile>

View File

@ -222,7 +222,6 @@
<ClCompile Include="..\..\core\Base\Time.cpp" />
<ClCompile Include="..\..\core\Base\Window.cpp" />
<ClCompile Include="..\..\core\Common\Collider.cpp" />
<ClCompile Include="..\..\core\Common\Collision.cpp" />
<ClCompile Include="..\..\core\Common\Color.cpp" />
<ClCompile Include="..\..\core\Common\Config.cpp" />
<ClCompile Include="..\..\core\Common\Font.cpp" />
@ -239,9 +238,11 @@
<ClCompile Include="..\..\core\Custom\SystemException.cpp" />
<ClCompile Include="..\..\core\Custom\TextRenderer.cpp" />
<ClCompile Include="..\..\core\Custom\VoiceCallback.cpp" />
<ClCompile Include="..\..\core\Event\Collision.cpp" />
<ClCompile Include="..\..\core\Event\KeyEvent.cpp" />
<ClCompile Include="..\..\core\Event\MouseEvent.cpp" />
<ClCompile Include="..\..\core\Manager\ActionManager.cpp" />
<ClCompile Include="..\..\core\Manager\CollisionManager.cpp" />
<ClCompile Include="..\..\core\Manager\InputManager.cpp" />
<ClCompile Include="..\..\core\Manager\SceneManager.cpp" />
<ClCompile Include="..\..\core\Node\Button.cpp" />
<ClCompile Include="..\..\core\Node\ToggleButton.cpp" />
@ -256,7 +257,6 @@
<ClCompile Include="..\..\core\Node\Text.cpp" />
<ClCompile Include="..\..\core\Tool\Data.cpp" />
<ClCompile Include="..\..\core\Tool\File.cpp" />
<ClCompile Include="..\..\core\Tool\Listener.cpp" />
<ClCompile Include="..\..\core\Tool\Music.cpp" />
<ClCompile Include="..\..\core\Tool\Path.cpp" />
<ClCompile Include="..\..\core\Tool\Player.cpp" />

View File

@ -28,6 +28,9 @@
<Filter Include="Custom">
<UniqueIdentifier>{3475b59d-d50c-43b1-8334-bcb9e1703ed2}</UniqueIdentifier>
</Filter>
<Filter Include="Event">
<UniqueIdentifier>{6c9657de-02d5-4d3b-9e1d-bc921eb5aea3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\core\Base\Input.cpp">
@ -174,9 +177,6 @@
<ClCompile Include="..\..\core\Custom\TextRenderer.cpp">
<Filter>Custom</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Tool\Listener.cpp">
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Common\Font.cpp">
<Filter>Common</Filter>
</ClCompile>
@ -240,11 +240,14 @@
<ClCompile Include="..\..\core\Manager\CollisionManager.cpp">
<Filter>Manager</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Manager\InputManager.cpp">
<Filter>Manager</Filter>
<ClCompile Include="..\..\core\Event\MouseEvent.cpp">
<Filter>Event</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Common\Collision.cpp">
<Filter>Common</Filter>
<ClCompile Include="..\..\core\Event\KeyEvent.cpp">
<Filter>Event</Filter>
</ClCompile>
<ClCompile Include="..\..\core\Event\Collision.cpp">
<Filter>Event</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>