整体优化

This commit is contained in:
Nomango 2017-10-14 01:07:34 +08:00
parent a789c037c3
commit 3747c4d0de
26 changed files with 1195 additions and 617 deletions

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{70931955-FE2D-4A50-93C6-6955A730B0FE}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>ConsoleDemo</RootNamespace>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<LibraryPath>$(MSBuildProjectDirectory)\..\Win32;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>

50
ConsoleDemo/main.cpp Normal file
View File

@ -0,0 +1,50 @@
#include "..\Easy2D\easy2d.h"
int main()
{
EApp app;
if (app.init(L"Easy2D Demo", 640, 480, true))
{
auto scene = new EScene();
auto node = new ENode();
node->setPos(50, 80);
node->setSize(30, 180);
scene->add(node);
/*auto listener = new EMouseListener([=] {
if (!EMouseMsg::isLButtonDown())
{
if (EMouseMsg::getMsg() == EMouseMsg::MOVE)
{
node->setPos(EMouseMsg::getPos());
}
}
});*/
auto listener = new EKeyPressListener([=] {
if (EKeyMsg::isCapitalLockOn())
{
if (EKeyMsg::getVal() == EKeyMsg::KEY::LEFT)
{
node->move(-3, 0);
}
if (EKeyMsg::getVal() == EKeyMsg::KEY::RIGHT)
{
node->move(3, 0);
}
}
});
listener->bindWithNode(node);
EMsgManager::bindListenerWithScene(listener, scene);
app.enterScene(scene);
app.run();
}
return 0;
}

View File

@ -23,13 +23,13 @@
<ProjectGuid>{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}</ProjectGuid> <ProjectGuid>{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>Demo</RootNamespace> <RootNamespace>Demo</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

View File

@ -1,12 +1,16 @@
#include "..\Easy2D\easy2d.h" #include "..\Easy2D\easy2d.h"
#pragma comment(lib, "d2d1.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{ {
EApp app; EApp app;
if (app.init(L"Easy2D Demo", 640, 480)) if (app.init(L"Easy2D Demo", 640, 480, true))
{ {
auto scene = new EScene(); auto scene = new EScene();
@ -37,9 +41,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
node->move(3, 0); node->move(3, 0);
} }
} }
EApp::setWindowSize(500, 500);
}); });
EMsgManager::addListener(listener); listener->bindWithNode(node);
EMsgManager::bindListenerWithScene(listener, scene);
app.enterScene(scene); app.enterScene(scene);

View File

