HGE 系列教材(6) --- 程序流程与细节

HGE 的一些细节,通过源码可以更加清楚的了解,通过读源码,可以更加高效的使用 HGE Engine。

必要的第一步:

Help Classes 层建立于 Core Functions 层之上,这并不意味着用户只需要关心 Help Classes 而忽略 Core Functions,因此我们需要获得一个 HGE 指针,来使用 Core Functions 的函数:

<1> 获取 HGE 指针:

HGE* pHGE = pgeCreate(HGE_VERSION);

<2> 释放 HGE 指针:

使用之后,需要释放 HGE 指针。

pHGE->Release();

Create 和 Release 过程使用了引用计数,也就是说,一般来看,除了第一次的 Create 调用之外几乎不消耗CPU时间和资源,每调用一次 Create 函数,引用计数器就加一,只有在第一次调用的时候才会真正的分配空间,调用 Release 会使得引用计数器减一,当它为 0 的时候,才真正是释放资源。因此以下代码是可用的:

while(true)

{

    HGE* pHGE = pgeCreate(HGE_VERSION);   // 确保不是第一次调用 pgeCreate 函数,因为如果是第一次调用,会分配内存。

    // ... do something

    pHGE->Release();

}

此外,要成对的调用 pgeCreate 和 Release 函数,每次调用 Release 之后,调用它的指针将被赋值为0,例如:

HGE* pHGE = hgeCreate(HGE_VERSION);

pHGE->Release();

pHGE->Release(); // ERROR: pHGE == 0

另外,pHGE->Release 会调用 pHGE->System_Shutdown();

必要的第二步:

初始化: pHGE->System_Initiate();

初始化语句放在 Windows 入口函数中,这个函数将按顺序完成

1)窗口类的注册

2)创建窗口

3)初始化子系统

4)显示一个 HGE 的 LOGO(这个东西在 HGE 里面被称之为 HGE splash)

