Systetem Core 控制游戏应用窗口的初始化和程序流(Program flow),还有进程(Processes)、状态(States)、数据包(data Packaging)。这是开始你新游戏工程的第一个步骤。
1.1 Using the cApplication Core Object:(使用cApplication对象):
SystemCore中,最有用的的对象就是cApplication,它可以用来创建你的应用程序窗口并可以控制程序流(Program flow).它注册窗口类,创建应用程序窗口,处理消息循环,并可以在需要的时候调用内部类。
cApplication提供了三个需重载的方法来处理应用程序,分别是:Init,Shutdown,Frame。每一个方法都有一个明确的目的,详细内容将在下一节介绍。当处理窗口消息(Windows Messages)时,你也需要提供一个消息处理函数(Message Handler),同样,将在下一节介绍。
现在,让我们来看下下面的代码,它包含了cApplication的声明:
Class cApplication { Private: HINSTANCE m_hInst; // Instance(实例) 句柄 HWND m_hWnd; // Window(窗口)句柄 Protected: Char m_Class[MAX_PATH]; // 类名 Char m_Caption[MAX_PATH]; // 窗口标题
WNDCLASSEX m_wcex; // 窗口类结构体(windows class structure) DWORD m_Style; // 窗口风格 DWORD m_XPos; // 窗口x坐标 DWORD m_YPos; // 窗口y坐标 DWORD m_Width; // 默认窗口宽 DWORD m_Height; // 默认窗口高
Public: cApplication(); // 构造方法
HWND GethWnd(); // 获取窗口句柄(handle) HINSTANCE GethInst(); // 获取实例(instance)句柄 BOOL Run(); // 运行 BOOL Error(BOOL Fatal, char *Text, …); // 打印错误 BOOL Move(long XPos, long YPos); // 移动窗口 BOOL Resize(long Width, long Height); // 重设窗口大小
BOOL ShowMouse(BOOL Show = TRUE); // 显示或隐藏鼠标
// 默认 消息处理函数 Virtual FAR PASCAL MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { Return DefWindowProc(hWnd, uMsg, wParam, lParam); }
// 常用方法,保存你的游戏代码 Virtual BOOL Init() { return TRUE; } Virtual BOOL Shutdown() { return TRUE; } Virtual BOOL Frame() { return TRUE; } }; |
需要你去调用的方法是很少的,因为cApplication被设计为自己运行,你只需将你的游戏代码塞进去就行了。
要使用cApplication首先得先创建一个cApplication对象。之后,你可以将你的代码重写如这几个有限的方法中,就是前提到的:Init,Shutdown,Frame;
在cApplication::Init方法中,你需放置所有类的初始化代码,比如装载数据,准别处理的状态等等。
对应于Init方法的就是cApplication::Shutdown函数,它将释放先前所有的已分配的资源。Shutdown方法将在最后调用,但Init方法却是第一个调用。
最后是cApplication::Frame,它将在详细循环中反复调用。你可以猜想,Frame函数处理你游戏的一个单一的框架(frame),它可能包含处理用户输入,检验网络数据、绘图。
你不必去重载消息处理函数(MsgProc),除非你想自己处理窗口消息。要处理窗口消息,你需要重载cApplication::MsgProc,待会我将告诉你怎样做。
NOTE:之前提到到每一个方法(Init,Shutdown,Frame)都返回一个BOOL,它将告诉cApplication是否要退出程序。如果其中有一个返回一个FALSE,应用程序的执行将会终结。 |
至于现在,花点时间用cApplication快速创建个应用程序试试。首先要先确定你已经在头文件文件夹包含了Core_System.h,在工程文件文件夹包含了Core_System.cpp,哈哈:
#include “Core_System.h” Class cApp : public cApplication { Private: Char *m_Name;
Public: cApp(); // 构造函数
BOOL Init(); // 重载 Init 函数 BOOL Shutdown(); // 重载 Shutdown 函数 BOOL Frame(); // 重载 Frame 函数 }; |
这个例子代码通过注册窗口类、创建窗口、装入消息循环来初始化你的应用程序,于是就不断的循环调用Frame函数。这个例子是创建一个保存我的名字的缓冲区,并在每一个frame(框架)中显示。当你结束了你的应用程序,你将释放名字缓冲区并退出应用程序
cApp::cApp() { // 初始化实例数据并赋以默认值 m_Name = NULL;
// 设置窗口风格、位置、宽高 m_Style = WS_OVERLAPPEDWINDOW; // 窗口风格 m_XPos = 100; // 窗口x坐标 m_YPos = 20; // 窗口y 坐标 m_Width = 400; // 宽 m_Height = 400; // 高
// 分配一个类名和窗口标题 strcpy(m_Class, “ClassName”); strcpy(m_Caption, “My Name Example”); } |
BOOL cApp::Init() { // 给我的名字分配一个空间 if((m_Name = new char[10]) == NULL) // 我当时运行的时候这里不行,我修改了下,没 strcpy(m_Name, “Jim Adams”); // 有进行判断是否为空,直接是: else return FALSE; // m_Name = new char[10] return TRUE; } |
BOOL cApp::Shutdown() { // 释放名字缓冲区 delete m_Name; m_Name = NULL; // 设置缓冲区为NULL } |
BOOL cApp::Frame() { // 等待用户的点击并显示我的名字 // OK 或 CANCEL, CANCEL 将离开程序 if(MessageBox(GethWnd(), m_Name, “My name is”, / MB_OKCANCEL) == IDCANCEL) return FALSE; return TRUE; } |
搞定!下面你要做的就是实例化一个刚才你创建的类并用WinMain运行:
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, / LPSTR szCmdLine, int nCmdShow) { cApp App; return App.Run(); } |