Slightly optimized

This commit is contained in:
werelone 2017-09-12 12:53:34 +08:00
parent 183c7bfcea
commit 9471ff79c5
13 changed files with 156 additions and 152 deletions

View File

@ -8,13 +8,13 @@
#pragma comment(lib, "winmm.lib") #pragma comment(lib, "winmm.lib")
// Application 的唯一实例 // App 的唯一实例
static Application * s_pInstance = nullptr; static App * s_pInstance = nullptr;
// 坐标原点的物理坐标 // 坐标原点的物理坐标
static int originX = 0; static int originX = 0;
static int originY = 0; static int originY = 0;
Application::Application() : App::App() :
m_currentScene(nullptr), m_currentScene(nullptr),
m_nextScene(nullptr), m_nextScene(nullptr),
m_bRunning(false), m_bRunning(false),
@ -23,40 +23,40 @@ Application::Application() :
m_nHeight(0), m_nHeight(0),
m_nWindowMode(0) m_nWindowMode(0)
{ {
assert(!s_pInstance); // 不能同时存在两个 Application 实例 assert(!s_pInstance); // 不能同时存在两个 App 实例
s_pInstance = this; // 保存实例对象 s_pInstance = this; // 保存实例对象
setFPS(60); // 默认 FPS 为 60 setFPS(60); // 默认 FPS 为 60
} }
Application::~Application() App::~App()
{ {
destory(); // 销毁 Application destory(); // 销毁 App
} }
Application * Application::get() App * App::get()
{ {
assert(s_pInstance); // 断言实例存在 assert(s_pInstance); // 断言实例存在
return s_pInstance; // 获取 Application 的唯一实例 return s_pInstance; // 获取 App 的唯一实例
} }
void Application::setOrigin(int originX, int originY) void App::setOrigin(int originX, int originY)
{ {
::originX = originX; ::originX = originX;
::originY = originY; ::originY = originY;
setorigin(originX, originY); setorigin(originX, originY);
} }
int Application::getOriginX() int App::getOriginX()
{ {
return ::originX; return ::originX;
} }
int Application::getOriginY() int App::getOriginY()
{ {
return ::originY; return ::originY;
} }
int Application::run() int App::run()
{ {
// 开启批量绘图 // 开启批量绘图
BeginBatchDraw(); BeginBatchDraw();
@ -115,7 +115,7 @@ int Application::run()
return 0; return 0;
} }
void Application::_initGraph() void App::_initGraph()
{ {
// 创建绘图环境 // 创建绘图环境
initgraph(m_nWidth, m_nHeight, m_nWindowMode); initgraph(m_nWidth, m_nHeight, m_nWindowMode);
@ -152,7 +152,7 @@ void Application::_initGraph()
} }
} }
void Application::_mainLoop() void App::_mainLoop()
{ {
// 游戏暂停 // 游戏暂停
if (m_bPause) if (m_bPause)
@ -178,7 +178,7 @@ void Application::_mainLoop()
FreePool::__flush(); // 刷新内存池 FreePool::__flush(); // 刷新内存池
} }
void Application::createWindow(int width, int height, int mode) void App::createWindow(int width, int height, int mode)
{ {
// 保存窗口信息 // 保存窗口信息
m_nWidth = width; m_nWidth = width;
@ -188,7 +188,7 @@ void Application::createWindow(int width, int height, int mode)
_initGraph(); _initGraph();
} }
void Application::createWindow(tstring title, int width, int height, int mode) void App::createWindow(tstring title, int width, int height, int mode)
{ {
// 保存窗口信息 // 保存窗口信息
m_nWidth = width; m_nWidth = width;
@ -199,43 +199,37 @@ void Application::createWindow(tstring title, int width, int height, int mode)
_initGraph(); _initGraph();
} }
void Application::setWindowSize(int width, int height) void App::setWindowSize(int width, int height)
{ {
// 游戏正在运行时才允许修改窗口大小 // 游戏正在运行时才允许修改窗口大小
assert(m_bRunning); assert(m_bRunning);
// 重启窗口 // 获取屏幕分辨率
closegraph(); int screenWidth = GetSystemMetrics(SM_CXSCREEN);
/* 重启窗口会导致内存占用急剧增加,也许是 EasyX 遗留的 BUG已向 yangw80 报告了这个情况 */ int screenHeight = GetSystemMetrics(SM_CYSCREEN);
initgraph(width, height, m_nWindowMode); // 获取窗口大小(包含菜单栏)
CRect rcWindow;
/* EasyX 不支持用 Windows API 修改窗口大小 */ GetWindowRect(GetHWnd(), &rcWindow);
///////////////////////////////////////////////////////////////////////////////// // 获取客户区大小
// // 获取屏幕分辨率 CRect rcClient;
// int screenWidth = GetSystemMetrics(SM_CXSCREEN); GetClientRect(GetHWnd(), &rcClient);
// int screenHeight = GetSystemMetrics(SM_CYSCREEN); // 计算边框大小
// // 获取窗口大小(包含菜单栏) width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left);
// CRect rcWindow; height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top);
// GetWindowRect(GetHWnd(), &rcWindow); // 销毁当前窗口
// // 获取客户区大小 // DestroyWindow(GetHWnd());/* 无法操作多线程导致失效 */
// CRect rcClient; // 修改窗口大小,并设置窗口在屏幕居中
// GetClientRect(GetHWnd(), &rcClient); SetWindowPos(GetHWnd(), HWND_TOP,
// // 计算边框大小 (screenWidth - width) / 2,
// width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left); (screenHeight - height) / 2,
// height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top); width,
// // 修改窗口大小,并设置窗口在屏幕居中 height,
// SetWindowPos( SWP_SHOWWINDOW);
// GetHWnd(), // 重置窗口属性
// HWND_TOP, reset();
// (screenWidth - width) / 2,
// (screenHeight - height) / 2,
// width,
// height,
// SWP_SHOWWINDOW | SWP_NOREDRAW);
//////////////////////////////////////////////////////////////////////////////////
} }
void Application::setWindowText(tstring title) void App::setWindowText(tstring title)
{ {
// 设置窗口标题 // 设置窗口标题
SetWindowText(GetHWnd(), title.c_str()); SetWindowText(GetHWnd(), title.c_str());
@ -243,13 +237,12 @@ void Application::setWindowText(tstring title)
m_sTitle = title; m_sTitle = title;
} }
void Application::close() void App::close()
{ {
// 关闭绘图环境 closegraph(); // 关闭绘图环境
closegraph();
} }
void Application::enterScene(Scene * scene, bool save) void App::enterScene(Scene * scene, bool save)
{ {
// 保存下一场景的指针 // 保存下一场景的指针
m_nextScene = scene; m_nextScene = scene;
@ -257,7 +250,7 @@ void Application::enterScene(Scene * scene, bool save)
m_bSaveScene = save; m_bSaveScene = save;
} }
void Application::backScene() void App::backScene()
{ {
// 从栈顶取出场景指针,作为下一场景 // 从栈顶取出场景指针,作为下一场景
m_nextScene = m_sceneStack.top(); m_nextScene = m_sceneStack.top();
@ -265,7 +258,12 @@ void Application::backScene()
m_bSaveScene = false; m_bSaveScene = false;
} }
void Application::_enterNextScene() void App::setBkColor(COLORREF color)
{
setbkcolor(color);
}
void App::_enterNextScene()
{ {
// 若下一场景处于栈顶,说明正在返回上一场景 // 若下一场景处于栈顶,说明正在返回上一场景
if (m_sceneStack.size() && m_nextScene == m_sceneStack.top()) if (m_sceneStack.size() && m_nextScene == m_sceneStack.top())
@ -286,27 +284,27 @@ void Application::_enterNextScene()
m_nextScene = nullptr; // 下一场景置空 m_nextScene = nullptr; // 下一场景置空
} }
void Application::quit() void App::quit()
{ {
m_bRunning = false; m_bRunning = false;
} }
void Application::end() void App::end()
{ {
m_bRunning = false; m_bRunning = false;
} }
void Application::pause() void App::pause()
{ {
m_bPause = true; m_bPause = true;
} }
bool Application::isRunning() bool App::isRunning()
{ {
return m_bRunning && !m_bPause; return m_bRunning && !m_bPause;
} }
void Application::reset() void App::reset()
{ {
// 重置绘图环境 // 重置绘图环境
graphdefaults(); graphdefaults();
@ -314,18 +312,18 @@ void Application::reset()
setbkcolor(Color::black); setbkcolor(Color::black);
} }
Scene * Application::getCurrentScene() Scene * App::getCurrentScene()
{ {
// 获取当前场景的指针 // 获取当前场景的指针
return m_currentScene; return m_currentScene;
} }
LPCTSTR easy2d::Application::getVersion() LPCTSTR easy2d::App::getVersion()
{ {
return _T("1.0.0"); return _T("1.0.0");
} }
void Application::setFPS(DWORD fps) void App::setFPS(DWORD fps)
{ {
// 设置画面帧率,以毫秒为单位 // 设置画面帧率,以毫秒为单位
LARGE_INTEGER nFreq; LARGE_INTEGER nFreq;
@ -333,17 +331,17 @@ void Application::setFPS(DWORD fps)
m_nAnimationInterval.QuadPart = (LONGLONG)(1.0 / fps * nFreq.QuadPart); m_nAnimationInterval.QuadPart = (LONGLONG)(1.0 / fps * nFreq.QuadPart);
} }
int Application::getWidth() const int App::getWidth() const
{ {
return m_nWidth; return m_nWidth;
} }
int Application::getHeight() const int App::getHeight() const
{ {
return m_nHeight; return m_nHeight;
} }
void Application::free() void App::free()
{ {
// 释放场景内存 // 释放场景内存
SAFE_DELETE(m_currentScene); SAFE_DELETE(m_currentScene);
@ -359,7 +357,7 @@ void Application::free()
Timer::clearAllTimers(); Timer::clearAllTimers();
} }
void Application::destory() void App::destory()
{ {
// 释放所有内存 // 释放所有内存
free(); free();

View File

@ -338,7 +338,7 @@
<Text Include="ReadMe.txt" /> <Text Include="ReadMe.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Application.cpp" /> <ClCompile Include="App.cpp" />
<ClCompile Include="FreePool.cpp" /> <ClCompile Include="FreePool.cpp" />
<ClCompile Include="Msg\KeyMsg.cpp" /> <ClCompile Include="Msg\KeyMsg.cpp" />
<ClCompile Include="Msg\MouseMsg.cpp" /> <ClCompile Include="Msg\MouseMsg.cpp" />

View File

@ -25,23 +25,20 @@
<Filter Include="源文件\Node\Sprite"> <Filter Include="源文件\Node\Sprite">
<UniqueIdentifier>{e5ec6183-113b-4140-8285-18b18ea37d15}</UniqueIdentifier> <UniqueIdentifier>{e5ec6183-113b-4140-8285-18b18ea37d15}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="源文件\Node\Button">
<UniqueIdentifier>{051f9343-e5a5-4491-8110-f13fc27c3827}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\Node\Shape"> <Filter Include="源文件\Node\Shape">
<UniqueIdentifier>{065a3244-7169-4a45-bc9f-f2a80d8a9759}</UniqueIdentifier> <UniqueIdentifier>{065a3244-7169-4a45-bc9f-f2a80d8a9759}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="源文件\Msg"> <Filter Include="源文件\Msg">
<UniqueIdentifier>{72dbabab-8278-4ee4-917f-bfffb474a51b}</UniqueIdentifier> <UniqueIdentifier>{72dbabab-8278-4ee4-917f-bfffb474a51b}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="源文件\Node\Button">
<UniqueIdentifier>{bdcd902b-b53d-4537-9632-76ea14c141a0}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Text Include="ReadMe.txt" /> <Text Include="ReadMe.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Application.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Scene.cpp"> <ClCompile Include="Scene.cpp">
<Filter>源文件</Filter> <Filter>源文件</Filter>
</ClCompile> </ClCompile>
@ -87,18 +84,9 @@
<ClCompile Include="Node\Shape\Shape.cpp"> <ClCompile Include="Node\Shape\Shape.cpp">
<Filter>源文件\Node\Shape</Filter> <Filter>源文件\Node\Shape</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Node\Button\Button.cpp">
<Filter>源文件\Node\Button</Filter>
</ClCompile>
<ClCompile Include="Node\MouseNode.cpp"> <ClCompile Include="Node\MouseNode.cpp">
<Filter>源文件\Node</Filter> <Filter>源文件\Node</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Node\Button\TextButton.cpp">
<Filter>源文件\Node\Button</Filter>
</ClCompile>
<ClCompile Include="Node\Button\ImageButton.cpp">
<Filter>源文件\Node\Button</Filter>
</ClCompile>
<ClCompile Include="Style\LineStyle.cpp"> <ClCompile Include="Style\LineStyle.cpp">
<Filter>源文件\Style</Filter> <Filter>源文件\Style</Filter>
</ClCompile> </ClCompile>
@ -117,6 +105,18 @@
<ClCompile Include="Msg\KeyMsg.cpp"> <ClCompile Include="Msg\KeyMsg.cpp">
<Filter>源文件\Msg</Filter> <Filter>源文件\Msg</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="App.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Node\Button\Button.cpp">
<Filter>源文件\Node\Button</Filter>
</ClCompile>
<ClCompile Include="Node\Button\ImageButton.cpp">
<Filter>源文件\Node\Button</Filter>
</ClCompile>
<ClCompile Include="Node\Button\TextButton.cpp">
<Filter>源文件\Node\Button</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="easy2d.h"> <ClInclude Include="easy2d.h">

View File

@ -34,6 +34,5 @@ void FreePool::__flush()
void FreePool::add(Object * nptr) void FreePool::add(Object * nptr)
{ {
// 将一个对象放入释放池中 pool.push_back(nptr); // 将一个对象放入释放池中
pool.push_back(nptr);
} }

View File

@ -15,7 +15,7 @@ void easy2d::MouseMsg::__exec()
// 转换鼠标消息 // 转换鼠标消息
ConvertMsg(GetMouseMsg()); ConvertMsg(GetMouseMsg());
// 执行场景程序 // 执行场景程序
Application::get()->getCurrentScene()->_exec(); App::get()->getCurrentScene()->_exec();
} }
} }
@ -24,17 +24,17 @@ MouseMsg MouseMsg::getMsg()
return s_mouseMsg; // 获取当前鼠标消息 return s_mouseMsg; // 获取当前鼠标消息
} }
bool MouseMsg::getLButtonDown() bool MouseMsg::isLButtonDown()
{ {
return s_mouseMsg.mkLButton; return s_mouseMsg.mkLButton;
} }
bool MouseMsg::getRButtonDown() bool MouseMsg::isRButtonDown()
{ {
return s_mouseMsg.mkRButton; return s_mouseMsg.mkRButton;
} }
bool MouseMsg::getMButtonDown() bool MouseMsg::isMButtonDown()
{ {
return s_mouseMsg.mkMButton; return s_mouseMsg.mkMButton;
} }
@ -54,57 +54,57 @@ int MouseMsg::getMouseWheel()
return s_mouseMsg.wheel; return s_mouseMsg.wheel;
} }
bool MouseMsg::getMouseMovedMsg() bool MouseMsg::isOnMouseMoved()
{ {
return s_mouseMsg.uMsg == WM_MOUSEMOVE; return s_mouseMsg.uMsg == WM_MOUSEMOVE;
} }
bool MouseMsg::getLButtonDBClickedMsg() bool MouseMsg::isOnLButtonDBClicked()
{ {
return s_mouseMsg.uMsg == WM_LBUTTONDBLCLK; return s_mouseMsg.uMsg == WM_LBUTTONDBLCLK;
} }
bool MouseMsg::getLButtonDownMsg() bool MouseMsg::isOnLButtonDown()
{ {
return s_mouseMsg.uMsg == WM_LBUTTONDOWN; return s_mouseMsg.uMsg == WM_LBUTTONDOWN;
} }
bool MouseMsg::getLButtonUpMsg() bool MouseMsg::isOnLButtonUp()
{ {
return s_mouseMsg.uMsg == WM_LBUTTONUP; return s_mouseMsg.uMsg == WM_LBUTTONUP;
} }
bool MouseMsg::getRButtonDBClicked() bool MouseMsg::isOnRButtonDBClicked()
{ {
return s_mouseMsg.uMsg == WM_RBUTTONDBLCLK; return s_mouseMsg.uMsg == WM_RBUTTONDBLCLK;
} }
bool MouseMsg::getRButtonDownMsg() bool MouseMsg::isOnRButtonDown()
{ {
return s_mouseMsg.uMsg == WM_RBUTTONDOWN; return s_mouseMsg.uMsg == WM_RBUTTONDOWN;
} }
bool MouseMsg::getRButtonUpMsg() bool MouseMsg::isOnRButtonUp()
{ {
return s_mouseMsg.uMsg == WM_LBUTTONUP; return s_mouseMsg.uMsg == WM_LBUTTONUP;
} }
bool MouseMsg::getMButtonDBClicked() bool MouseMsg::isOnMButtonDBClicked()
{ {
return s_mouseMsg.uMsg == WM_MBUTTONDBLCLK; return s_mouseMsg.uMsg == WM_MBUTTONDBLCLK;
} }
bool MouseMsg::getMButtonDownMsg() bool MouseMsg::isOnMButtonDown()
{ {
return s_mouseMsg.uMsg == WM_MBUTTONDOWN; return s_mouseMsg.uMsg == WM_MBUTTONDOWN;
} }
bool MouseMsg::getMButtonUpMsg() bool MouseMsg::isOnMButtonUp()
{ {
return s_mouseMsg.uMsg == WM_MBUTTONUP; return s_mouseMsg.uMsg == WM_MBUTTONUP;
} }
bool MouseMsg::getWheelMsg() bool MouseMsg::isOnWheel()
{ {
return s_mouseMsg.uMsg == WM_MOUSEWHEEL; return s_mouseMsg.uMsg == WM_MOUSEWHEEL;
} }
@ -118,8 +118,7 @@ void ConvertMsg(MOUSEMSG msg)
{ {
// 将 MOUSEMSG 转换为 MouseMsg // 将 MOUSEMSG 转换为 MouseMsg
/// 虽然 MOUSEMSG 和 MouseMsg 本质上是一样的 /// 虽然 MOUSEMSG 和 MouseMsg 本质上是一样的
/// 但是为了实现 Easy2D 与 EasyX 的相对隔离,所以定义了新的 MouseMsg /// 但是为了实现 Easy2D 与 EasyX 的分离,所以定义了新的 MouseMsg
/// 将来 Msg 对消息的处理会统一用 WinAPI实现而不再用 EasyX 的函数
s_mouseMsg.uMsg = msg.uMsg; s_mouseMsg.uMsg = msg.uMsg;
s_mouseMsg.mkLButton = msg.mkLButton; s_mouseMsg.mkLButton = msg.mkLButton;
s_mouseMsg.mkMButton = msg.mkMButton; s_mouseMsg.mkMButton = msg.mkMButton;

View File

@ -41,13 +41,13 @@ void BatchNode::_onDraw()
} }
// 在相对位置绘制子节点 // 在相对位置绘制子节点
Application::setOrigin(Application::getOriginX() + m_nX, Application::getOriginY() + m_nY); App::setOrigin(App::getOriginX() + m_nX, App::getOriginY() + m_nY);
for (auto child : m_vChildren) for (auto child : m_vChildren)
{ {
assert(child); assert(child);
child->_onDraw(); child->_onDraw();
} }
Application::setOrigin(Application::getOriginX() - m_nX, Application::getOriginY() - m_nY); App::setOrigin(App::getOriginX() - m_nX, App::getOriginY() - m_nY);
} }
void BatchNode::add(Node * child, int z_Order) void BatchNode::add(Node * child, int z_Order)

