2017-09-27 17:56:28 +08:00
|
|
|
|
#include "..\easy2d.h"
|
|
|
|
|
|
#include "..\EasyX\easyx.h"
|
2017-09-10 23:56:52 +08:00
|
|
|
|
#include <time.h>
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
#include <imm.h>
|
|
|
|
|
|
#pragma comment(lib, "imm32.lib")
|
|
|
|
|
|
#include <mmsystem.h>
|
|
|
|
|
|
#pragma comment(lib, "winmm.lib")
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
// App <20><>Ψһʵ<D2BB><CAB5>
|
|
|
|
|
|
static App * s_pInstance = nullptr;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
static int originX = 0;
|
|
|
|
|
|
static int originY = 0;
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
App::App() :
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_pCurrentScene(nullptr),
|
|
|
|
|
|
m_pNextScene(nullptr),
|
2017-09-10 23:56:52 +08:00
|
|
|
|
m_bRunning(false),
|
|
|
|
|
|
m_nWindowMode(0)
|
|
|
|
|
|
{
|
2017-09-12 12:53:34 +08:00
|
|
|
|
assert(!s_pInstance); // <20><><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> App ʵ<><CAB5>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
s_pInstance = this; // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
setFPS(60); // Ĭ<><C4AC> FPS Ϊ 60
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
App::~App()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-12 12:53:34 +08:00
|
|
|
|
destory(); // <20><><EFBFBD><EFBFBD> App
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
App * App::get()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
assert(s_pInstance); // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2017-09-12 12:53:34 +08:00
|
|
|
|
return s_pInstance; // <20><>ȡ App <20><>Ψһʵ<D2BB><CAB5>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::setOrigin(int originX, int originY)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
::originX = originX;
|
|
|
|
|
|
::originY = originY;
|
|
|
|
|
|
setorigin(originX, originY);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
int App::getOriginX()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
return ::originX;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
int App::getOriginY()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
return ::originY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
int App::run()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|
|
|
|
|
BeginBatchDraw();
|
|
|
|
|
|
// <20><EFBFBD>ʱ<EFBFBD>侫<EFBFBD><E4BEAB>
|
|
|
|
|
|
timeBeginPeriod(1);
|
|
|
|
|
|
// <20><>ȡ CPU ÿ<><C3BF><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
LARGE_INTEGER freq;
|
|
|
|
|
|
QueryPerformanceFrequency(&freq);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
LARGE_INTEGER nLast;
|
|
|
|
|
|
LARGE_INTEGER nNow;
|
|
|
|
|
|
// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
|
|
|
|
|
|
QueryPerformanceCounter(&nLast);
|
|
|
|
|
|
// ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
LONGLONG interval = 0LL;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
LONG waitMS = 0L;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD>ʾ
|
|
|
|
|
|
ShowWindow(GetHWnd(), SW_NORMAL);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
|
|
|
|
|
|
m_bRunning = true;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
|
|
|
|
|
while (m_bRunning)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
|
|
|
|
|
|
QueryPerformanceCounter(&nNow);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
interval = nNow.QuadPart - nLast.QuadPart;
|
|
|
|
|
|
// <20>жϼ<D0B6><CFBC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
|
|
|
|
|
if (interval >= m_nAnimationInterval.QuadPart)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
|
|
|
|
|
|
nLast.QuadPart = nNow.QuadPart;
|
|
|
|
|
|
// ִ<><D6B4><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD>
|
|
|
|
|
|
_mainLoop();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
waitMS = LONG((m_nAnimationInterval.QuadPart - interval) * 1000LL / freq.QuadPart) - 1L;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3>ͷ<EFBFBD> CPU ռ<><D5BC>
|
|
|
|
|
|
if (waitMS > 1L)
|
|
|
|
|
|
Sleep(waitMS);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|
|
|
|
|
EndBatchDraw();
|
|
|
|
|
|
// <20>رմ<D8B1><D5B4><EFBFBD>
|
|
|
|
|
|
close();
|
|
|
|
|
|
// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><D5BC>
|
|
|
|
|
|
destory();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>侫<EFBFBD><E4BEAB>
|
|
|
|
|
|
timeEndPeriod(1);
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::_initGraph()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
2017-09-27 17:56:28 +08:00
|
|
|
|
initgraph(m_Size.cx, m_Size.cy, m_nWindowMode);
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>ֹ<EFBFBD>ڼ<EFBFBD><DABC>ؽ<D8BD><D7B6><EFBFBD>ʾ<EFBFBD>ڴ<EFBFBD><DAB4>ڣ<EFBFBD>
|
|
|
|
|
|
ShowWindow(GetHWnd(), SW_HIDE);
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>Ļ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
|
|
|
|
|
|
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
|
|
|
|
|
|
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڴ<EFBFBD>С
|
|
|
|
|
|
CRect rcWindow;
|
|
|
|
|
|
GetWindowRect(GetHWnd(), &rcWindow);
|
|
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
SetWindowPos(GetHWnd(), HWND_TOP,
|
|
|
|
|
|
(screenWidth - rcWindow.Size().cx) / 2,
|
|
|
|
|
|
(screenHeight - rcWindow.Size().cy) / 2,
|
|
|
|
|
|
rcWindow.Size().cx,
|
|
|
|
|
|
rcWindow.Size().cy,
|
|
|
|
|
|
SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOSIZE);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뷨
|
|
|
|
|
|
ImmAssociateContext(GetHWnd(), NULL);
|
|
|
|
|
|
// <20><><EFBFBD>û<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|
|
|
|
|
reset();
|
|
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1><EFBFBD>
|
|
|
|
|
|
if (m_sTitle.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD>
|
|
|
|
|
|
TCHAR title[31];
|
|
|
|
|
|
GetWindowText(GetHWnd(), title, 30);
|
|
|
|
|
|
m_sTitle = title;
|
2017-10-06 01:07:15 +08:00
|
|
|
|
if (m_sAppName.empty()) m_sAppName = title;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2017-09-20 14:52:50 +08:00
|
|
|
|
setWindowTitle(m_sTitle);
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::_mainLoop()
|
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
|
|
|
|
// ִ<>е<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> onExit <20><><EFBFBD><EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
if (m_pCurrentScene)
|
2017-09-18 23:59:08 +08:00
|
|
|
|
{
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_pCurrentScene->onExit();
|
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();
|
2017-09-18 23:59:08 +08:00
|
|
|
|
// ִ<>е<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> onEnter <20><><EFBFBD><EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_pCurrentScene->onEnter();
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>Ե<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
assert(m_pCurrentScene);
|
2017-09-10 23:56:52 +08:00
|
|
|
|
|
|
|
|
|
|
cleardevice(); // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_pCurrentScene->_onDraw(); // <20><><EFBFBD>Ƶ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
FlushBatchDraw(); // ˢ<>»<EFBFBD><C2BB><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
|
|
|
|
|
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>
|
2017-09-27 17:56:28 +08:00
|
|
|
|
ActionManager::__exec(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
FreePool::__flush(); // ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::createWindow(int width, int height, int mode)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>洰<EFBFBD><E6B4B0><EFBFBD><EFBFBD>Ϣ
|
2017-09-27 17:56:28 +08:00
|
|
|
|
m_Size.cx = width;
|
|
|
|
|
|
m_Size.cy = height;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
m_nWindowMode = mode;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
_initGraph();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-27 17:56:28 +08:00
|
|
|
|
void App::createWindow(CSize size, int mode)
|
|
|
|
|
|
{
|
|
|
|
|
|
createWindow(size.cx, size.cy, mode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
void App::createWindow(TString title, int width, int height, int mode)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>洰<EFBFBD><E6B4B0><EFBFBD><EFBFBD>Ϣ
|
2017-09-27 17:56:28 +08:00
|
|
|
|
m_Size.cx = width;
|
|
|
|
|
|
m_Size.cy = height;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
m_nWindowMode = mode;
|
|
|
|
|
|
m_sTitle = title;
|
2017-10-05 12:24:21 +08:00
|
|
|
|
if (m_sAppName.empty()) m_sAppName = title;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
_initGraph();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
void App::createWindow(TString title, CSize size, int mode)
|
2017-09-27 17:56:28 +08:00
|
|
|
|
{
|
|
|
|
|
|
createWindow(title, size.cx, size.cy, mode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::setWindowSize(int width, int height)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<DEB8><C4B4>ڴ<EFBFBD>С
|
2017-09-27 17:56:28 +08:00
|
|
|
|
assert(s_pInstance->m_bRunning);
|
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>
|
|
|
|
|
|
CRect rcWindow;
|
|
|
|
|
|
GetWindowRect(GetHWnd(), &rcWindow);
|
|
|
|
|
|
// <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>С
|
|
|
|
|
|
CRect rcClient;
|
|
|
|
|
|
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>
|
|
|
|
|
|
// DestroyWindow(GetHWnd());/* <20><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵߳<DFB3><CCB5><EFBFBD>ʧЧ */
|
|
|
|
|
|
// <20>Ĵ<DEB8><C4B4>ڴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
SetWindowPos(GetHWnd(), HWND_TOP,
|
|
|
|
|
|
(screenWidth - width) / 2,
|
|
|
|
|
|
(screenHeight - height) / 2,
|
|
|
|
|
|
width,
|
|
|
|
|
|
height,
|
|
|
|
|
|
SWP_SHOWWINDOW);
|
|
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
reset();
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-27 17:56:28 +08:00
|
|
|
|
void App::setWindowSize(CSize size)
|
|
|
|
|
|
{
|
|
|
|
|
|
setWindowSize(size.cx, size.cy);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
void App::setWindowTitle(TString 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-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_sTitle = title;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
TString App::getWindowTitle()
|
2017-09-20 14:52:50 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
return s_pInstance->m_sTitle;
|
2017-09-20 14:52:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::close()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-12 12:53:34 +08:00
|
|
|
|
closegraph(); // <20>رջ<D8B1>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::enterScene(Scene * scene, bool save)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
s_pInstance->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-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_bSaveScene = save;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::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-06 02:32:33 +08:00
|
|
|
|
s_pInstance->m_pNextScene = s_pInstance->m_SceneStack.top();
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD>
|
2017-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_bSaveScene = false;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-18 23:59:08 +08:00
|
|
|
|
void App::clearScene()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>ջ
|
2017-09-27 17:56:28 +08:00
|
|
|
|
while (s_pInstance->m_SceneStack.size())
|
2017-09-18 23:59:08 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
auto temp = s_pInstance->m_SceneStack.top();
|
2017-10-05 00:53:03 +08:00
|
|
|
|
SafeDelete(temp);
|
2017-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_SceneStack.pop();
|
2017-09-18 23:59:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
void App::setAppName(TString 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-05 00:53:03 +08:00
|
|
|
|
TString App::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-09-12 12:53:34 +08:00
|
|
|
|
void App::setBkColor(COLORREF color)
|
|
|
|
|
|
{
|
|
|
|
|
|
setbkcolor(color);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void App::_enterNextScene()
|
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-06 02:32:33 +08:00
|
|
|
|
if (m_SceneStack.size() && m_pNextScene == m_SceneStack.top())
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
m_SceneStack.pop(); // ɾ<><C9BE>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_bSaveScene)
|
|
|
|
|
|
{
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_SceneStack.push(m_pCurrentScene); // <20><>Ҫ<EFBFBD><D2AA><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ŵ<EFBFBD>ջ<EFBFBD><D5BB>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2017-10-06 02:32:33 +08:00
|
|
|
|
SafeDelete(m_pCurrentScene); // ɾ<><C9BE><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_pCurrentScene = m_pNextScene; // <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
m_pNextScene = nullptr; // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::quit()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_bRunning = false;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::end()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_bRunning = false;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::reset()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>û<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|
|
|
|
|
graphdefaults();
|
|
|
|
|
|
setbkmode(TRANSPARENT);
|
|
|
|
|
|
setbkcolor(Color::black);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
Scene * App::getCurrentScene()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
if (s_pInstance->m_pCurrentScene)
|
|
|
|
|
|
{
|
|
|
|
|
|
return s_pInstance->m_pCurrentScene;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return s_pInstance->m_pNextScene;
|
|
|
|
|
|
}
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::setFPS(DWORD fps)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>֡<EFBFBD>ʣ<EFBFBD><CAA3>Ժ<EFBFBD><D4BA><EFBFBD>Ϊ<EFBFBD><CEAA>λ
|
|
|
|
|
|
LARGE_INTEGER nFreq;
|
|
|
|
|
|
QueryPerformanceFrequency(&nFreq);
|
2017-09-27 17:56:28 +08:00
|
|
|
|
s_pInstance->m_nAnimationInterval.QuadPart = (LONGLONG)(1.0 / fps * nFreq.QuadPart);
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-27 17:56:28 +08:00
|
|
|
|
int App::getWidth()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
return s_pInstance->m_Size.cx;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-27 17:56:28 +08:00
|
|
|
|
int App::getHeight()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
return s_pInstance->m_Size.cy;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::free()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20>ͷų<CDB7><C5B3><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
SafeDelete(m_pCurrentScene);
|
|
|
|
|
|
SafeDelete(m_pNextScene);
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// <20><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>ջ
|
2017-09-27 17:56:28 +08:00
|
|
|
|
while (m_SceneStack.size())
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
2017-09-27 17:56:28 +08:00
|
|
|
|
auto temp = m_SceneStack.top();
|
2017-10-05 00:53:03 +08:00
|
|
|
|
SafeDelete(temp);
|
2017-09-27 17:56:28 +08:00
|
|
|
|
m_SceneStack.pop();
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
Timer::clearAllTimers();
|
2017-10-05 11:28:13 +08:00
|
|
|
|
MouseMsg::clearAllListeners();
|
|
|
|
|
|
KeyMsg::clearAllListeners();
|
|
|
|
|
|
ActionManager::clearAllActions();
|
|
|
|
|
|
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
FreePool::__clearAllObjects();
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-12 12:53:34 +08:00
|
|
|
|
void App::destory()
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
2017-10-05 11:36:15 +08:00
|
|
|
|
s_pInstance->free();
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// ʵ<><CAB5>ָ<EFBFBD><D6B8><EFBFBD>ÿ<EFBFBD>
|
2017-10-05 11:36:15 +08:00
|
|
|
|
delete s_pInstance;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
s_pInstance = nullptr;
|
|
|
|
|
|
}
|