| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | #include "..\ebase.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | #include "..\Win\winbase.h"
 | 
					
						
							|  |  |  |  | #include <stack>
 | 
					
						
							|  |  |  |  | #include <chrono>
 | 
					
						
							|  |  |  |  | #include <thread>
 | 
					
						
							|  |  |  |  | using namespace std::chrono; | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | using namespace std::this_thread; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #ifndef HINST_THISCOMPONENT
 | 
					
						
							|  |  |  |  | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | 
					
						
							|  |  |  |  | #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
 | 
					
						
							|  |  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::EApp * s_pInstance = nullptr; | 
					
						
							|  |  |  |  | std::stack<e2d::EScene*> s_SceneStack; | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | e2d::EApp::EApp() | 
					
						
							|  |  |  |  | 	: m_bRunning(false) | 
					
						
							|  |  |  |  | 	, m_ClearColor(EColor::White) | 
					
						
							|  |  |  |  | 	, m_bSaveScene(true) | 
					
						
							|  |  |  |  | 	, m_pCurrentScene(nullptr) | 
					
						
							|  |  |  |  | 	, m_pNextScene(nullptr) | 
					
						
							|  |  |  |  | 	, m_pLoadingScene(nullptr) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	s_pInstance = this;		// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | e2d::EApp::~EApp() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	SafeReleaseInterface(&GetFactory()); | 
					
						
							|  |  |  |  | 	SafeReleaseInterface(&GetRenderTarget()); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::EApp * e2d::EApp::get() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	ASSERT(s_pInstance != nullptr); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	return s_pInstance;		// <20><>ȡ EApp <20><>Ψһʵ<D2BB><CAB5>
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | bool e2d::EApp::init(e2d::EString title, e2d::ESize size, bool bShowConsole /* = false */) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	return init(title, size.cx, size.cy, bShowConsole); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShowConsole /* = false */) | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	m_sTitle = title; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	HRESULT hr; | 
					
						
							|  |  |  |  | 	hr = CoInitialize(NULL); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20>رտ<D8B1><D5BF><EFBFBD>̨.
 | 
					
						
							|  |  |  |  | 		if (bShowConsole) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			HWND hwnd = FindWindow(L"ConsoleWindowClass", NULL); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			if (hwnd) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 				ShowWindow(hwnd, SW_HIDE); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><>ʼ<EFBFBD><CABC> device-indpendent <20><>Դ
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD> Direct2D factory.
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 		hr = _createDeviceIndependentResources(); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// ע<>ᴰ<EFBFBD><E1B4B0><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; | 
					
						
							|  |  |  |  | 			wcex.style = CS_HREDRAW | CS_VREDRAW; | 
					
						
							|  |  |  |  | 			wcex.lpfnWndProc = EApp::WndProc; | 
					
						
							|  |  |  |  | 			wcex.cbClsExtra = 0; | 
					
						
							|  |  |  |  | 			wcex.cbWndExtra = sizeof(LONG_PTR); | 
					
						
							|  |  |  |  | 			wcex.hInstance = HINST_THISCOMPONENT; | 
					
						
							|  |  |  |  | 			wcex.hbrBackground = NULL; | 
					
						
							|  |  |  |  | 			wcex.lpszMenuName = NULL; | 
					
						
							|  |  |  |  | 			wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION); | 
					
						
							|  |  |  |  | 			wcex.lpszClassName = L"E2DApp"; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			RegisterClassEx(&wcex); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// Because the CreateWindow function takes its size in pixels,
 | 
					
						
							|  |  |  |  | 			// obtain the system DPI and use it to scale the window size.
 | 
					
						
							|  |  |  |  | 			FLOAT dpiX, dpiY; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// The factory returns the current system DPI. This is also the value it will use
 | 
					
						
							|  |  |  |  | 			// to create its own windows.
 | 
					
						
							|  |  |  |  | 			GetFactory()->GetDesktopDpi(&dpiX, &dpiY); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// Create the window.
 | 
					
						
							|  |  |  |  | 			GetHWnd() = CreateWindow( | 
					
						
							|  |  |  |  | 				L"E2DApp", | 
					
						
							|  |  |  |  | 				m_sTitle.c_str(), | 
					
						
							|  |  |  |  | 				WS_OVERLAPPEDWINDOW, | 
					
						
							|  |  |  |  | 				CW_USEDEFAULT, | 
					
						
							|  |  |  |  | 				CW_USEDEFAULT, | 
					
						
							|  |  |  |  | 				static_cast<UINT>(ceil(width * dpiX / 96.f)), | 
					
						
							|  |  |  |  | 				static_cast<UINT>(ceil(height * dpiY / 96.f)), | 
					
						
							|  |  |  |  | 				NULL, | 
					
						
							|  |  |  |  | 				NULL, | 
					
						
							|  |  |  |  | 				HINST_THISCOMPONENT, | 
					
						
							|  |  |  |  | 				this | 
					
						
							|  |  |  |  | 			); | 
					
						
							|  |  |  |  | 			hr = GetHWnd() ? S_OK : E_FAIL; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	if (FAILED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		MessageBox(nullptr, L"Initialize Failed!", L"Error", MB_OK); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	return SUCCEEDED(hr); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
 | 
					
						
							|  |  |  |  | void e2d::EApp::run() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	ShowWindow(GetHWnd(), SW_SHOWNORMAL); | 
					
						
							|  |  |  |  | 	UpdateWindow(GetHWnd()); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
 | 
					
						
							|  |  |  |  | 	m_bRunning = true; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	MSG msg; | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	while (m_bRunning) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 			// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 			if (msg.message == WM_QUIT) | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 				m_bRunning = false; | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2017-10-10 01:24:55 +08:00
										 |  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 			TranslateMessage(&msg); | 
					
						
							|  |  |  |  | 			DispatchMessage(&msg); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// ִ<><D6B4><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
 | 
					
						
							|  |  |  |  | 			_mainLoop(); | 
					
						
							|  |  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	// <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>ѭ<EFBFBD><D1AD>
 | 
					
						
							|  |  |  |  | 	_mainLoop(); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	// <20>رմ<D8B1><D5B4><EFBFBD>
 | 
					
						
							|  |  |  |  | 	close(); | 
					
						
							|  |  |  |  | 	// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><D5BC>
 | 
					
						
							| 
									
										
										
										
											2017-10-06 13:58:00 +08:00
										 |  |  |  | 	free(); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | void e2d::EApp::_mainLoop() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	static steady_clock::time_point nNow; | 
					
						
							|  |  |  |  | 	static steady_clock::time_point nLast = steady_clock::now(); | 
					
						
							|  |  |  |  | 	// ֡<><D6A1><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	static LONGLONG nAnimationInterval = 17LL; | 
					
						
							|  |  |  |  | 	// ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	static LONGLONG nInterval = 0LL; | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | 	static LONGLONG nWaitMS = 0L; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// ˢ<>¼<EFBFBD>ʱ
 | 
					
						
							|  |  |  |  | 	nNow = steady_clock::now(); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	nInterval = duration_cast<milliseconds>(nNow - nLast).count(); | 
					
						
							|  |  |  |  | 	// <20>жϼ<D0B6><CFBC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
 | 
					
						
							|  |  |  |  | 	if (nInterval >= nAnimationInterval) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
 | 
					
						
							|  |  |  |  | 		nLast = nNow; | 
					
						
							|  |  |  |  | 		// 
 | 
					
						
							|  |  |  |  | 		_onControl(); | 
					
						
							|  |  |  |  | 		// ˢ<><CBA2><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		_onRender(); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 	else | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | 		nWaitMS = nAnimationInterval - nInterval - 1; | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3>ͷ<EFBFBD> CPU ռ<><D5BC>
 | 
					
						
							|  |  |  |  | 		if (nWaitMS > 1LL) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			std::this_thread::sleep_for(milliseconds(nWaitMS)); | 
					
						
							|  |  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | void e2d::EApp::_onControl() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-18 23:59:08 +08:00
										 |  |  |  | 	// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ָ<EFBFBD>벻Ϊ<EBB2BB><CEAA>ʱ<EFBFBD><CAB1><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-06 02:32:33 +08:00
										 |  |  |  | 	if (m_pNextScene) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-09-18 23:59:08 +08:00
										 |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 		_enterNextScene(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>Ե<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	ASSERT(m_pCurrentScene != nullptr); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	//MouseMsg::__exec();			// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	//KeyMsg::__exec();			// <20><><EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	//Timer::__exec();			// <20><>ʱ<EFBFBD><CAB1>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
 | 
					
						
							|  |  |  |  | 	//ActionManager::__exec();	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	//EObjectManager::__flush();		// ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | // 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() | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	HRESULT hr = S_OK; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	hr = _createDeviceResources(); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (SUCCEEDED(hr)) | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		GetRenderTarget()->BeginDraw(); | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		GetRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		GetRenderTarget()->Clear(D2D1::ColorF(m_ClearColor)); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		m_pCurrentScene->_onDraw();	// <20><><EFBFBD>Ƶ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		hr = GetRenderTarget()->EndDraw(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (hr == D2DERR_RECREATE_TARGET) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		hr = S_OK; | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 		_discardDeviceResources(); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	return SUCCEEDED(hr); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | void e2d::EApp::setWindowSize(int width, int height) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | 	// <20><>ȡ<EFBFBD><C8A1>Ļ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
 | 
					
						
							|  |  |  |  | 	int screenWidth = GetSystemMetrics(SM_CXSCREEN); | 
					
						
							|  |  |  |  | 	int screenHeight = GetSystemMetrics(SM_CYSCREEN); | 
					
						
							|  |  |  |  | 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	tagRECT rcWindow; | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | 	GetWindowRect(GetHWnd(), &rcWindow); | 
					
						
							|  |  |  |  | 	// <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>С
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	tagRECT rcClient; | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | 	GetClientRect(GetHWnd(), &rcClient); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>С
 | 
					
						
							|  |  |  |  | 	width += (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left); | 
					
						
							|  |  |  |  | 	height += (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>ٵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	// DestroyWindow(m_);
 | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | 	// <20>Ĵ<DEB8><C4B4>ڴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	SetWindowPos( | 
					
						
							|  |  |  |  | 		GetHWnd(),  | 
					
						
							|  |  |  |  | 		HWND_TOP, | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | 		(screenWidth - width) / 2, | 
					
						
							|  |  |  |  | 		(screenHeight - height) / 2, | 
					
						
							|  |  |  |  | 		width, | 
					
						
							|  |  |  |  | 		height, | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		SWP_SHOWWINDOW | 
					
						
							|  |  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::setWindowSize(e2d::ESize size) | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	setWindowSize(size.cx, size.cy); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::setWindowTitle(e2d::EString title) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1><EFBFBD>
 | 
					
						
							|  |  |  |  | 	SetWindowText(GetHWnd(), title.c_str()); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD>Ĵ<DEB8><C4B4>ڴ<EFBFBD>Сʱ<D0A1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	m_sTitle = title; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::EString e2d::EApp::getTitle() | 
					
						
							| 
									
										
										
										
											2017-09-20 14:52:50 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	return m_sTitle; | 
					
						
							| 
									
										
										
										
											2017-09-20 14:52:50 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::ESize e2d::EApp::getSize() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	return e2d::ESize(GetRenderTarget()->GetPixelSize().width, GetRenderTarget()->GetPixelSize().height); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | UINT32 e2d::EApp::getWidth() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	return GetRenderTarget()->GetPixelSize().width; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | UINT32 e2d::EApp::getHeight() | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	return GetRenderTarget()->GetPixelSize().height; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::enterScene(EScene * scene, bool save /* = true */) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	m_pNextScene = scene; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	m_bSaveScene = save; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | void e2d::EApp::backScene() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><>ջ<EFBFBD><D5BB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EBA3AC>Ϊ<EFBFBD><CEAA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	m_pNextScene = s_SceneStack.top(); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	m_bSaveScene = false; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | void e2d::EApp::clearScene() | 
					
						
							| 
									
										
										
										
											2017-09-18 23:59:08 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>ջ
 | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 	while (s_SceneStack.size()) | 
					
						
							| 
									
										
										
										
											2017-09-18 23:59:08 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 		auto temp = s_SceneStack.top(); | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		SafeDelete(&temp); | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 		s_SceneStack.pop(); | 
					
						
							| 
									
										
										
										
											2017-09-18 23:59:08 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::EScene * e2d::EApp::getCurrentScene() | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	return m_pCurrentScene; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::EScene * e2d::EApp::getLoadingScene() | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	return m_pLoadingScene; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::setLoadingScene(EScene * scene) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	m_pLoadingScene = scene; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EApp::setAppName(e2d::EString appname) | 
					
						
							| 
									
										
										
										
											2017-09-20 14:52:50 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | 	s_pInstance->m_sAppName = appname; | 
					
						
							| 
									
										
										
										
											2017-09-20 14:52:50 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | e2d::EString e2d::EApp::getAppName() | 
					
						
							| 
									
										
										
										
											2017-09-20 14:52:50 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | 	return s_pInstance->m_sAppName; | 
					
						
							| 
									
										
										
										
											2017-09-20 14:52:50 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::setBkColor(EColor::Enum color) | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	m_ClearColor = color; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EApp::close() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	ShowWindow(GetHWnd(), SW_HIDE); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EApp::show() | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	ShowWindow(GetHWnd(), SW_NORMAL); | 
					
						
							| 
									
										
										
										
											2017-09-12 12:53:34 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::free() | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20>ͷų<CDB7><C5B3><EFBFBD><EFBFBD>ڴ<EFBFBD>
 | 
					
						
							|  |  |  |  | 	SafeDelete(&m_pCurrentScene); | 
					
						
							|  |  |  |  | 	SafeDelete(&m_pNextScene); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>ջ
 | 
					
						
							|  |  |  |  | 	while (s_SceneStack.size()) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		auto temp = s_SceneStack.top(); | 
					
						
							|  |  |  |  | 		SafeDelete(&temp); | 
					
						
							|  |  |  |  | 		s_SceneStack.pop(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | 	//Timer::clearAllTimers();
 | 
					
						
							|  |  |  |  | 	//MouseMsg::clearAllListeners();
 | 
					
						
							|  |  |  |  | 	//KeyMsg::clearAllListeners();
 | 
					
						
							|  |  |  |  | 	//ActionManager::clearAllActions();
 | 
					
						
							|  |  |  |  | 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	//EObjectManager::__clearAllObjects();
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::quit() | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	m_bRunning = false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::end() | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	m_bRunning = false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::_enterNextScene() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 	bool bBackScene = false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 	if (s_SceneStack.size() && m_pNextScene == s_SceneStack.top()) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 		bBackScene = true; | 
					
						
							|  |  |  |  | 		// ɾ<><C9BE>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 		s_SceneStack.pop(); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// ִ<>е<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> onExit <20><><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	if (m_pCurrentScene) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		m_pCurrentScene->onExit(); | 
					
						
							|  |  |  |  | 		if (m_bSaveScene) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// <20><>Ҫ<EFBFBD><D2AA><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>
 | 
					
						
							| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | 			s_SceneStack.push(m_pCurrentScene); | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 			// <20><>ͣ<EFBFBD><CDA3>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 			//Timer::waitAllSceneTimers(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			//MouseMsg::waitAllSceneListeners(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			//KeyMsg::waitAllSceneListeners(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			//ActionManager::waitAllSceneActions(m_pCurrentScene);
 | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// <20><><EFBFBD><EFBFBD><EFBFBD>泡<EFBFBD><E6B3A1>ʱ<EFBFBD><CAB1>ֹͣ<CDA3><D6B9>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 			//Timer::clearAllSceneTimers(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			//MouseMsg::clearAllSceneListeners(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			//KeyMsg::clearAllSceneListeners(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			//ActionManager::stopAllSceneActions(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 			SafeDelete(&m_pCurrentScene); | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	m_pCurrentScene = m_pNextScene;		// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	m_pNextScene = nullptr;				// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (bBackScene) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĶ<CFB5>ʱ<EFBFBD><CAB1>
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		//Timer::notifyAllSceneTimers(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 		//MouseMsg::notifyAllSceneListeners(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 		//KeyMsg::notifyAllSceneListeners(m_pCurrentScene);
 | 
					
						
							|  |  |  |  | 		//ActionManager::notifyAllSceneActions(m_pCurrentScene);
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 	else | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 		m_pCurrentScene->init();		// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>³<EFBFBD><C2B3><EFBFBD>ʱ<EFBFBD><CAB1>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> init <20><><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-06 16:40:10 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	m_pCurrentScene->onEnter();			// ִ<><D6B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> onEnter <20><><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | // Creates resources that are not bound to a particular device.
 | 
					
						
							|  |  |  |  | // Their lifetime effectively extends for the duration of the
 | 
					
						
							|  |  |  |  | // application.
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | HRESULT e2d::EApp::_createDeviceIndependentResources() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	HRESULT hr = S_OK; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	// Create a Direct2D factory.
 | 
					
						
							|  |  |  |  | 	hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &GetFactory()); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 	if (FAILED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		MessageBox(nullptr, L"Create Device Independent Resources Fail!", L"Error", MB_OK); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	return hr; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | // Creates resources that are bound to a particular
 | 
					
						
							|  |  |  |  | // Direct3D device. These resources need to be recreated
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | // if the Direct3D device dissapears, such as when the isVisiable
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | // changes, the window is remoted, etc.
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | HRESULT e2d::EApp::_createDeviceResources() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	HRESULT hr = S_OK; | 
					
						
							| 
									
										
										
										
											2017-10-08 12:30:45 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	if (!GetRenderTarget()) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		RECT rc; | 
					
						
							|  |  |  |  | 		GetClientRect(GetHWnd(), &rc); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		D2D1_SIZE_U size = D2D1::SizeU( | 
					
						
							|  |  |  |  | 			rc.right - rc.left, | 
					
						
							|  |  |  |  | 			rc.bottom - rc.top | 
					
						
							|  |  |  |  | 		); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Create a Direct2D render target.
 | 
					
						
							|  |  |  |  | 		hr = GetFactory()->CreateHwndRenderTarget( | 
					
						
							|  |  |  |  | 			D2D1::RenderTargetProperties(), | 
					
						
							|  |  |  |  | 			D2D1::HwndRenderTargetProperties(GetHWnd(), size), | 
					
						
							|  |  |  |  | 			&GetRenderTarget() | 
					
						
							|  |  |  |  | 		); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	return hr; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | // Discards device-dependent resources. These resources must be
 | 
					
						
							|  |  |  |  | // recreated when the Direct3D device is lost.
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | void e2d::EApp::_discardDeviceResources() | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	SafeReleaseInterface(&GetRenderTarget()); | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | //  If the application receives a WM_SIZE message, this method
 | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | //  re2d::ESizes the render target appropriately.
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | void e2d::EApp::_onResize(UINT width, UINT height) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	if (GetRenderTarget()) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// Note: This method can fail, but it's okay to ignore the
 | 
					
						
							|  |  |  |  | 		// error here, because the error will be returned again
 | 
					
						
							|  |  |  |  | 		// the next time EndDraw is called.
 | 
					
						
							|  |  |  |  | 		GetRenderTarget()->Resize(D2D1::SizeU(width, height)); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | // Handles window messages.
 | 
					
						
							|  |  |  |  | LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	LRESULT result = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (message == WM_CREATE) | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 		LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam; | 
					
						
							|  |  |  |  | 		EApp *pEApp = (EApp *)pcs->lpCreateParams; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		::SetWindowLongPtrW( | 
					
						
							|  |  |  |  | 			GetHWnd(), | 
					
						
							|  |  |  |  | 			GWLP_USERDATA, | 
					
						
							|  |  |  |  | 			PtrToUlong(pEApp) | 
					
						
							|  |  |  |  | 		); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		result = 1; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 	else | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		EApp *pEApp = reinterpret_cast<EApp *>(static_cast<LONG_PTR>( | 
					
						
							|  |  |  |  | 			::GetWindowLongPtrW( | 
					
						
							|  |  |  |  | 				GetHWnd(), | 
					
						
							|  |  |  |  | 				GWLP_USERDATA | 
					
						
							|  |  |  |  | 			))); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		bool wasHandled = false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (pEApp) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			switch (message) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2017-10-12 23:34:13 +08:00
										 |  |  |  | 			/*case WM_ACTIVATE:
 | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				if (LOWORD(wParam) == WA_INACTIVE) | 
					
						
							|  |  |  |  | 				{ | 
					
						
							|  |  |  |  | 					MSG msg; | 
					
						
							|  |  |  |  | 					do | 
					
						
							|  |  |  |  | 					{ | 
					
						
							|  |  |  |  | 						GetMessage(&msg, nullptr, 0, 0); | 
					
						
							|  |  |  |  | 					} while (msg.wParam != WA_ACTIVE); | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			}*/ | 
					
						
							| 
									
										
										
										
											2017-10-12 02:44:44 +08:00
										 |  |  |  | 			case WM_SIZE: | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				UINT width = LOWORD(lParam); | 
					
						
							|  |  |  |  | 				UINT height = HIWORD(lParam); | 
					
						
							|  |  |  |  | 				pEApp->_onResize(width, height); | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			result = 0; | 
					
						
							|  |  |  |  | 			wasHandled = true; | 
					
						
							|  |  |  |  | 			break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			case WM_DISPLAYCHANGE: | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				InvalidateRect(GetHWnd(), NULL, FALSE); | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			result = 0; | 
					
						
							|  |  |  |  | 			wasHandled = true; | 
					
						
							|  |  |  |  | 			break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			case WM_PAINT: | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				pEApp->_onRender(); | 
					
						
							|  |  |  |  | 				ValidateRect(GetHWnd(), NULL); | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			result = 0; | 
					
						
							|  |  |  |  | 			wasHandled = true; | 
					
						
							|  |  |  |  | 			break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			case WM_DESTROY: | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				PostQuitMessage(0); | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			result = 1; | 
					
						
							|  |  |  |  | 			wasHandled = true; | 
					
						
							|  |  |  |  | 			break; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (!wasHandled) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			result = DefWindowProc(GetHWnd(), message, wParam, lParam); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	return result; | 
					
						
							| 
									
										
										
										
											2017-09-10 23:56:52 +08:00
										 |  |  |  | } |