一般使用 System_Initiate() 都会是这样的:
    if (pHGE->System_Initiate())
    {
        pHGE->System_Start();
    }
    else
    {
        MessageBox(NULL, pHGE->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
    }

必要的第三步:

调用: pHGE->System_Start();

调用了 System_Start 的目的是开始消息循环,见必要的第二步代码

pHGE->System_Start 和 pHGE->System_Shutdown 是成对出现的,处于某些原因,即使我们知道 pHGE->Release 会调用 System_Shutdown 函数,我们还是应该去显示的调用 System_Shutdown 函数。System_Shutdown 相比 Release 要安全,我们可以这样调用,而不会出错:

pHGE->System_Start();

// ... Something

pHGE->System_Shutdown();

pHGE->System_Shutdown(); // OK

不论如何,Create 和 Release 成对调用,Start 和 Shutdown 成对调用,那么就不会有问题出现。

还有什么是需要的?

System_SetState 函数

常常需要设置窗口大小或者是设置为全屏模式,需要设置是否使用声音等,这一系列操作被称之为设置系统状态,统一通过调用 pHGE->System_SetState 函数来完成,最为关键的是设置帧函数,调用了 pHGE->System_Start 之后,会在绘制每帧图像时调用帧函数。

pHGE->System_SetState(XXX, XXX) 通常可以在如何地方,如何情况下调用,不要认为它们只能在 pHGE->System_Initiate 之前调用

System_SetState 函数的第一个参数表示状态,在内部实现时,它是 FSM 的状态,而第二个参数表示值,通过这个函数,可以绑定状态和相关的值

补充一下,帧函数必须是一个全局函数,而不能是一个类的成员函数,并且帧函数的原型必须是:

bool FunName(void);

惯用法:

我们通常会在程序初始化之前设置状态,即在 System_Initiate 调用之前,例如:

int WINAPI WinMain( HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    pHGE->System_SetState(HGE_FRAMEFUNC, FrameFunc);
    pHGE->System_SetState(HGE_WINDOWED, true);
    pHGE->System_SetState(HGE_USESOUND, false);
    pHGE->System_SetState(HGE_TITLE, "HGE");
    pHGE->System_SetState(HGE_SHOWSPLASH, false); // 用于去除 LOGO

    if (pHGE->System_Initiate())
    {
        pHGE->System_Start();
    }
    else
    {
        MessageBox(NULL, pHGE->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
    }

    pHGE->System_Shutdown();
    pHGE->Release();

    return 0;
}

时间: 2024-07-28 22:28:31

HGE 系列教材(6) --- 程序流程与细节的相关文章

HGE 系列教材(3) --- 初试 HGE

当 HGE 安装完成之后,就可以使用了,关于 HGE 的安装,可以参考<HGE 系列教材(2) --- 安装 HGE> 现在使用 HGE 开发一个极小的程序: 1. 包含 hge.h 文件,并且定义一个 HGE 的指针,通过这个指针,我们可以访问 HGE Core Functions 层的函数.     #include <hge.h>     HGE *pHge = 0; 使用完 HGE 指针之后,需要释放这个指针,pHGE->Release(); 2. 帧函数(Frame

HGE 系列教材(7) --- 使用 Helper Classes

字体的使用: 1. 头文件 #include <hgeFont.h> 2. 载入字体 hgeFont* pFont; pFont = new hgeFont("font1.fnt");   // 不要忘记 delete fnt 文件是一个字体描述文件(font description file),可以通过创作工具产生 3. 打印字体 pFont->printf(5, 5,    HGETEXT_LEFT,    "dt:%.3f/nFPS:%d (const

HGE 系列教材(4) --- 初探 HGE Core Functions 层

HGE Core Functions 层中的函数需要通过 HGE 指针来访问,就如<HGE 系列教材(3) --- 初试 HGE>所谈到的一样,通过调用 hgeCreate 函数来初始化 HGE 指针,HGE Core Functions 层中的函数,大致分层一下几类: 1. 接口函数(Interface functions): hgeCreate --- 初始化 HGE 指针,这是一个全局函数,除了这个函数,HGE Core Funtions 中所有的函数都需要通过 HGE 指针调用. Re

HGE 系列教材(5) --- 输入、声音和渲染

建议读者对应 HGE 的官方的例子:Tutorial 02 - Using input, sound and rendering 来阅读本文 渲染: 在 HGE 中,四边形是一种图元,对应了结构体 hgeQuad,另外还有三角形图元,对应 hgeTriple,为了渲染,我们现在需要使用 hgeQuad 结构体,这个结构体如下: struct hgeQuad{hgeVertex v[4];   // 顶点描述了这个四边形HTEXTURE   tex;   // 纹理的句柄或者为0int      

HGE 系列教材(1) --- 简介

HGE 是一个硬件加速(Hardware accelerated)的 2D 游戏引擎(Game Engine),HGE 是一个富有特性的中间件,可以用于开发任何类型的 2D 游戏.HGE 封装性良好,以至于你仅仅需要关系游戏逻辑(Game Logic),而不需要在意 DirectX,Windows 消息循环等. HGE 架构在 DirectX 8.0 之上,能够跑在大多数的 Windows 系统上.   1. 选用 HGE 的理由:     1)专业化 --- 专注于 2D 领域     2)简

HGE 系列教材(2) --- 安装 HGE

在 HGE 的文档中有详细谈到如何安装的问题,这里讲一下 VC6 平台的安装问题: 1. 下载完 HGE 之后,需要使用到 lib/vc 文件夹下的库文件以及 include 目录下的头文件   2. 打开 Tools->Options->Directories 如上两图,添加路径   3. 在游戏开发中使用 HGE 首先建立一个空的Win32工程,然后选择 Project->Settings...->Link 按图所示,输入 hge.lib 和 hgehelp.lib 当然,也可

HGE 系列教材(9) --- GUI(本文未完成)

1. hge 中 GUI 对象和控件 hge 中 GUI 对象被看作是一个控件的容器,hge 提供了创建 GUI 对象的类 hgeGUI 类   2. hgeGUI 类 1)AddCtrl 函数 void AddCtrl(hgeGUIObject *ctrl    // hgeGUIObject 对象的指针); 我们通常可以有这样的写法: gui->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Play")); 这里 hge

HGE 系列教材(8) --- hgeResourceManager helper class(本文未完成)

hgeResourceManager 是一个资源管理类 1. 构造函数 hgeResourceManager(     const char* scriptname = 0 ); scriptname 表示资源脚本文件名(Resource script filename),如果此参数为 0,表示不使用 Resource script file 现在来介绍一下资源脚本: 资源脚本是一个文本文件,用于定义资源.资源文件由多个(或一个)命令(command)组成,格式如下: Command Resou

360发现特斯拉汽车应用程序流程存在设计缺陷

京华时报讯(记者古晓宇)昨天,360公司对外公布,其专业团队发现特斯拉汽车应用程序流程存在设计缺陷.攻击者利用这个漏洞,可远程控制车辆.特斯拉公司则表示,对于报告的任何合法漏洞都会展开调查,并采取行动进行应对和修复. 360称,其专业团队研究了TeslaModelS型汽车,发现特斯拉汽车应用程序流程存在设计缺陷.攻击者利用这个漏洞,可远程控制车辆,实现开锁.鸣笛.闪灯.开启天窗等操作,并且能够在车辆行驶中开启天窗.360已于日前将相关的漏洞细节和解决方案建议正式提交给特斯拉. 不过,360首席科