View File

@ -43,7 +43,7 @@ void Button::_judge()
_setMouseIn(); _setMouseIn();
// 若鼠标在按钮上,且鼠标左键按下 // 若鼠标在按钮上,且鼠标左键按下
if (MouseMsg::getLButtonDownMsg()) if (MouseMsg::isLButtonDown())
{ {
_setSelected(); _setSelected();
} }

View File

@ -14,7 +14,7 @@ ImageButton::ImageButton() :
ImageButton::ImageButton(Image * image) : ImageButton::ImageButton(Image * image) :
ImageButton() ImageButton()
{ {
setNormalImage(image); // 设置按钮在正常状态时的图片 setNormal(image); // 设置按钮在正常状态时的图片
} }
ImageButton::~ImageButton() ImageButton::~ImageButton()
@ -70,7 +70,7 @@ void ImageButton::_onDisable()
} }
} }
void ImageButton::setNormalImage(Image * image) void ImageButton::setNormal(Image * image)
{ {
if (image) if (image)
{ {
@ -85,7 +85,7 @@ void ImageButton::setNormalImage(Image * image)
} }
} }
void ImageButton::setMouseInImage(Image * image) void ImageButton::setMouseIn(Image * image)
{ {
if (image) if (image)
{ {
@ -96,7 +96,7 @@ void ImageButton::setMouseInImage(Image * image)
} }
} }
void ImageButton::setSelectedImage(Image * image) void ImageButton::setSelected(Image * image)
{ {
if (image) if (image)
{ {
@ -107,7 +107,7 @@ void ImageButton::setSelectedImage(Image * image)
} }
} }
void ImageButton::setUnableImage(Image * image) void ImageButton::setUnable(Image * image)
{ {
if (image) if (image)
{ {

View File

@ -14,7 +14,7 @@ TextButton::TextButton() :
TextButton::TextButton(Text * text) : TextButton::TextButton(Text * text) :
TextButton() TextButton()
{ {
setNormalText(text); // 设置按钮在正常状态时的文字 setNormal(text); // 设置按钮在正常状态时的文字
} }
TextButton::~TextButton() TextButton::~TextButton()
@ -70,7 +70,7 @@ void TextButton::_onDisable()
} }
} }
void TextButton::setNormalText(Text * text) void TextButton::setNormal(Text * text)
{ {
if (text) if (text)
{ {
@ -85,7 +85,7 @@ void TextButton::setNormalText(Text * text)
} }
} }
void TextButton::setMouseInText(Text * text) void TextButton::setMouseIn(Text * text)
{ {
if (text) if (text)
{ {
@ -96,7 +96,7 @@ void TextButton::setMouseInText(Text * text)
} }
} }
void TextButton::setSelectedText(Text * text) void TextButton::setSelected(Text * text)
{ {
if (text) if (text)
{ {
@ -107,7 +107,7 @@ void TextButton::setSelectedText(Text * text)
} }
} }
void TextButton::setUnableText(Text * text) void TextButton::setUnable(Text * text)
{ {
if (text) if (text)
{ {

View File

@ -159,7 +159,7 @@ void Image::screenshot()
{ {
// ±£´æ´°¿Ú½ØÍ¼ // ±£´æ´°¿Ú½ØÍ¼
IMAGE image; IMAGE image;
getimage(&image, 0, 0, Application::get()->getWidth(), Application::get()->getHeight()); getimage(&image, 0, 0, App::get()->getWidth(), App::get()->getHeight());
saveimage(savePath.c_str(), &image); saveimage(savePath.c_str(), &image);
} }
} }

View File

@ -25,7 +25,7 @@ bool MouseNode::_exec(bool active)
if (m_eStatus == MOUSEIN || m_eStatus == SELECTED) if (m_eStatus == MOUSEIN || m_eStatus == SELECTED)
{ {
// 节点被鼠标选中,且鼠标左键抬起 // 节点被鼠标选中,且鼠标左键抬起
if (m_bTarget && MouseMsg::getLButtonUpMsg()) if (m_bTarget && MouseMsg::isOnLButtonUp())
{ {
onClicked(); // 执行回调函数 onClicked(); // 执行回调函数
} }

View File

@ -1,7 +1,9 @@
#include "..\..\Easy2d.h" #include "..\..\Easy2d.h"
#include "..\..\EasyX\easyx.h" #include "..\..\EasyX\easyx.h"
Shape::Shape() Shape::Shape() :
lineColor(Color::black),
fillColor(Color::white)
{ {
} }

View File

@ -11,6 +11,10 @@
#error Easy2D is only for C++ #error Easy2D is only for C++
#endif #endif
#if _MSC_VER < 1600
#error Do Visual Studio 2010/2013/2015/2017 specific stuff
#endif
// String macros // String macros
@ -52,7 +56,7 @@
namespace easy2d { namespace easy2d {
// 基础类 // 基础类
class Application; class App;
class Scene; class Scene;
class KeyMsg; class KeyMsg;
class MouseMsg; class MouseMsg;
@ -85,7 +89,7 @@ typedef std::function<void()> TIMER_CALLBACK;
typedef std::function<void(VK_KEY)> KEY_CALLBACK; typedef std::function<void(VK_KEY)> KEY_CALLBACK;
class Application class App
{ {
protected: protected:
tstring m_sTitle; tstring m_sTitle;
@ -106,13 +110,13 @@ protected:
void _enterNextScene(); void _enterNextScene();
public: public:
Application(); App();
~Application(); ~App();
// 窗口可选模式 // 窗口可选模式
enum { SHOW_CONSOLE = 1, NO_CLOSE = 2, NO_MINI_MIZE = 4 }; enum { SHOW_CONSOLE = 1, NO_CLOSE = 2, NO_MINI_MIZE = 4 };
// 获取程序实例 // 获取程序实例
static Application * get(); static App * get();
// 设置坐标原点 // 设置坐标原点
static void setOrigin(int originX, int originY); static void setOrigin(int originX, int originY);
// 获取坐标原点的物理横坐标 // 获取坐标原点的物理横坐标
@ -131,12 +135,12 @@ public:
void createWindow(int width, int height, int mode = 0); void createWindow(int width, int height, int mode = 0);
// 定义绘图窗口 // 定义绘图窗口
void createWindow(tstring title, int width, int height, int mode = 0); void createWindow(tstring title, int width, int height, int mode = 0);
// 关闭窗口
void close();
// 修改窗口大小 // 修改窗口大小
void setWindowSize(int width, int height); void setWindowSize(int width, int height);
// 设置窗口标题 // 设置窗口标题
void setWindowText(tstring title); void setWindowText(tstring title);
// ¹Ø±Õ´°¿Ú
void close();
// 获取窗口宽度 // 获取窗口宽度
int getWidth() const; int getWidth() const;
// 获取窗口高度 // 获取窗口高度
@ -145,6 +149,8 @@ public:
void enterScene(Scene *scene, bool save = true); void enterScene(Scene *scene, bool save = true);
// 返回上一场景 // 返回上一场景
void backScene(); void backScene();
// 修改窗口背景色
void setBkColor(COLORREF color);
// 游戏是否正在运行 // 游戏是否正在运行
bool isRunning(); bool isRunning();
// 设置帧率 // 设置帧率
@ -163,7 +169,7 @@ public:
class FreePool class FreePool
{ {
friend class Application; friend class App;
private: private:
static void __flush(); static void __flush();
@ -175,7 +181,7 @@ public:
class Scene class Scene
{ {
friend class Application; friend class App;
friend class MouseMsg; friend class MouseMsg;
protected: protected:
@ -200,7 +206,7 @@ public:
class MouseMsg class MouseMsg
{ {
friend class Application; friend class App;
private: private:
static void __exec(); static void __exec();
@ -218,11 +224,11 @@ public:
// 获取当前鼠标消息 // 获取当前鼠标消息
static MouseMsg getMsg(); static MouseMsg getMsg();
// 左键是否按下 // 左键是否按下
static bool getLButtonDown(); static bool isLButtonDown();
// 右键是否按下 // 右键是否按下
static bool getRButtonDown(); static bool isRButtonDown();
// 中键是否按下 // 中键是否按下
static bool getMButtonDown(); static bool isMButtonDown();
// 获取鼠标X坐标 // 获取鼠标X坐标
static int getMouseX(); static int getMouseX();
// 获取鼠标Y坐标 // 获取鼠标Y坐标
@ -230,27 +236,27 @@ public:
// 获取鼠标滚轮值 // 获取鼠标滚轮值
static int getMouseWheel(); static int getMouseWheel();
// 鼠标移动消息 // 鼠标移动消息
static bool getMouseMovedMsg(); static bool isOnMouseMoved();
// 左键双击消息 // 左键双击消息
static bool getLButtonDBClickedMsg(); static bool isOnLButtonDBClicked();
// 右键按下消息 // 右键按下消息
static bool getLButtonDownMsg(); static bool isOnLButtonDown();
// 左键弹起消息 // 左键弹起消息
static bool getLButtonUpMsg(); static bool isOnLButtonUp();
// 右键双击消息 // 右键双击消息
static bool getRButtonDBClicked(); static bool isOnRButtonDBClicked();
// 右键按下消息 // 右键按下消息
static bool getRButtonDownMsg(); static bool isOnRButtonDown();
// 右键弹起消息 // 右键弹起消息
static bool getRButtonUpMsg(); static bool isOnRButtonUp();
// 中键双击消息 // 中键双击消息
static bool getMButtonDBClicked(); static bool isOnMButtonDBClicked();
// 中键按下消息 // 中键按下消息
static bool getMButtonDownMsg(); static bool isOnMButtonDown();
// 中键弹起消息 // 中键弹起消息
static bool getMButtonUpMsg(); static bool isOnMButtonUp();
// 鼠标滚轮拨动消息 // 鼠标滚轮拨动消息
static bool getWheelMsg(); static bool isOnWheel();
// 清空鼠标消息 // 清空鼠标消息
static void resetMouseMsg(); static void resetMouseMsg();
}; };
@ -258,7 +264,7 @@ public:
class KeyMsg class KeyMsg
{ {
friend class Application; friend class App;
public: public:
// 字母键值 // 字母键值
@ -352,7 +358,7 @@ public:
class Timer class Timer
{ {
friend class Application; friend class App;
protected: protected:
bool m_bRunning; bool m_bRunning;
@ -798,13 +804,13 @@ public:
virtual ~TextButton(); virtual ~TextButton();
// 设置按钮文字 // 设置按钮文字
void setNormalText(Text * text); void setNormal(Text * text);
// 设置鼠标移入时的按钮文字 // 设置鼠标移入时的按钮文字
void setMouseInText(Text * text); void setMouseIn(Text * text);
// 设置鼠标选中时的按钮文字 // 设置鼠标选中时的按钮文字
void setSelectedText(Text * text); void setSelected(Text * text);
// 设置按钮禁用时的按钮文字 // 设置按钮禁用时的按钮文字
void setUnableText(Text * text); void setUnable(Text * text);
// 设置按钮横坐标 // 设置按钮横坐标
virtual void setX(int x) override; virtual void setX(int x) override;
@ -840,13 +846,13 @@ public:
virtual ~ImageButton(); virtual ~ImageButton();
// 设置按钮图片 // 设置按钮图片
void setNormalImage(Image * image); void setNormal(Image * image);
// 设置鼠标移入时的按钮图片 // 设置鼠标移入时的按钮图片
void setMouseInImage(Image * image); void setMouseIn(Image * image);
// 设置鼠标选中时的按钮图片 // 设置鼠标选中时的按钮图片
void setSelectedImage(Image * image); void setSelected(Image * image);
// 设置按钮禁用时的按钮图片 // 设置按钮禁用时的按钮图片
void setUnableImage(Image * image); void setUnable(Image * image);
// 设置按钮横坐标 // 设置按钮横坐标
virtual void setX(int x) override; virtual void setX(int x) override;
@ -863,8 +869,8 @@ class Shape :
protected: protected:
enum STYLE { round, solid, fill }; // 形状填充样式 enum STYLE { round, solid, fill }; // 形状填充样式
STYLE _style; STYLE _style;
COLORREF fillColor = 0; COLORREF fillColor;
COLORREF lineColor = 0; COLORREF lineColor;
protected: protected:
virtual void _onDraw() override; virtual void _onDraw() override;