@ -1,12 +1,14 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio 15
VisualStudioVersion = 15.0.26730.16 VisualStudioVersion = 15.0.26730.12
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D\Easy2D.vcxproj", "{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D\Easy2D.vcxproj", "{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo.vcxproj", "{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo.vcxproj", "{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleDemo", "ConsoleDemo\ConsoleDemo.vcxproj", "{70931955-FE2D-4A50-93C6-6955A730B0FE}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
@ -33,6 +35,14 @@ Global
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x64.Build.0 = Release|x64 {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x64.Build.0 = Release|x64
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.ActiveCfg = Release|Win32 {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.ActiveCfg = Release|Win32
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.Build.0 = Release|Win32 {9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.Build.0 = Release|Win32
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Debug|x64.ActiveCfg = Debug|x64
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Debug|x64.Build.0 = Debug|x64
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Debug|x86.ActiveCfg = Debug|Win32
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Debug|x86.Build.0 = Debug|Win32
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Release|x64.ActiveCfg = Release|x64
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Release|x64.Build.0 = Release|x64
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Release|x86.ActiveCfg = Release|Win32
{70931955-FE2D-4A50-93C6-6955A730B0FE}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -24,7 +24,6 @@ e2d::EApp::EApp()
, m_bSaveScene(true) , m_bSaveScene(true)
, m_pCurrentScene(nullptr) , m_pCurrentScene(nullptr)
, m_pNextScene(nullptr) , m_pNextScene(nullptr)
, m_pLoadingScene(nullptr)
{ {
s_pInstance = this; // 保存实例对象 s_pInstance = this; // 保存实例对象
} }
@ -37,7 +36,7 @@ e2d::EApp::~EApp()
e2d::EApp * e2d::EApp::get() e2d::EApp * e2d::EApp::get()
{ {
ASSERT(s_pInstance != nullptr); ASSERT(s_pInstance != nullptr, "Nonexistent EApp instance.");
return s_pInstance; // 获取 EApp 的唯一实例 return s_pInstance; // 获取 EApp 的唯一实例
} }
@ -45,7 +44,7 @@ bool e2d::EApp::init(e2d::EString title, e2d::ESize size, bool bShowConsole /* =
{ {
return init(title, size.cx, size.cy, bShowConsole); return init(title, size.cx, size.cy, bShowConsole);
} }
#include <iostream>
bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShowConsole /* = false */) bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShowConsole /* = false */)
{ {
HRESULT hr; HRESULT hr;
@ -54,15 +53,29 @@ bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShow
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
// 关闭控制台 // 关闭控制台
if (!bShowConsole) if (bShowConsole)
{ {
HWND consoleHWnd = FindWindow(L"ConsoleWindowClass", NULL); // 查找是否已经存在控制台
if (!GetConsoleWindow())
if (consoleHWnd)
{ {
ShowWindow(consoleHWnd, SW_HIDE); // 显示一个新控制台
if (AllocConsole())
{
FILE *stream;
freopen_s(&stream, "CONOUT$", "w+t", stdout);
freopen_s(&stream, "CONOUT$", "w+t", stderr);
freopen_s(&stream, "CONIN$", "r+t", stdin);
}
else
{
MessageBox(nullptr, L"Alloc Console Failed!", L"Error", MB_OK);
}
} }
} }
else
{
FreeConsole();
}
// 初始化 device-indpendent 资源 // 初始化 device-indpendent 资源
// 比如 Direct2D factory. // 比如 Direct2D factory.
@ -117,6 +130,24 @@ bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShow
UnregisterClass(L"E2DApp", HINST_THISCOMPONENT); UnregisterClass(L"E2DApp", HINST_THISCOMPONENT);
MessageBox(nullptr, L"Create Window Failed!", L"Error", MB_OK); MessageBox(nullptr, L"Create Window Failed!", L"Error", MB_OK);
} }
else
{
// 获取屏幕分辨率
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
// 获取窗口大小(包含菜单栏)
tagRECT rcWindow;
GetWindowRect(GetHWnd(), &rcWindow);
// 修改窗口大小,并设置窗口在屏幕居中
MoveWindow(
GetHWnd(),
(screenWidth - (rcWindow.right - rcWindow.left)) / 2,
(screenHeight - (rcWindow.bottom - rcWindow.top)) / 2,
(rcWindow.right - rcWindow.left),
(rcWindow.bottom - rcWindow.top),
FALSE
);
}
} }
if (FAILED(hr)) if (FAILED(hr))
@ -130,7 +161,7 @@ bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShow
// 运行游戏 // 运行游戏
void e2d::EApp::run() void e2d::EApp::run()
{ {
ASSERT(m_pNextScene != nullptr); ASSERT(m_pNextScene != nullptr, "Next scene NULL pointer exception.");
// 进入第一个场景 // 进入第一个场景
_enterNextScene(); _enterNextScene();
// 显示窗口 // 显示窗口
@ -161,9 +192,7 @@ void e2d::EApp::run()
} }
} }
// 游戏结束后再执行一次循环 // 游戏结束后再执行一次循环
_mainLoop(); _onControl();
// 关闭窗口
close();
// 释放所有内存占用 // 释放所有内存占用
free(); free();
} }
@ -214,10 +243,8 @@ void e2d::EApp::_onControl()
_enterNextScene(); _enterNextScene();
} }
// 断言当前场景非空 // 断言当前场景非空
ASSERT(m_pCurrentScene != nullptr); ASSERT(m_pCurrentScene != nullptr, "Current scene NULL pointer exception.");
//MouseMsg::__exec(); // 鼠标检测
//KeyMsg::__exec(); // 键盘按键检测
//Timer::__exec(); // 定时器执行程序 //Timer::__exec(); // 定时器执行程序
//ActionManager::__exec(); // 动作管理器执行程序 //ActionManager::__exec(); // 动作管理器执行程序
EObjectManager::__flush(); // 刷新内存池 EObjectManager::__flush(); // 刷新内存池
@ -226,7 +253,7 @@ void e2d::EApp::_onControl()
// This method discards device-specific // This method discards device-specific
// resources if the Direct3D device dissapears during execution and // resources if the Direct3D device dissapears during execution and
// recreates the resources the next time it's invoked. // recreates the resources the next time it's invoked.
bool e2d::EApp::_onRender() void e2d::EApp::_onRender()
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
@ -251,7 +278,10 @@ bool e2d::EApp::_onRender()
_discardDeviceResources(); _discardDeviceResources();
} }
return SUCCEEDED(hr); if (FAILED(hr))
{
exit(EXIT_FAILURE);
}
} }
void e2d::EApp::setWindowSize(int width, int height) void e2d::EApp::setWindowSize(int width, int height)
@ -268,18 +298,8 @@ void e2d::EApp::setWindowSize(int width, int height)
// 计算边框大小 // 计算边框大小
width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left); width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left);
height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top); height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top);
// 销毁当前窗口
// DestroyWindow(m_);
// 修改窗口大小,并设置窗口在屏幕居中 // 修改窗口大小,并设置窗口在屏幕居中
SetWindowPos( MoveWindow(GetHWnd(), (screenWidth - width) / 2, (screenHeight - height) / 2, width, height, TRUE);
GetHWnd(),
HWND_TOP,
(screenWidth - width) / 2,
(screenHeight - height) / 2,
width,
height,
SWP_SHOWWINDOW
);
} }
void e2d::EApp::setWindowSize(e2d::ESize size) void e2d::EApp::setWindowSize(e2d::ESize size)
@ -292,12 +312,12 @@ void e2d::EApp::setWindowTitle(e2d::EString title)
// 设置窗口标题 // 设置窗口标题
SetWindowText(GetHWnd(), title.c_str()); SetWindowText(GetHWnd(), title.c_str());
// 保存当前标题,用于修改窗口大小时恢复标题 // 保存当前标题,用于修改窗口大小时恢复标题
m_sTitle = title; get()->m_sTitle = title;
} }
e2d::EString e2d::EApp::getTitle() e2d::EString e2d::EApp::getTitle()
{ {
return m_sTitle; return get()->m_sTitle;
} }
e2d::ESize e2d::EApp::getSize() e2d::ESize e2d::EApp::getSize()
@ -318,17 +338,17 @@ UINT32 e2d::EApp::getHeight()
void e2d::EApp::enterScene(EScene * scene, bool save /* = true */) void e2d::EApp::enterScene(EScene * scene, bool save /* = true */)
{ {
// 保存下一场景的指针 // 保存下一场景的指针
m_pNextScene = scene; get()->m_pNextScene = scene;
// 切换场景时,是否保存当前场景 // 切换场景时,是否保存当前场景
m_bSaveScene = save; get()->m_bSaveScene = save;
} }
void e2d::EApp::backScene() void e2d::EApp::backScene()
{ {
// 从栈顶取出场景指针,作为下一场景 // 从栈顶取出场景指针,作为下一场景
m_pNextScene = s_SceneStack.top(); get()->m_pNextScene = s_SceneStack.top();
// 不保存当前场景 // 不保存当前场景
m_bSaveScene = false; get()->m_bSaveScene = false;
} }
void e2d::EApp::clearScene() void e2d::EApp::clearScene()
@ -344,17 +364,7 @@ void e2d::EApp::clearScene()
e2d::EScene * e2d::EApp::getCurrentScene() e2d::EScene * e2d::EApp::getCurrentScene()
{ {
return m_pCurrentScene; return get()->m_pCurrentScene;
}
e2d::EScene * e2d::EApp::getLoadingScene()
{
return m_pLoadingScene;
}
void e2d::EApp::setLoadingScene(EScene * scene)
{
m_pLoadingScene = scene;
} }
void e2d::EApp::setAppName(e2d::EString appname) void e2d::EApp::setAppName(e2d::EString appname)
@ -369,7 +379,7 @@ e2d::EString e2d::EApp::getAppName()
void e2d::EApp::setBkColor(EColor::Enum color) void e2d::EApp::setBkColor(EColor::Enum color)
{ {
m_ClearColor = color; get()->m_ClearColor = color;
} }
void e2d::EApp::close() void e2d::EApp::close()
@ -385,8 +395,8 @@ void e2d::EApp::show()
void e2d::EApp::free() void e2d::EApp::free()
{ {
// 释放场景内存 // 释放场景内存
SafeDelete(&m_pCurrentScene); SafeDelete(&get()->m_pCurrentScene);
SafeDelete(&m_pNextScene); SafeDelete(&get()->m_pNextScene);
// 清空场景栈 // 清空场景栈
while (s_SceneStack.size()) while (s_SceneStack.size())
{ {
@ -394,33 +404,34 @@ void e2d::EApp::free()
SafeDelete(&temp); SafeDelete(&temp);
s_SceneStack.pop(); s_SceneStack.pop();
} }
// 删除所有定时器 // 删除所有定时器、监听器
//Timer::clearAllTimers(); //Timer::clearAllTimers();
//MouseMsg::clearAllListeners(); EMsgManager::clearAllKeyboardListeners();
//KeyMsg::clearAllListeners(); EMsgManager::clearAllMouseListeners();
//ActionManager::clearAllActions(); //ActionManager::clearAllActions();
// 删除所有对象 // 删除所有对象
//EObjectManager::__clearAllObjects(); EObjectManager::clearAllObjects();
} }
void e2d::EApp::quit() void e2d::EApp::quit()
{ {
m_bRunning = false; get()->m_bRunning = false;
} }
void e2d::EApp::end() void e2d::EApp::end()
{ {
m_bRunning = false; get()->m_bRunning = false;
} }
void e2d::EApp::_enterNextScene() void e2d::EApp::_enterNextScene()
{ {
bool bBackScene = false;
// 若下一场景处于栈顶,说明正在返回上一场景 // 若下一场景处于栈顶,说明正在返回上一场景
if (s_SceneStack.size() && m_pNextScene == s_SceneStack.top()) if (s_SceneStack.size() && m_pNextScene == s_SceneStack.top())
{ {
bBackScene = true; // 返回上一场景时,恢复场景上的定时器
//Timer::notifyAllSceneTimers(m_pNextScene);
EMsgManager::notifyAllListenersBindWithScene(m_pNextScene);
//ActionManager::notifyAllSceneActions(m_pNextScene);
// 删除栈顶场景 // 删除栈顶场景
s_SceneStack.pop(); s_SceneStack.pop();
} }
@ -435,37 +446,23 @@ void e2d::EApp::_enterNextScene()
s_SceneStack.push(m_pCurrentScene); s_SceneStack.push(m_pCurrentScene);
// 暂停当前场景上运行的所有定时器 // 暂停当前场景上运行的所有定时器
//Timer::waitAllSceneTimers(m_pCurrentScene); //Timer::waitAllSceneTimers(m_pCurrentScene);
//MouseMsg::waitAllSceneListeners(m_pCurrentScene); EMsgManager::waitAllListenersBindWithScene(m_pCurrentScene);
//KeyMsg::waitAllSceneListeners(m_pCurrentScene);
//ActionManager::waitAllSceneActions(m_pCurrentScene); //ActionManager::waitAllSceneActions(m_pCurrentScene);
} }
else else
{ {
// 不保存场景时,停止当前场景上运行的所有定时器,并删除当前场景 // 不保存场景时,停止当前场景上运行的所有定时器,并删除当前场景
//Timer::clearAllSceneTimers(m_pCurrentScene); //Timer::clearAllSceneTimers(m_pCurrentScene);
//MouseMsg::clearAllSceneListeners(m_pCurrentScene); EMsgManager::clearAllListenersBindWithScene(m_pCurrentScene);
//KeyMsg::clearAllSceneListeners(m_pCurrentScene);
//ActionManager::stopAllSceneActions(m_pCurrentScene); //ActionManager::stopAllSceneActions(m_pCurrentScene);
SafeDelete(&m_pCurrentScene); SafeDelete(&m_pCurrentScene);
} }
} }
m_pNextScene->onEnter(); // 执行下一场景的 onEnter 函数
m_pCurrentScene = m_pNextScene; // 切换场景 m_pCurrentScene = m_pNextScene; // 切换场景
m_pNextScene = nullptr; // 下一场景置空 m_pNextScene = nullptr; // 下一场景置空
if (bBackScene)
{
// 返回上一场景时,恢复场景上的定时器
//Timer::notifyAllSceneTimers(m_pCurrentScene);
EMsgManager::notifyAllListenersOnScene(m_pCurrentScene);
//ActionManager::notifyAllSceneActions(m_pCurrentScene);
}
else
{
m_pCurrentScene->init(); // 进入一个新场景时,执行它的 init 函数
}
m_pCurrentScene->onEnter(); // 执行下一场景的 onEnter 函数
} }
// Creates resources that are not bound to a particular device. // Creates resources that are not bound to a particular device.
@ -602,7 +599,6 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_KEYDOWN: case WM_KEYDOWN:
case WM_KEYUP: case WM_KEYUP:
case WM_CHAR:
{ {
EMsgManager::KeyboardProc(message, wParam, lParam); EMsgManager::KeyboardProc(message, wParam, lParam);
} }
@ -638,6 +634,10 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_DESTROY: case WM_DESTROY:
{ {
if (GetConsoleWindow())
{
FreeConsole();
}
PostQuitMessage(0); PostQuitMessage(0);
} }
result = 1; result = 1;

