整体优化

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>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Demo</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<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>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

View File

@ -1,12 +1,16 @@
#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;
if (app.init(L"Easy2D Demo", 640, 480))
if (app.init(L"Easy2D Demo", 640, 480, true))
{
auto scene = new EScene();
@ -37,9 +41,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
node->move(3, 0);
}
}
EApp::setWindowSize(500, 500);
});
EMsgManager::addListener(listener);
listener->bindWithNode(node);
EMsgManager::bindListenerWithScene(listener, scene);
app.enterScene(scene);

View File

@ -1,12 +1,14 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.16
VisualStudioVersion = 15.0.26730.12
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D\Easy2D.vcxproj", "{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo.vcxproj", "{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleDemo", "ConsoleDemo\ConsoleDemo.vcxproj", "{70931955-FE2D-4A50-93C6-6955A730B0FE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
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|x86.ActiveCfg = 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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

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

View File

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

View File

@ -1,17 +1,14 @@
#include "..\ebase.h"
#include "..\enodes.h"
#include "..\emsg.h"
e2d::EScene::EScene()
{
EApp::get()->setLoadingScene(this);
}
e2d::EScene::~EScene()
{
clearAllChildren();
}
void e2d::EScene::_exec()
/*void e2d::EScene::_exec()
{
// active 标志画面是否取得焦点
bool active = true;
@ -23,7 +20,7 @@ void e2d::EScene::_exec()
active = false; // 若子节点取得焦点,将标志置 false
}
}
}
}*/
void e2d::EScene::_onRender()
{
@ -34,10 +31,6 @@ void e2d::EScene::_onRender()
}
}
void e2d::EScene::init()
{
}
void e2d::EScene::onEnter()
{
}
@ -49,11 +42,11 @@ void e2d::EScene::onExit()
void e2d::EScene::add(ENode * child, int zOrder /* = 0 */)
{
// 断言添加的节点非空
ASSERT(child != nullptr);
ASSERT(child != nullptr, "Scene::add NULL pointer exception.");
// 忽略空指针
if (child == nullptr) return;
// 设置节点的父场景
child->setParentScene(this);
child->bindWithScene(this);
// 设置 z 轴顺序
child->setZOrder(zOrder);
// 对象的引用计数加一
@ -119,3 +112,13 @@ void e2d::EScene::clearAllChildren()
// 清空储存节点的容器
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>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Easy2D</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@ -204,6 +204,7 @@
<ClCompile Include="Msg\Listener\EMouseListener.cpp" />
<ClCompile Include="Node\ENode.cpp" />
<ClCompile Include="Tool\EObjectManager.cpp" />
<ClCompile Include="Tool\ETimerManager.cpp" />
<ClCompile Include="Win\winbase.cpp" />
</ItemGroup>
<ItemGroup>

View File

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

View File

@ -8,9 +8,9 @@ e2d::EMouseMsg mouseMsg;
// 按键消息
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()
@ -125,7 +125,7 @@ void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam)
mouseMsg.m_wParam = wParam;
mouseMsg.m_lParam = lParam;
// 执行鼠标消息监听函数
for (auto mlistener : m_vMouseListeners)
for (auto mlistener : s_vMouseListeners)
{
if (mlistener->isRunning())
{
@ -141,7 +141,7 @@ void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam)
keyMsg.m_wParam = wParam;
keyMsg.m_lParam = lParam;
// 执行按键消息监听函数
for (auto klistener : m_vKeyListeners)
for (auto klistener : s_vKeyListeners)
{
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(pParentScene == nullptr, "Bind EMouseListener on a NULL Scene!");
WARN_IF(listener == nullptr, "EMouseListener NULL pointer exception!");
WARN_IF(pParentScene == nullptr, "Bind EMouseListener with a NULL EScene pointer!");
if (listener && pParentScene)
{
listener->start();
listener->retain();
listener->setParentScene(pParentScene);
m_vMouseListeners.push_back(listener);
listener->bindWithScene(pParentScene);
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(pParentScene == nullptr, "Bind EKeyListener on a NULL Scene!");
WARN_IF(listener == nullptr, "EKeyboardListener NULL pointer exception!");
WARN_IF(pParentScene == nullptr, "Bind EKeyboardListener with a NULL EScene pointer!");
if (listener && pParentScene)
{
listener->start();
listener->retain();
listener->setParentScene(pParentScene);
m_vKeyListeners.push_back(listener);
listener->bindWithScene(pParentScene);
s_vKeyListeners.push_back(listener);
}
}
void e2d::EMsgManager::startListener(EString name)
{
// 启动鼠标消息监听器
for (auto l : m_vMouseListeners)
for (auto l : s_vMouseListeners)
{
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)
{
@ -201,7 +201,7 @@ void e2d::EMsgManager::startListener(EString name)
void e2d::EMsgManager::stopListener(EString name)
{
// 停止鼠标消息监听器
for (auto l : m_vMouseListeners)
for (auto l : s_vMouseListeners)
{
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)
{
@ -221,41 +221,153 @@ void e2d::EMsgManager::stopListener(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();
(*iter)->release();
delete (*iter);
iter = m_vMouseListeners.erase(iter);
(*mIter)->autoRelease();
(*mIter)->release();
mIter = s_vMouseListeners.erase(mIter);
}
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();
(*iter)->release();
delete (*iter);
iter = m_vKeyListeners.erase(iter);
(*kIter)->autoRelease();
(*kIter)->release();
kIter = s_vKeyListeners.erase(kIter);
}
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)
{
@ -263,7 +375,7 @@ void e2d::EMsgManager::waitAllListenersOnScene(EScene * scene)
}
}
// 挂起按键消息监听器
for (auto l : m_vKeyListeners)
for (auto l : s_vKeyListeners)
{
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)
{
@ -283,7 +395,7 @@ void e2d::EMsgManager::notifyAllListenersOnScene(EScene * scene)
}
}
// 重启按键消息监听器
for (auto l : m_vKeyListeners)
for (auto l : s_vKeyListeners)
{
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"
e2d::EKeyListener::EKeyListener()
e2d::EKeyboardListener::EKeyboardListener()
: EListener()
{
}
e2d::EKeyListener::EKeyListener(EString name)
e2d::EKeyboardListener::EKeyboardListener(EString name)
: EListener(name)
{
}
e2d::EKeyListener::EKeyListener(const KEY_LISTENER_CALLBACK & callback)
e2d::EKeyboardListener::EKeyboardListener(const KEY_LISTENER_CALLBACK & callback)
: EListener()
{
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)
{
m_callback = callback;
}
void e2d::EKeyListener::runCallback()
void e2d::EKeyboardListener::runCallback()
{
m_callback();
}
void e2d::EKeyListener::setCallback(const KEY_LISTENER_CALLBACK & callback)
void e2d::EKeyboardListener::setCallback(const KEY_LISTENER_CALLBACK & callback)
{
m_callback = callback;
}

View File

@ -1,22 +1,22 @@
#include "..\..\emsg.h"
e2d::EKeyPressListener::EKeyPressListener()
: EKeyListener()
: EKeyboardListener()
{
}
e2d::EKeyPressListener::EKeyPressListener(EString name)
: EKeyListener(name)
: EKeyboardListener(name)
{
}
e2d::EKeyPressListener::EKeyPressListener(const KEY_LISTENER_CALLBACK & callback)
: EKeyListener(callback)
: EKeyboardListener(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_sName(L"")
, m_pParentScene(nullptr)
, m_pParentNode(nullptr)
{
}
@ -19,6 +20,11 @@ bool e2d::EListener::isRunning() const
return m_bRunning && !m_bWaiting;
}
bool e2d::EListener::isWaiting() const
{
return m_bWaiting;
}
void e2d::EListener::start()
{
m_bRunning = true;
@ -39,6 +45,11 @@ void e2d::EListener::notify()
m_bWaiting = false;
}
e2d::EListener * e2d::EListener::clone()
{
return nullptr;
}
e2d::EString e2d::EListener::getName() const
{
return m_sName;
@ -49,12 +60,32 @@ e2d::EScene * e2d::EListener::getParentScene() const
return m_pParentScene;
}
e2d::ENode * e2d::EListener::getParentNode() const
{
return m_pParentNode;
}
void e2d::EListener::setName(EString 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;
}
void e2d::ENode::setParentScene(EScene * scene)
void e2d::ENode::bindWithScene(EScene * scene)
{
m_pParentScene = scene;
}

View File

@ -10,9 +10,14 @@
// 释放池容器
static std::vector<e2d::EObject*> s_vPool;
// 标志释放池执行状态
static bool s_bNotifyed = false;
void e2d::EObjectManager::__flush()
{
if (!s_bNotifyed) return;
s_bNotifyed = false;
// 创建迭代器
static std::vector<e2d::EObject*>::iterator iter;
// 循环遍历容器中的所有对象
@ -49,3 +54,8 @@ void e2d::EObjectManager::clearAllObjects()
}
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;
}
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 <dwrite.h>
#include <wincodec.h>
#pragma comment(lib, "d2d1.lib")
HWND &GetHWnd();
@ -11,8 +12,6 @@ ID2D1Factory * &GetFactory();
ID2D1HwndRenderTarget * &GetRenderTarget();
void WindowCenter(HWND hWnd);
template<class Interface>
inline void SafeReleaseInterface(

View File

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

View File

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

View File

@ -25,14 +25,18 @@
#ifndef ASSERT_IF
#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
#define ASSERT(b)
#define ASSERT(b, m) ((void)0)
#endif //DEBUG || _DEBUG
#endif
#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

View File

@ -4,9 +4,9 @@
namespace e2d
{
class ENode;
class EMsgManager;
// 鼠标消息
class EMouseMsg
{
@ -66,6 +66,77 @@ protected:
};
// 按键消息
class EKeyMsg
{
friend EMsgManager;
public:
// 按键消息类型集合
enum class KEYBOARD_MSG
{
KEY_DOWN = 0x0100, // 按下
KEY_UP // 抬起
};
// 按键键值集合
enum class KEY
{
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键键值
MULTIPLY, // 乘号键键值
ADD, // 加号键键值
SEPARATOR, // 分割键键值
SUBTRACT, // 减号键键值
DECIMAL, // 小数点键键值
DIVIDE, // 除号键键值
TAB = 0x09, // TAB 键键值
ENTER = 0x0D, // 回车键键值
SHIFT, CTRL, // SHIFT 键键值
ESC = 0x1B, // ESCAPE 键键值
SPACE = 0x20, // 空格键键值
PAGE_UP, // PageUp 键键值
PAGE_DOWN, // PageDown 键键值
END, // End 键键值
HOME, // Home 键键值
LEFT, // 左键键值
UP, // 上键键值
RIGHT, // 右键键值
DOWN // 下键键值
};
// 获取按键消息类型
static KEYBOARD_MSG getMsg();
// 获取键值
static KEY getVal();
// 获取按键消息的计数
static DWORD getCount();
// 获取特定按键的状态
static bool isKeyDown(
KEY key
);
// 获取大小写锁定状态
static bool isCapitalLockOn();
// 获取数字小键盘锁定状态
static bool isNumpadLockOn();
// 获取滑动锁定状态
static bool isScrollLockOn();
protected:
UINT m_nMsg = 0;
WPARAM m_wParam = 0;
LPARAM m_lParam = 0;
};
// 监听器
class EListener :
public EObject
@ -80,6 +151,9 @@ public:
// 获取监听器状态
bool isRunning() const;
// 获取监听器挂起状态
bool isWaiting() const;
// 启动监听
void start();
@ -92,27 +166,39 @@ public:
// 唤醒
void notify();
// 克隆一个相同的监听器
virtual EListener * clone();
// 获取监听器名称
EString getName() const;
// 获取监听器所在场景
EScene * getParentScene() const;
// 获取监听器所在节点
ENode * getParentNode() const;
// 设置监听器名称
void setName(
EString name
);
// 设置监听器所在场景
void setParentScene(
EScene * scene
// 绑定监听器到场景
void bindWithScene(
EScene * pParentScene
);
// 绑定监听器到节点
void bindWithNode(
ENode * pParentNode
);
protected:
EString m_sName;
bool m_bRunning;
bool m_bWaiting;
EScene * m_pParentScene;
EString m_sName;
bool m_bRunning;
bool m_bWaiting;
EScene * m_pParentScene;
ENode * m_pParentNode;
};
@ -217,93 +303,22 @@ protected:
};
// 按键消息
class EKeyMsg
{
friend EMsgManager;
public:
// 按键消息类型集合
enum class KEYBOARD_MSG
{
KEY_DOWN = 0x0100, // 按下
KEY_UP // 抬起
};
// 按键键值集合
enum class KEY
{
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键键值
MULTIPLY, // 乘号键键值
ADD, // 加号键键值
SEPARATOR, // 分割键键值
SUBTRACT, // 减号键键值
DECIMAL, // 小数点键键值
DIVIDE, // 除号键键值
TAB = 0x09, // TAB 键键值
ENTER = 0x0D, // 回车键键值
SHIFT, CTRL, // SHIFT 键键值
ESC = 0x1B, // ESCAPE 键键值
SPACE = 0x20, // 空格键键值
PAGE_UP, // PageUp 键键值
PAGE_DOWN, // PageDown 键键值
END, // End 键键值
HOME, // Home 键键值
LEFT, // 左键键值
UP, // 上键键值
RIGHT, // 右键键值
DOWN // 下键键值
};
// 获取按键消息类型
static KEYBOARD_MSG getMsg();
// 获取键值
static KEY getVal();
// 获取按键消息的计数
static DWORD getCount();
// 获取特定按键的状态
static bool isKeyDown(
KEY key
);
// 获取大小写锁定状态
static bool isCapitalLockOn();
// 获取数字小键盘锁定状态
static bool isNumpadLockOn();
// 获取滑动锁定状态
static bool isScrollLockOn();
protected:
UINT m_nMsg = 0;
WPARAM m_wParam = 0;
LPARAM m_lParam = 0;
};
// 按键消息监听器
class EKeyListener :
class EKeyboardListener :
public EListener
{
public:
EKeyListener();
EKeyboardListener();
EKeyListener(
EKeyboardListener(
EString name
);
EKeyListener(
EKeyboardListener(
const KEY_LISTENER_CALLBACK &callback
);
EKeyListener(
EKeyboardListener(
EString name,
const KEY_LISTENER_CALLBACK &callback
);
@ -323,7 +338,7 @@ protected:
// 按键按下消息监听
class EKeyPressListener :
public EKeyListener
public EKeyboardListener
{
public:
EKeyPressListener();
@ -352,15 +367,15 @@ class EMsgManager
friend EApp;
public:
// 添加鼠标消息监听器
static void addListener(
// 绑定鼠标消息监听器到场景
static void bindListenerWithScene(
EMouseListener * listener,
EScene * pParentScene
);
// 添加按键消息监听器
static void addListener(
EKeyListener * listener,
// 绑定按键消息监听器到场景
static void bindListenerWithScene(
EKeyboardListener * listener,
EScene * pParentScene
);
@ -379,14 +394,72 @@ public:
EString name
);
// 挂起场景上的所有监听器
static void waitAllListenersOnScene(
EScene * scene
// 启动所有鼠标消息监听器
static void startAllMouseListener();
// 停止所有鼠标消息监听器
static void stopAllMouseListener();
// 清除所有鼠标消息监听器
static void clearAllMouseListeners();
// 启动所有按键消息监听器
static void startAllKeyboardListener();
// 停止所有按键消息监听器
static void stopAllKeyboardListener();
// 清除所有按键消息监听器
static void clearAllKeyboardListeners();
// 启动绑定在场景上的所有鼠标消息监听器
static void startAllMouseListenersBindWithScene(
EScene * pParentScene
);
// 重启场景上的所有监听器
static void notifyAllListenersOnScene(
EScene * scene
// 重启绑定在场景上的所有鼠标消息监听器
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:

View File

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

View File

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