View File

@ -28,4 +28,6 @@ void e2d::EObject::release()
void e2d::EObject::autoRelease() void e2d::EObject::autoRelease()
{ {
m_bAutoRelease = true; m_bAutoRelease = true;
// 通知对象管理池刷新
EObjectManager::notifyFlush();
} }

View File

@ -1,17 +1,14 @@
#include "..\ebase.h" #include "..\ebase.h"
#include "..\enodes.h" #include "..\enodes.h"
#include "..\emsg.h"
e2d::EScene::EScene()
{
EApp::get()->setLoadingScene(this);
}
e2d::EScene::~EScene() e2d::EScene::~EScene()
{ {
clearAllChildren(); clearAllChildren();
} }
void e2d::EScene::_exec() /*void e2d::EScene::_exec()
{ {
// active 标志画面是否取得焦点 // active 标志画面是否取得焦点
bool active = true; bool active = true;
@ -23,7 +20,7 @@ void e2d::EScene::_exec()
active = false; // 若子节点取得焦点,将标志置 false active = false; // 若子节点取得焦点,将标志置 false
} }
} }
} }*/
void e2d::EScene::_onRender() void e2d::EScene::_onRender()
{ {
@ -34,10 +31,6 @@ void e2d::EScene::_onRender()
} }
} }
void e2d::EScene::init()
{
}
void e2d::EScene::onEnter() void e2d::EScene::onEnter()
{ {
} }
@ -49,11 +42,11 @@ void e2d::EScene::onExit()
void e2d::EScene::add(ENode * child, int zOrder /* = 0 */) void e2d::EScene::add(ENode * child, int zOrder /* = 0 */)
{ {
// 断言添加的节点非空 // 断言添加的节点非空
ASSERT(child != nullptr); ASSERT(child != nullptr, "Scene::add NULL pointer exception.");
// 忽略空指针 // 忽略空指针
if (child == nullptr) return; if (child == nullptr) return;
// 设置节点的父场景 // 设置节点的父场景
child->setParentScene(this); child->bindWithScene(this);
// 设置 z 轴顺序 // 设置 z 轴顺序
child->setZOrder(zOrder); child->setZOrder(zOrder);
// 对象的引用计数加一 // 对象的引用计数加一
@ -118,4 +111,14 @@ void e2d::EScene::clearAllChildren()
} }
// 清空储存节点的容器 // 清空储存节点的容器
m_vChildren.clear(); m_vChildren.clear();
} }
void e2d::EScene::bindListener(EMouseListener * listener)
{
EMsgManager::bindListenerWithScene(listener, this);
}
void e2d::EScene::bindListener(EKeyboardListener * listener)
{
EMsgManager::bindListenerWithScene(listener, this);
}

View File

@ -23,13 +23,13 @@
<ProjectGuid>{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}</ProjectGuid> <ProjectGuid>{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>Easy2D</RootNamespace> <RootNamespace>Easy2D</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@ -204,6 +204,7 @@
<ClCompile Include="Msg\Listener\EMouseListener.cpp" /> <ClCompile Include="Msg\Listener\EMouseListener.cpp" />
<ClCompile Include="Node\ENode.cpp" /> <ClCompile Include="Node\ENode.cpp" />
<ClCompile Include="Tool\EObjectManager.cpp" /> <ClCompile Include="Tool\EObjectManager.cpp" />
<ClCompile Include="Tool\ETimerManager.cpp" />
<ClCompile Include="Win\winbase.cpp" /> <ClCompile Include="Win\winbase.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -60,6 +60,9 @@
<ClCompile Include="Msg\Listener\EKeyPressListener.cpp"> <ClCompile Include="Msg\Listener\EKeyPressListener.cpp">
<Filter>Msg\Listener</Filter> <Filter>Msg\Listener</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Tool\ETimerManager.cpp">
<Filter>Tool</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Win\winbase.h"> <ClInclude Include="Win\winbase.h">

View File

@ -8,9 +8,9 @@ e2d::EMouseMsg mouseMsg;
// 按键消息 // 按键消息
e2d::EKeyMsg keyMsg; e2d::EKeyMsg keyMsg;
// 鼠标消息监听器 // 鼠标消息监听器
std::vector<e2d::EMouseListener*> m_vMouseListeners; std::vector<e2d::EMouseListener*> s_vMouseListeners;
// 按键消息监听器 // 按键消息监听器
std::vector<e2d::EKeyListener*> m_vKeyListeners; std::vector<e2d::EKeyboardListener*> s_vKeyListeners;
DWORD e2d::EMouseMsg::getX() DWORD e2d::EMouseMsg::getX()
@ -125,7 +125,7 @@ void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam)
mouseMsg.m_wParam = wParam; mouseMsg.m_wParam = wParam;
mouseMsg.m_lParam = lParam; mouseMsg.m_lParam = lParam;
// 执行鼠标消息监听函数 // 执行鼠标消息监听函数
for (auto mlistener : m_vMouseListeners) for (auto mlistener : s_vMouseListeners)
{ {
if (mlistener->isRunning()) if (mlistener->isRunning())
{ {
@ -141,7 +141,7 @@ void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam)
keyMsg.m_wParam = wParam; keyMsg.m_wParam = wParam;
keyMsg.m_lParam = lParam; keyMsg.m_lParam = lParam;
// 执行按键消息监听函数 // 执行按键消息监听函数
for (auto klistener : m_vKeyListeners) for (auto klistener : s_vKeyListeners)
{ {
if (klistener->isRunning()) if (klistener->isRunning())
{ {
@ -150,38 +150,38 @@ void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam)
} }
} }
void e2d::EMsgManager::addListener(e2d::EMouseListener * listener, EScene * pParentScene) void e2d::EMsgManager::bindListenerWithScene(e2d::EMouseListener * listener, EScene * pParentScene)
{ {
WARN_IF(listener == nullptr, "Add NULL EMouseListener!"); WARN_IF(listener == nullptr, "EMouseListener NULL pointer exception!");
WARN_IF(pParentScene == nullptr, "Bind EMouseListener on a NULL Scene!"); WARN_IF(pParentScene == nullptr, "Bind EMouseListener with a NULL EScene pointer!");
if (listener && pParentScene) if (listener && pParentScene)
{ {
listener->start(); listener->start();
listener->retain(); listener->retain();
listener->setParentScene(pParentScene); listener->bindWithScene(pParentScene);
m_vMouseListeners.push_back(listener); s_vMouseListeners.push_back(listener);
} }
} }
void e2d::EMsgManager::addListener(e2d::EKeyListener * listener, EScene * pParentScene) void e2d::EMsgManager::bindListenerWithScene(e2d::EKeyboardListener * listener, EScene * pParentScene)
{ {
WARN_IF(listener == nullptr, "Add NULL EKeyListener!"); WARN_IF(listener == nullptr, "EKeyboardListener NULL pointer exception!");
WARN_IF(pParentScene == nullptr, "Bind EKeyListener on a NULL Scene!"); WARN_IF(pParentScene == nullptr, "Bind EKeyboardListener with a NULL EScene pointer!");
if (listener && pParentScene) if (listener && pParentScene)
{ {
listener->start(); listener->start();
listener->retain(); listener->retain();
listener->setParentScene(pParentScene); listener->bindWithScene(pParentScene);
m_vKeyListeners.push_back(listener); s_vKeyListeners.push_back(listener);
} }
} }
void e2d::EMsgManager::startListener(EString name) void e2d::EMsgManager::startListener(EString name)
{ {
// 启动鼠标消息监听器 // 启动鼠标消息监听器
for (auto l : m_vMouseListeners) for (auto l : s_vMouseListeners)
{ {
if (l->getName() == name) if (l->getName() == name)
{ {
@ -189,7 +189,7 @@ void e2d::EMsgManager::startListener(EString name)
} }
} }
// 启动按键消息监听器 // 启动按键消息监听器
for (auto l : m_vKeyListeners) for (auto l : s_vKeyListeners)
{ {
if (l->getName() == name) if (l->getName() == name)
{ {
@ -201,7 +201,7 @@ void e2d::EMsgManager::startListener(EString name)
void e2d::EMsgManager::stopListener(EString name) void e2d::EMsgManager::stopListener(EString name)
{ {
// 停止鼠标消息监听器 // 停止鼠标消息监听器
for (auto l : m_vMouseListeners) for (auto l : s_vMouseListeners)
{ {
if (l->getName() == name) if (l->getName() == name)
{ {
@ -209,7 +209,7 @@ void e2d::EMsgManager::stopListener(EString name)
} }
} }
// 停止按键消息监听器 // 停止按键消息监听器
for (auto l : m_vKeyListeners) for (auto l : s_vKeyListeners)
{ {
if (l->getName() == name) if (l->getName() == name)
{ {
@ -221,41 +221,153 @@ void e2d::EMsgManager::stopListener(EString name)
void e2d::EMsgManager::delListener(EString name) void e2d::EMsgManager::delListener(EString name)
{ {
// 删除鼠标消息监听器 // 删除鼠标消息监听器
for (std::vector<EMouseListener*>::iterator iter = m_vMouseListeners.begin(); iter != m_vMouseListeners.end();) std::vector<EMouseListener*>::iterator mIter;
for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();)
{ {
if ((*iter)->getName() == name) if ((*mIter)->getName() == name)
{ {
(*iter)->autoRelease(); (*mIter)->autoRelease();
(*iter)->release(); (*mIter)->release();
delete (*iter); mIter = s_vMouseListeners.erase(mIter);
iter = m_vMouseListeners.erase(iter);
} }
else else
{ {
iter++; mIter++;
} }
} }
// 删除按键消息监听器 // 删除按键消息监听器
for (std::vector<EKeyListener*>::iterator iter = m_vKeyListeners.begin(); iter != m_vKeyListeners.end();) std::vector<EKeyboardListener*>::iterator kIter;
for (kIter = s_vKeyListeners.begin(); kIter != s_vKeyListeners.end();)
{ {
if ((*iter)->getName() == name) if ((*kIter)->getName() == name)
{ {
(*iter)->autoRelease(); (*kIter)->autoRelease();
(*iter)->release(); (*kIter)->release();
delete (*iter); kIter = s_vKeyListeners.erase(kIter);
iter = m_vKeyListeners.erase(iter);
} }
else else
{ {
iter++; kIter++;
} }
} }
} }
void e2d::EMsgManager::waitAllListenersOnScene(EScene * scene) void e2d::EMsgManager::startAllMouseListener()
{
for (auto l : s_vMouseListeners)
{
if (!l->isWaiting())
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllMouseListener()
{
for (auto l : s_vMouseListeners)
{
if (!l->isWaiting())
{
l->stop();
}
}
}
void e2d::EMsgManager::clearAllMouseListeners()
{
for (auto l : s_vMouseListeners)
{
l->autoRelease();
l->release();
}
s_vMouseListeners.clear();
}
void e2d::EMsgManager::startAllKeyboardListener()
{
for (auto l : s_vKeyListeners)
{
if (!l->isWaiting())
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllKeyboardListener()
{
for (auto l : s_vKeyListeners)
{
if (!l->isWaiting())
{
l->stop();
}
}
}
void e2d::EMsgManager::clearAllKeyboardListeners()
{
for (auto l : s_vKeyListeners)
{
l->autoRelease();
l->release();
}
s_vKeyListeners.clear();
}
void e2d::EMsgManager::startAllMouseListenersBindWithScene(EScene * pParentScene)
{
// 启动鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentScene() == pParentScene)
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllMouseListenersBindWithScene(EScene * pParentScene)
{
// 停止鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentScene() == pParentScene)
{
l->stop();
}
}
}
void e2d::EMsgManager::startAllKeyboardListenersBindWithScene(EScene * pParentScene)
{
// 启动按键消息监听器
for (auto l : s_vKeyListeners)
{
if (l->getParentScene() == pParentScene)
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllKeyboardListenersBindWithScene(EScene * pParentScene)
{
// 停止按键消息监听器
for (auto l : s_vKeyListeners)
{
if (l->getParentScene() == pParentScene)
{
l->stop();
}
}
}
void e2d::EMsgManager::waitAllListenersBindWithScene(EScene * scene)
{ {
// 挂起鼠标消息监听器 // 挂起鼠标消息监听器
for (auto l : m_vMouseListeners) for (auto l : s_vMouseListeners)
{ {
if (l->getParentScene() == scene) if (l->getParentScene() == scene)
{ {
@ -263,7 +375,7 @@ void e2d::EMsgManager::waitAllListenersOnScene(EScene * scene)
} }
} }
// 挂起按键消息监听器 // 挂起按键消息监听器
for (auto l : m_vKeyListeners) for (auto l : s_vKeyListeners)
{ {
if (l->getParentScene() == scene) if (l->getParentScene() == scene)
{ {
@ -272,10 +384,10 @@ void e2d::EMsgManager::waitAllListenersOnScene(EScene * scene)
} }
} }
void e2d::EMsgManager::notifyAllListenersOnScene(EScene * scene) void e2d::EMsgManager::notifyAllListenersBindWithScene(EScene * scene)
{ {
// 重启鼠标消息监听器 // 重启鼠标消息监听器
for (auto l : m_vMouseListeners) for (auto l : s_vMouseListeners)
{ {
if (l->getParentScene() == scene) if (l->getParentScene() == scene)
{ {
@ -283,7 +395,7 @@ void e2d::EMsgManager::notifyAllListenersOnScene(EScene * scene)
} }
} }
// 重启按键消息监听器 // 重启按键消息监听器
for (auto l : m_vKeyListeners) for (auto l : s_vKeyListeners)
{ {
if (l->getParentScene() == scene) if (l->getParentScene() == scene)
{ {
@ -292,3 +404,107 @@ void e2d::EMsgManager::notifyAllListenersOnScene(EScene * scene)
} }
} }
void e2d::EMsgManager::clearAllListenersBindWithScene(EScene * scene)
{
std::vector<EMouseListener*>::iterator mIter;
for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();)
{
if ((*mIter)->getParentScene() == scene)
{
(*mIter)->autoRelease();
(*mIter)->release();
mIter = s_vMouseListeners.erase(mIter);
}
else
{
mIter++;
}
}
std::vector<EKeyboardListener*>::iterator kIter;
for (kIter = s_vKeyListeners.begin(); kIter != s_vKeyListeners.end();)
{
if ((*kIter)->getParentScene() == scene)
{
(*kIter)->autoRelease();
(*kIter)->release();
kIter = s_vKeyListeners.erase(kIter);
}
else
{
kIter++;
}
}
}
void e2d::EMsgManager::waitAllListenersBindWithNode(ENode * pParentNode)
{
// 挂起鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentNode() == pParentNode)
{
l->wait();
}
}
// 挂起按键消息监听器
for (auto l : s_vKeyListeners)
{
if (l->getParentNode() == pParentNode)
{
l->wait();
}
}
}
void e2d::EMsgManager::notifyAllListenersBindWithNode(ENode * pParentNode)
{
// 重启鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentNode() == pParentNode)
{
l->notify();
}
}
// 重启按键消息监听器
for (auto l : s_vKeyListeners)
{
if (l->getParentNode() == pParentNode)
{
l->notify();
}
}
}
void e2d::EMsgManager::clearAllListenersBindWithNode(ENode * pParentNode)
{
std::vector<EMouseListener*>::iterator mIter;
for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();)
{
if ((*mIter)->getParentNode() == pParentNode)
{
(*mIter)->autoRelease();
(*mIter)->release();
mIter = s_vMouseListeners.erase(mIter);
}
else
{
mIter++;
}
}
std::vector<EKeyboardListener*>::iterator kIter;
for (kIter = s_vKeyListeners.begin(); kIter != s_vKeyListeners.end();)
{
if ((*kIter)->getParentNode() == pParentNode)
{
(*kIter)->autoRelease();
(*kIter)->release();
kIter = s_vKeyListeners.erase(kIter);
}
else
{
kIter++;
}
}
}

View File

@ -1,33 +1,33 @@
#include "..\..\emsg.h" #include "..\..\emsg.h"
e2d::EKeyListener::EKeyListener() e2d::EKeyboardListener::EKeyboardListener()
: EListener() : EListener()
{ {
} }
e2d::EKeyListener::EKeyListener(EString name) e2d::EKeyboardListener::EKeyboardListener(EString name)
: EListener(name) : EListener(name)
{ {
} }
e2d::EKeyListener::EKeyListener(const KEY_LISTENER_CALLBACK & callback) e2d::EKeyboardListener::EKeyboardListener(const KEY_LISTENER_CALLBACK & callback)
: EListener() : EListener()
{ {
m_callback = callback; m_callback = callback;
} }
e2d::EKeyListener::EKeyListener(EString name, const KEY_LISTENER_CALLBACK & callback) e2d::EKeyboardListener::EKeyboardListener(EString name, const KEY_LISTENER_CALLBACK & callback)
: EListener(name) : EListener(name)
{ {
m_callback = callback; m_callback = callback;
} }
void e2d::EKeyListener::runCallback() void e2d::EKeyboardListener::runCallback()
{ {
m_callback(); m_callback();
} }
void e2d::EKeyListener::setCallback(const KEY_LISTENER_CALLBACK & callback) void e2d::EKeyboardListener::setCallback(const KEY_LISTENER_CALLBACK & callback)
{ {
m_callback = callback; m_callback = callback;
} }

View File

@ -1,22 +1,22 @@
#include "..\..\emsg.h" #include "..\..\emsg.h"
e2d::EKeyPressListener::EKeyPressListener() e2d::EKeyPressListener::EKeyPressListener()
: EKeyListener() : EKeyboardListener()
{ {
} }
e2d::EKeyPressListener::EKeyPressListener(EString name) e2d::EKeyPressListener::EKeyPressListener(EString name)
: EKeyListener(name) : EKeyboardListener(name)
{ {
} }
e2d::EKeyPressListener::EKeyPressListener(const KEY_LISTENER_CALLBACK & callback) e2d::EKeyPressListener::EKeyPressListener(const KEY_LISTENER_CALLBACK & callback)
: EKeyListener(callback) : EKeyboardListener(callback)
{ {
} }
e2d::EKeyPressListener::EKeyPressListener(EString name, const KEY_LISTENER_CALLBACK & callback) e2d::EKeyPressListener::EKeyPressListener(EString name, const KEY_LISTENER_CALLBACK & callback)
: EKeyListener(name, callback) : EKeyboardListener(name, callback)
{ {
} }

View File

@ -5,6 +5,7 @@ e2d::EListener::EListener()
, m_bWaiting(false) , m_bWaiting(false)
, m_sName(L"") , m_sName(L"")
, m_pParentScene(nullptr) , m_pParentScene(nullptr)
, m_pParentNode(nullptr)
{ {
} }
@ -19,6 +20,11 @@ bool e2d::EListener::isRunning() const
return m_bRunning && !m_bWaiting; return m_bRunning && !m_bWaiting;
} }
bool e2d::EListener::isWaiting() const
{
return m_bWaiting;
}
void e2d::EListener::start() void e2d::EListener::start()
{ {
m_bRunning = true; m_bRunning = true;
@ -39,6 +45,11 @@ void e2d::EListener::notify()
m_bWaiting = false; m_bWaiting = false;
} }
e2d::EListener * e2d::EListener::clone()
{
return nullptr;
}
e2d::EString e2d::EListener::getName() const e2d::EString e2d::EListener::getName() const
{ {
return m_sName; return m_sName;
@ -49,12 +60,32 @@ e2d::EScene * e2d::EListener::getParentScene() const
return m_pParentScene; return m_pParentScene;
} }
e2d::ENode * e2d::EListener::getParentNode() const
{
return m_pParentNode;
}
void e2d::EListener::setName(EString name) void e2d::EListener::setName(EString name)
{ {
m_sName = name; m_sName = name;
} }
void e2d::EListener::setParentScene(EScene * scene) void e2d::EListener::bindWithScene(EScene * scene)
{ {
if (scene != nullptr) m_pParentScene = scene; WARN_IF(m_pParentNode != nullptr, "EListener bind with Scene Failed! Please use its clone.");
if (scene != nullptr && m_pParentNode == nullptr)
{
m_pParentScene = scene;
}
}
void e2d::EListener::bindWithNode(ENode * pParentNode)
{
WARN_IF(m_pParentScene != nullptr, "EListener bind with Node Failed! Please use its clone.");
if (pParentNode != nullptr && m_pParentScene == nullptr)
{
m_pParentNode = pParentNode;
}
} }

View File

@ -183,7 +183,7 @@ e2d::EScene * &e2d::ENode::getParentScene()
return m_pParentScene; return m_pParentScene;
} }
void e2d::ENode::setParentScene(EScene * scene) void e2d::ENode::bindWithScene(EScene * scene)
{ {
m_pParentScene = scene; m_pParentScene = scene;
} }

View File

@ -10,9 +10,14 @@
// 释放池容器 // 释放池容器
static std::vector<e2d::EObject*> s_vPool; static std::vector<e2d::EObject*> s_vPool;
// 标志释放池执行状态
static bool s_bNotifyed = false;
void e2d::EObjectManager::__flush() void e2d::EObjectManager::__flush()
{ {
if (!s_bNotifyed) return;
s_bNotifyed = false;
// 创建迭代器 // 创建迭代器
static std::vector<e2d::EObject*>::iterator iter; static std::vector<e2d::EObject*>::iterator iter;
// 循环遍历容器中的所有对象 // 循环遍历容器中的所有对象
@ -49,3 +54,8 @@ void e2d::EObjectManager::clearAllObjects()
} }
s_vPool.clear(); s_vPool.clear();
} }
void e2d::EObjectManager::notifyFlush()
{
s_bNotifyed = true;
}

View File

@ -0,0 +1 @@
#include "..\etools.h"

View File

@ -21,22 +21,3 @@ ID2D1HwndRenderTarget * &GetRenderTarget()
return pRenderTarget; return pRenderTarget;
} }
void WindowCenter(HWND hWnd)
{
// 获取屏幕分辨率
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
// 获取窗口大小
tagRECT rcWindow;
GetWindowRect(hWnd, &rcWindow);
// 设置窗口在屏幕居中
SetWindowPos(
hWnd,
HWND_TOP,
(screenWidth - (rcWindow.left - rcWindow.right)) / 2,
(screenHeight - (rcWindow.top - rcWindow.bottom)) / 2,
(rcWindow.left - rcWindow.right),
(rcWindow.top - rcWindow.bottom),
SWP_SHOWWINDOW | SWP_NOSIZE
);
}

View File

@ -4,6 +4,7 @@
#include <d2d1helper.h> #include <d2d1helper.h>
#include <dwrite.h> #include <dwrite.h>
#include <wincodec.h> #include <wincodec.h>
#pragma comment(lib, "d2d1.lib")
HWND &GetHWnd(); HWND &GetHWnd();
@ -11,8 +12,6 @@ ID2D1Factory * &GetFactory();
ID2D1HwndRenderTarget * &GetRenderTarget(); ID2D1HwndRenderTarget * &GetRenderTarget();
void WindowCenter(HWND hWnd);
template<class Interface> template<class Interface>
inline void SafeReleaseInterface( inline void SafeReleaseInterface(

View File

@ -19,8 +19,8 @@
#include "emacros.h" #include "emacros.h"
#include "ecommon.h" #include "ecommon.h"
#include "ebase.h" #include "ebase.h"
#include "emsg.h"
#include "enodes.h" #include "enodes.h"
#include "emsg.h"
#include "etools.h" #include "etools.h"

View File

@ -12,6 +12,8 @@ namespace e2d
class EScene; class EScene;
class ENode; class ENode;
class EObjectManager; class EObjectManager;
class EMouseListener;
class EKeyboardListener;
class EApp class EApp
{ {
@ -42,81 +44,75 @@ public:
void run(); void run();
// 修改窗口大小 // 修改窗口大小
void setWindowSize( static void setWindowSize(
int width, int width,
int height int height
); );
// 修改窗口大小 // 修改窗口大小
void setWindowSize( static void setWindowSize(
e2d::ESize size e2d::ESize size
); );
// 设置窗口标题 // 设置窗口标题
void setWindowTitle( static void setWindowTitle(
e2d::EString title e2d::EString title
); );
// 获取窗口标题 // 获取窗口标题
e2d::EString getTitle(); static e2d::EString getTitle();
// 获取窗口大小 // 获取窗口大小
e2d::ESize getSize(); static e2d::ESize getSize();
// 获取窗口宽度 // 获取窗口宽度
UINT32 getWidth(); static UINT32 getWidth();
// 获取窗口高度 // 获取窗口高度
UINT32 getHeight(); static UINT32 getHeight();
// 切换场景 // 切换场景
void enterScene( static void enterScene(
EScene * scene, EScene * scene,
bool save = true bool save = true
); );
// 返回上一场景 // 返回上一场景
void backScene(); static void backScene();
// 清空保存的所有场景 // 清空保存的所有场景
void clearScene(); static void clearScene();
// 获取当前场景 // 获取当前场景
EScene * getCurrentScene(); static EScene * getCurrentScene();
// 获取正处于加载中的场景
EScene * getLoadingScene();
// 设置正处于加载中的场景
void setLoadingScene(EScene * scene);
// 获取 AppName // 获取 AppName
e2d::EString getAppName(); static e2d::EString getAppName();
// 设置 AppName // 设置 AppName
void setAppName( static void setAppName(
e2d::EString appname e2d::EString appname
); );
// 修改窗口背景色 // 修改窗口背景色
void setBkColor( static void setBkColor(
EColor::Enum color EColor::Enum color
); );
// 释放所有内存资源 // 释放所有内存资源
void free(); static void free();
// 关闭窗口 // 关闭窗口
void close(); static void close();
// 显示窗口 // 显示窗口
void show(); static void show();
// 终止程序 // 终止程序
void quit(); static void quit();
// 终止程序 // 终止程序
void end(); static void end();
protected: protected:
// Initialize device-independent resources. // Initialize device-independent resources.
@ -133,7 +129,7 @@ protected:
void _onControl(); void _onControl();
// Draw content. // Draw content.
bool _onRender(); void _onRender();
void _enterNextScene(); void _enterNextScene();
@ -160,7 +156,6 @@ protected:
EScene * m_pCurrentScene; EScene * m_pCurrentScene;
EScene * m_pNextScene; EScene * m_pNextScene;
EScene * m_pLoadingScene;
}; };
@ -169,13 +164,10 @@ class EScene
friend EApp; friend EApp;
public: public:
EScene(); EScene() = default;
~EScene(); ~EScene();
// 重写这个函数,初始化这个场景
virtual void init();
// 重写这个函数,它将在进入这个场景时自动执行 // 重写这个函数,它将在进入这个场景时自动执行
virtual void onEnter(); virtual void onEnter();
@ -200,14 +192,18 @@ public:
// 清空所有子成员 // 清空所有子成员
void clearAllChildren(); void clearAllChildren();
// 绑定鼠标消息监听器
void bindListener(EMouseListener * listener);
// 绑定按键消息监听器
void bindListener(EKeyboardListener * listener);
protected:
// 渲染场景画面
void _onRender();
protected: protected:
std::vector<e2d::ENode*> m_vChildren; std::vector<e2d::ENode*> m_vChildren;
protected:
// 场景
void _exec();
void _onRender();
}; };

View File

@ -25,14 +25,18 @@
#ifndef ASSERT_IF #ifndef ASSERT_IF
#if defined( DEBUG ) || defined( _DEBUG ) #if defined( DEBUG ) || defined( _DEBUG )
#define ASSERT(b) do {if (!(b)) { OutputDebugStringA("Assert: " #b "\n"); }} while(0) #define ASSERT(b, m) do {if (!(b)) { fprintf(stderr, "Assert: " #m "\n"); abort(); }} while(0)
#else #else
#define ASSERT(b) #define ASSERT(b, m) ((void)0)
#endif //DEBUG || _DEBUG #endif //DEBUG || _DEBUG
#endif #endif
#ifndef WARN_IF #ifndef WARN_IF
#define WARN_IF(b, m) do {if (b) { fprintf(stderr, "Warning: " #m "/n"); }} while(0) #if defined( DEBUG ) || defined( _DEBUG )
#define WARN_IF(b, m) do {if (b) { fprintf(stderr, "Warning: " #m "\n"); }} while(0)
#else
#define WARN_IF(b, m) ((void)0)
#endif //DEBUG || _DEBUG
#endif #endif

View File

@ -1,406 +1,479 @@
#pragma once #pragma once
#include "ebase.h" #include "ebase.h"
namespace e2d namespace e2d
{ {
class EMsgManager; class ENode;
class EMsgManager;
// 鼠标消息 // 鼠标消息
class EMouseMsg class EMouseMsg
{ {
friend EMsgManager; friend EMsgManager;
public: public:
// 鼠标消息集合 // 鼠标消息集合
enum class MOUSE_MSG enum class MOUSE_MSG
{ {
MOVE = 0x0200, // 鼠标移动 MOVE = 0x0200, // 鼠标移动
LBUTTON_DOWN, // 鼠标左键按下 LBUTTON_DOWN, // 鼠标左键按下
LBUTTON_UP, // 鼠标左键抬起 LBUTTON_UP, // 鼠标左键抬起
LBUTTON_DBLCLK, // 鼠标左键双击 LBUTTON_DBLCLK, // 鼠标左键双击
RBUTTON_DOWN, // 鼠标右键按下 RBUTTON_DOWN, // 鼠标右键按下
RBUTTON_UP, // 鼠标右键抬起 RBUTTON_UP, // 鼠标右键抬起
RBUTTON_DBLCLK, // 鼠标右键双击 RBUTTON_DBLCLK, // 鼠标右键双击
MBUTTON_DOWN, // 鼠标中键按下 MBUTTON_DOWN, // 鼠标中键按下
MBUTTON_UP, // 鼠标中键抬起 MBUTTON_UP, // 鼠标中键抬起
MBUTTON_DBLCLK, // 鼠标中键双击 MBUTTON_DBLCLK, // 鼠标中键双击
WHEEL // 滑动滚轮 WHEEL // 滑动滚轮
}; };
// 获取鼠标横坐标 // 获取鼠标横坐标
static DWORD getX(); static DWORD getX();
// 获取鼠标纵坐标 // 获取鼠标纵坐标
static DWORD getY(); static DWORD getY();
// 获取鼠标坐标 // 获取鼠标坐标
static EPoint getPos(); static EPoint getPos();
// 获取鼠标左键按下状态 // 获取鼠标左键按下状态
static bool isLButtonDown(); static bool isLButtonDown();
// 获取鼠标中键按下状态 // 获取鼠标中键按下状态
static bool isMButtonDown(); static bool isMButtonDown();
// 获取鼠标右键按下状态 // 获取鼠标右键按下状态
static bool isRButtonDown(); static bool isRButtonDown();
// 获取 Shift 按键状态 // 获取 Shift 按键状态
static bool isShiftDown(); static bool isShiftDown();
// 获取 Ctrl 按键状态 // 获取 Ctrl 按键状态
static bool isCtrlDown(); static bool isCtrlDown();
// 获取鼠标滚轮值 // 获取鼠标滚轮值
static DWORD getWheelDelta(); static DWORD getWheelDelta();
// 获取当前鼠标消息 // 获取当前鼠标消息
static MOUSE_MSG getMsg(); static MOUSE_MSG getMsg();
protected: protected:
UINT m_nMsg = 0; UINT m_nMsg = 0;
WPARAM m_wParam = 0; WPARAM m_wParam = 0;
LPARAM m_lParam = 0; LPARAM m_lParam = 0;
}; };
// 监听器 // 按键消息
class EListener : class EKeyMsg
public EObject {
{ friend EMsgManager;
public:
EListener(); public:
// 按键消息类型集合
EListener( enum class KEYBOARD_MSG
EString name {
); KEY_DOWN = 0x0100, // 按下
KEY_UP // 抬起
// 获取监听器状态 };
bool isRunning() const;
// 按键键值集合
// 启动监听 enum class KEY
void start(); {
A = 'A', B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, // 字母键值
// 停止监听 NUM0 = '0', NUM1, NUM2, NUM3, NUM4, NUM5, NUM6, NUM7, NUM8, NUM9, // 数字键值
void stop(); NUMPAD0 = 0x60, NUMPAD1, NUMPAD2, NUMPAD3, NUMPAD4, NUMPAD5, NUMPAD6, NUMPAD7, NUMPAD8, NUMPAD9, // 数字小键盘键值
F1 = 0x70, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, // F键键值
// 进入等待状态 MULTIPLY, // 乘号键键值
void wait(); ADD, // 加号键键值
SEPARATOR, // 分割键键值
// 唤醒 SUBTRACT, // 减号键键值
void notify(); DECIMAL, // 小数点键键值
DIVIDE, // 除号键键值
// 获取监听器名称 TAB = 0x09, // TAB 键键值
EString getName() const; ENTER = 0x0D, // 回车键键值
SHIFT, CTRL, // SHIFT 键键值
// 获取监听器所在场景 ESC = 0x1B, // ESCAPE 键键值
EScene * getParentScene() const; SPACE = 0x20, // 空格键键值
PAGE_UP, // PageUp 键键值
// 设置监听器名称 PAGE_DOWN, // PageDown 键键值
void setName( END, // End 键键值
EString name HOME, // Home 键键值
); LEFT, // 左键键值
UP, // 上键键值
// 设置监听器所在场景 RIGHT, // 右键键值
void setParentScene( DOWN // 下键键值
EScene * scene };
);
// 获取按键消息类型
protected: static KEYBOARD_MSG getMsg();
EString m_sName;
bool m_bRunning; // 获取键值
bool m_bWaiting; static KEY getVal();
EScene * m_pParentScene;
}; // 获取按键消息的计数
static DWORD getCount();
// 鼠标消息监听器 // 获取特定按键的状态
class EMouseListener : static bool isKeyDown(
public EListener KEY key
{ );
public:
EMouseListener(); // 获取大小写锁定状态
static bool isCapitalLockOn();
EMouseListener(
EString name // 获取数字小键盘锁定状态
); static bool isNumpadLockOn();
EMouseListener( // 获取滑动锁定状态
const MOUSE_LISTENER_CALLBACK &callback static bool isScrollLockOn();
);
protected:
EMouseListener( UINT m_nMsg = 0;
EString name, WPARAM m_wParam = 0;
const MOUSE_LISTENER_CALLBACK &callback LPARAM m_lParam = 0;
); };
// 执行监听器回调函数
virtual void runCallback(); // 监听器
class EListener :
// 设置监听器回调函数 public EObject
void setCallback( {
const MOUSE_LISTENER_CALLBACK &callback public:
); EListener();
protected: EListener(
MOUSE_LISTENER_CALLBACK m_callback; EString name
}; );
// 获取监听器状态
// 鼠标点击消息监听器 bool isRunning() const;
class EMouseClickListener :
public EMouseListener // 获取监听器挂起状态
{ bool isWaiting() const;
public:
EMouseClickListener(); // 启动监听
void start();
EMouseClickListener(
EString name // 停止监听
); void stop();
EMouseClickListener( // 进入等待状态
const MOUSE_CLICK_LISTENER_CALLBACK &callback void wait();
);
// 唤醒
EMouseClickListener( void notify();
EString name,
const MOUSE_CLICK_LISTENER_CALLBACK &callback // 克隆一个相同的监听器
); virtual EListener * clone();
// 执行监听器回调函数 // 获取监听器名称
virtual void runCallback() override; EString getName() const;
// 设置监听器回调函数 // 获取监听器所在场景
void setCallback( EScene * getParentScene() const;
const MOUSE_CLICK_LISTENER_CALLBACK &callback
); // 获取监听器所在节点
ENode * getParentNode() const;
protected:
MOUSE_CLICK_LISTENER_CALLBACK m_callback; // 设置监听器名称
}; void setName(
EString name
);
// 鼠标拖动消息监听器
class EMouseDraggedListener : // 绑定监听器到场景
public EMouseListener void bindWithScene(
{ EScene * pParentScene
public: );
EMouseDraggedListener();
// 绑定监听器到节点
EMouseDraggedListener( void bindWithNode(
EString name ENode * pParentNode
); );
EMouseDraggedListener( protected:
const MOUSE_DRAG_LISTENER_CALLBACK &callback EString m_sName;
); bool m_bRunning;
bool m_bWaiting;
EMouseDraggedListener( EScene * m_pParentScene;
EString name, ENode * m_pParentNode;
const MOUSE_DRAG_LISTENER_CALLBACK &callback };
);
// 执行监听器回调函数 // 鼠标消息监听器
virtual void runCallback() override; class EMouseListener :
public EListener
// 设置监听器回调函数 {
void setCallback( public:
const MOUSE_DRAG_LISTENER_CALLBACK &callback EMouseListener();
);
EMouseListener(
protected: EString name
EPoint m_Begin; );
EPoint m_End;
MOUSE_DRAG_LISTENER_CALLBACK m_callback; EMouseListener(
}; const MOUSE_LISTENER_CALLBACK &callback
);
// 按键消息 EMouseListener(
class EKeyMsg EString name,
{ const MOUSE_LISTENER_CALLBACK &callback
friend EMsgManager; );
public: // 执行监听器回调函数
// 按键消息类型集合 virtual void runCallback();
enum class KEYBOARD_MSG
{ // 设置监听器回调函数
KEY_DOWN = 0x0100, // 按下 void setCallback(
KEY_UP // 抬起 const MOUSE_LISTENER_CALLBACK &callback
}; );
// 按键键值集合 protected:
enum class KEY MOUSE_LISTENER_CALLBACK m_callback;
{ };
A = 'A', B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, // 字母键值
NUM0 = '0', NUM1, NUM2, NUM3, NUM4, NUM5, NUM6, NUM7, NUM8, NUM9, // 数字键值
NUMPAD0 = 0x60, NUMPAD1, NUMPAD2, NUMPAD3, NUMPAD4, NUMPAD5, NUMPAD6, NUMPAD7, NUMPAD8, NUMPAD9, // 数字小键盘键值 // 鼠标点击消息监听器
F1 = 0x70, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, // F键键值 class EMouseClickListener :
MULTIPLY, // 乘号键键值 public EMouseListener
ADD, // 加号键键值 {
SEPARATOR, // 分割键键值 public:
SUBTRACT, // 减号键键值 EMouseClickListener();
DECIMAL, // 小数点键键值
DIVIDE, // 除号键键值 EMouseClickListener(
TAB = 0x09, // TAB 键键值 EString name
ENTER = 0x0D, // 回车键键值 );
SHIFT, CTRL, // SHIFT 键键值
ESC = 0x1B, // ESCAPE 键键值 EMouseClickListener(
SPACE = 0x20, // 空格键键值 const MOUSE_CLICK_LISTENER_CALLBACK &callback
PAGE_UP, // PageUp 键键值 );
PAGE_DOWN, // PageDown 键键值
END, // End 键键值 EMouseClickListener(
HOME, // Home 键键值 EString name,
LEFT, // 左键键值 const MOUSE_CLICK_LISTENER_CALLBACK &callback
UP, // 上键键值 );
RIGHT, // 右键键值
DOWN // 下键键值 // 执行监听器回调函数
}; virtual void runCallback() override;
// 获取按键消息类型 // 设置监听器回调函数
static KEYBOARD_MSG getMsg(); void setCallback(
const MOUSE_CLICK_LISTENER_CALLBACK &callback
// 获取键值 );
static KEY getVal();
protected:
// 获取按键消息的计数 MOUSE_CLICK_LISTENER_CALLBACK m_callback;
static DWORD getCount(); };
// 获取特定按键的状态
static bool isKeyDown( // 鼠标拖动消息监听器
KEY key class EMouseDraggedListener :
); public EMouseListener
{
// 获取大小写锁定状态 public:
static bool isCapitalLockOn(); EMouseDraggedListener();
// 获取数字小键盘锁定状态 EMouseDraggedListener(
static bool isNumpadLockOn(); EString name
);
// 获取滑动锁定状态
static bool isScrollLockOn(); EMouseDraggedListener(
const MOUSE_DRAG_LISTENER_CALLBACK &callback
protected: );
UINT m_nMsg = 0;
WPARAM m_wParam = 0; EMouseDraggedListener(
LPARAM m_lParam = 0; EString name,
}; const MOUSE_DRAG_LISTENER_CALLBACK &callback
);
// 按键消息监听器 // 执行监听器回调函数
class EKeyListener : virtual void runCallback() override;
public EListener
{ // 设置监听器回调函数
public: void setCallback(
EKeyListener(); const MOUSE_DRAG_LISTENER_CALLBACK &callback
);
EKeyListener(
EString name protected:
); EPoint m_Begin;
EPoint m_End;
EKeyListener( MOUSE_DRAG_LISTENER_CALLBACK m_callback;
const KEY_LISTENER_CALLBACK &callback };
);
EKeyListener( // 按键消息监听器
EString name, class EKeyboardListener :
const KEY_LISTENER_CALLBACK &callback public EListener
); {
public:
// 执行监听器回调函数 EKeyboardListener();
virtual void runCallback();
EKeyboardListener(
// 设置监听器回调函数 EString name
void setCallback( );
const KEY_LISTENER_CALLBACK &callback
); EKeyboardListener(
const KEY_LISTENER_CALLBACK &callback
protected: );
KEY_LISTENER_CALLBACK m_callback;
}; EKeyboardListener(
EString name,
const KEY_LISTENER_CALLBACK &callback
// 按键按下消息监听 );
class EKeyPressListener :
public EKeyListener // 执行监听器回调函数
{ virtual void runCallback();
public:
EKeyPressListener(); // 设置监听器回调函数
void setCallback(
EKeyPressListener( const KEY_LISTENER_CALLBACK &callback
EString name );
);
protected:
EKeyPressListener( KEY_LISTENER_CALLBACK m_callback;
const KEY_LISTENER_CALLBACK &callback };
);
EKeyPressListener( // 按键按下消息监听
EString name, class EKeyPressListener :
const KEY_LISTENER_CALLBACK &callback public EKeyboardListener
); {
public:
// 执行监听器回调函数 EKeyPressListener();
virtual void runCallback() override;
}; EKeyPressListener(
EString name
);
// 消息管理器
class EMsgManager EKeyPressListener(
{ const KEY_LISTENER_CALLBACK &callback
friend EApp; );
public: EKeyPressListener(
// 添加鼠标消息监听器 EString name,
static void addListener( const KEY_LISTENER_CALLBACK &callback
EMouseListener * listener, );
EScene * pParentScene
); // 执行监听器回调函数
virtual void runCallback() override;
// 添加按键消息监听器 };
static void addListener(
EKeyListener * listener,
EScene * pParentScene // 消息管理器
); class EMsgManager
{
// 启动具有相同名称的监听器 friend EApp;
static void startListener(
EString name public:
); // 绑定鼠标消息监听器到场景
static void bindListenerWithScene(
// 停止具有相同名称的监听器 EMouseListener * listener,
static void stopListener( EScene * pParentScene
EString name );
);
// 绑定按键消息监听器到场景
// 删除具有相同名称的监听器 static void bindListenerWithScene(
static void delListener( EKeyboardListener * listener,
EString name EScene * pParentScene
); );
// 挂起场景上的所有监听器 // 启动具有相同名称的监听器
static void waitAllListenersOnScene( static void startListener(
EScene * scene EString name
); );
// 重启场景上的所有监听器 // 停止具有相同名称的监听器
static void notifyAllListenersOnScene( static void stopListener(
EScene * scene EString name
); );
private: // 删除具有相同名称的监听器
static void MouseProc( static void delListener(
UINT message, EString name
WPARAM wParam, );
LPARAM lParam
); // 启动所有鼠标消息监听器
static void startAllMouseListener();
static void KeyboardProc(
UINT message, // 停止所有鼠标消息监听器
WPARAM wParam, static void stopAllMouseListener();
LPARAM lParam
); // 清除所有鼠标消息监听器
}; static void clearAllMouseListeners();
// 启动所有按键消息监听器
static void startAllKeyboardListener();
// 停止所有按键消息监听器
static void stopAllKeyboardListener();
// 清除所有按键消息监听器
static void clearAllKeyboardListeners();
// 启动绑定在场景上的所有鼠标消息监听器
static void startAllMouseListenersBindWithScene(
EScene * pParentScene
);
// 重启绑定在场景上的所有鼠标消息监听器
static void stopAllMouseListenersBindWithScene(
EScene * pParentScene
);
// 启动绑定在场景上的所有按键消息监听器
static void startAllKeyboardListenersBindWithScene(
EScene * pParentScene
);
// 重启绑定在场景上的所有按键消息监听器
static void stopAllKeyboardListenersBindWithScene(
EScene * pParentScene
);
// 挂起绑定在场景上的所有监听器
static void waitAllListenersBindWithScene(
EScene * pParentScene
);
// 重启绑定在场景上的所有监听器
static void notifyAllListenersBindWithScene(
EScene * pParentScene
);
// 清空绑定在场景上的所有监听器
static void clearAllListenersBindWithScene(
EScene * pParentScene
);
// 挂起绑定在节点上的所有监听器
static void waitAllListenersBindWithNode(
ENode * pParentNode
);
// 重启绑定在节点上的所有监听器
static void notifyAllListenersBindWithNode(
ENode * pParentNode
);
// 清空绑定在节点上的所有监听器
static void clearAllListenersBindWithNode(
ENode * pParentNode
);
private:
static void MouseProc(
UINT message,
WPARAM wParam,
LPARAM lParam
);
static void KeyboardProc(
UINT message,
WPARAM wParam,
LPARAM lParam
);
};
} }

View File

@ -4,6 +4,9 @@
namespace e2d namespace e2d
{ {
class EScene;
class EObject;
class ENode : class ENode :
public EObject public EObject
{ {
@ -144,7 +147,7 @@ public:
); );
// 设置节点所在场景 // 设置节点所在场景
void setParentScene( void bindWithScene(
EScene * scene EScene * scene
); );

View File

@ -10,7 +10,7 @@ class EObjectManager
friend EApp; friend EApp;
public: public:
// 将一个节点放入释放 // 将一个节点放入内存
static void add( static void add(
e2d::EObject * nptr e2d::EObject * nptr
); );
@ -18,9 +18,19 @@ public:
// 删除所有节点 // 删除所有节点
static void clearAllObjects(); static void clearAllObjects();
// 通知内存池刷新
static void notifyFlush();
private: private:
// 刷新内存池 // 刷新内存池
static void __flush(); static void __flush();
}; };
// 定时器管理器
class ETimerManager
{
};
} }