HGE系列之三 渐入佳境

HGE系列之三 渐入佳境

前两次“乱七八糟”的讲述了一些HGE的基础知识,不知看过的朋友有何感想,反正我自己都觉着有些不知所谓(),但本着坚持到底的原则,今天继续献上拙文一篇,如果有朋友实在看不过去,大可不吝嘲笑、大肆放言 :)

好了,转至今天的主题,这次我们来更深入的揣摩一番HGE的示例程序,为了简单起见,我选择了HGE SDK中自带的示例程序三,因其深度不深不浅,依其进一步讲解HGE着实适当 :)那么,首先的首先呢,先让我们瞅瞅这程序运行起来是个什么样子:

怎样,有些简约的味道吧 :)当然,光凭一纸图片也远不能描绘程序中各方操作表现,所以在此我严重建议有兴致的朋友可以自己亲身试上一把(注意相关游戏资源需要置于同一目录下),想必之后对于下面的示例代码会有更深的体会:

//必须包含的一些头文件

//提供HGE的底层接口操作

#include "../../include/hge.h"

// HGE精灵类

#include "../../include/hgesprite.h"

// HGE字体类,用于显示文字信息

#include "../../include/hgefont.h"

// HGE粒子类

#include "../../include/hgeparticle.h"

// 全局的HGE接口类指针

HGE *hge=0;

// 全局的HGE对象指针

// HGE精灵,spr为图示中的小球,spt则为粒子(图示中的小五角星)

hgeSprite* spr;

hgeSprite* spt;

// HGE字体类,用于显示图示中左上角的帧率信息

hgeFont* fnt;

// 用以管理粒子生成与消亡的hgeParticleSystem类

hgeParticleSystem* par;

// HGE资源句柄(实际上即是DWORD类型)

// 纹理句柄

HTEXTURE tex;

// 声效句柄

HEFFECT snd;

// 一些全局的变量信息

// x、y 为小球的当前位置坐标

float x=100.0f, y=100.0f;

// dx、dy为小球的位置改变(偏移)量

float dx=0.0f, dy=0.0f;

//小球的速度

const float speed=90;

//摩擦系数,用以削减小球的实际位移量

const float friction=0.98f;

// 播放声效

void boom() {

//设置声道

int pan=int((x-400)/4);

//设置音高

float pitch=(dx*dx+dy*dy)*0.0005f+0.2f;

//播放( 具体细节请参见HGE帮助文档 :)下同

hge->Effect_PlayEx(snd,100,pan,pitch);

}

//帧函数(HGE应用程序必须编写并设置该函数)

bool FrameFunc()

{

// 获得时间改变量

float dt=hge->Timer_GetDelta();

// 处理按键

if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;

if (hge->Input_GetKeyState(HGEK_LEFT)) dx-=speed*dt;

if (hge->Input_GetKeyState(HGEK_RIGHT)) dx+=speed*dt;

if (hge->Input_GetKeyState(HGEK_UP)) dy-=speed*dt;

if (hge->Input_GetKeyState(HGEK_DOWN)) dy+=speed*dt;

// 执行位移量的计算和碰撞检测(防止小球越界)

dx*=friction; dy*=friction; x+=dx; y+=dy;

if(x>784) {x=784-(x-784);dx=-dx;boom();}

if(x<16) {x=16+16-x;dx=-dx;boom();}

if(y>584) {y=584-(y-584);dy=-dy;boom();}

if(y<16) {y=16+16-y;dy=-dy;boom();}

// 更新粒子系统

par->info.nEmission=(int)(dx*dx+dy*dy)*2;

par->MoveTo(x,y);

par->Update(dt);

return false;

}

//渲染函数

bool RenderFunc()

{

//渲染图形

//开始渲染场景

hge->Gfx_BeginScene();

//以黑色(0)清屏

hge->Gfx_Clear(0);

//渲染粒子系统

par->Render();

//渲染小球

spr->Render(x, y);

//输出信息

fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f/nFPS:%d (constant)", hge->Timer_GetDelta(), hge->Timer_GetFPS());

//结束渲染场景

hge->Gfx_EndScene();

return false;

}

//标准WinMain函数

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

//创建HGE实例

hge = hgeCreate(HGE_VERSION);

//设置日志文件名,用以记录一些程序运行的信息

hge->System_SetState(HGE_LOGFILE, "hge_tut03.log");

//设置帧函数

hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);

//设置渲染函数

hge->System_SetState(HGE_RENDERFUNC, RenderFunc);

//设置程序标题

hge->System_SetState(HGE_TITLE, "HGE Tutorial 03 - Using helper classes");

//设置帧率

hge->System_SetState(HGE_FPS, 100);

//设置为窗口程序

hge->System_SetState(HGE_WINDOWED, true);

//设置窗口宽高及位深

hge->System_SetState(HGE_SCREENWIDTH, 800);

hge->System_SetState(HGE_SCREENHEIGHT, 600);

hge->System_SetState(HGE_SCREENBPP, 32);

//初始化HGE

if(hge->System_Initiate()) {

// 加载声音及纹理

snd=hge->Effect_Load("menu.wav");

tex=hge->Texture_Load("particles.png");

if(!snd || !tex)

{

// 如果其中一项加载失败则报告错误并关闭HGE

// 简单的MessageBox信息框

MessageBox(NULL, "Can't load one of the following files:/nMENU.WAV, PARTICLES.PNG, FONT1.FNT, FONT1.PNG, TRAIL.PSI", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);

hge->System_Shutdown();

hge->Release();

return 0;

}

// 创建并设置HGE精灵

spr=new hgeSprite(tex, 96, 64, 32, 32);

spr->SetColor(0xFFFFA000);

spr->SetHotSpot(16,16);

// 加载字体

fnt=new hgeFont("font1.fnt");

// 创建并设置HGE粒子类

spt=new hgeSprite(tex, 32, 32, 32, 32);

spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);

spt->SetHotSpot(16,16);

par=new hgeParticleSystem("trail.psi",spt);

par->Fire();

// Let's rock now!

hge->System_Start();

// 删除创建的对象并释放加载的资源

delete par;

delete fnt;

delete spt;

delete spr;

hge->Texture_Free(tex);

hge->Effect_Free(snd);

}

// 关闭HGE

hge->System_Shutdown();

hge->Release();

return 0;

}

好了,程序代码就是这些,相信通过注释大家应该能够理通其中的十之八九,但毫无疑问的是,在其中我也略去了很多细节的讲述,譬如小球的移动方式(小球实际上是会反弹滴:)),粒子系统创建时所使用的参数等等,但是我发现如果全部讲述的话,不仅表述冗长,叙述中心也会偏移,毕竟我们只是想对HGE的使用有一个更全面一些的认识,所以嘛,本着KISS原则如果你说KISS原则不是这么用的…嗯…好吧,我承认你是对的),就让我们在此点到辄止,至于更深入的内容就以后再说吧 :)

最后的最后,还是那句:下次再见喽 :)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HGE系列之一 初窥门道

    对于游戏开发有些兴趣的朋友,尤其是那些至今都扔不下2D、如我这般的志士同仁,想必对于HGE都有所耳闻,但如果要论及深入了解与运用,那恐怕就寥寥无几人了,而对于...

    用户2615200
  • HGE系列之二 更上层楼

    上次颇为感性的描述了一番HGE的轮廓,并给出了一个世界上最简单的HGE示例程序,不知读过的人有了怎样的认识,如果你说一点感觉都没有的话——哦,好吧,在此我再重...

    用户2615200
  • "蒙提霍尔"问题小议

    乍一看”蒙提霍尔”这个名字可能感觉陌生,但其实问题的内容大家或多或少应该都听闻过,在此简单复述一下:

    用户2615200
  • 浅析PropertySource 基本使用

    一、PropertySource 简介二、@PropertySource与Environment读取配置文件三、@PropertySource与@Value读取...

    cxuan
  • 每日面试题推送及讲解-20190408

    之前一段时间小程序和公众号都是交给学弟在打理,目前学弟面领毕业且目前正在北京找工作,所以之后的一段时间换本人来打理了。同时对于小程序和公众号做一定的改动,具体改...

    每天学Java
  • Gradle安装使用

    简单介绍 Gradle是一个好用的构建工具 使用它的原因是 1、配置相关依赖代码量少,不会像maven一样xml过多 2、打包编译测试发布都有,...

    似水的流年
  • 开源 | CVPR2020 神经网络结构的变形预测 用于3D目标的形状变换

    为了匹配目标形状的一般结构,弯曲源形状同时保留源的表面细节,本文提出了一种形状变形后的保护细节的方法。该方法将源形状由一个粗调的控制网格(称为保持架)包围,并且...

    CNNer
  • JavaNote[005] - 循环结构

    这个算是一个比较高级一点的用法了,就是在一个循环语句里再嵌套一个循环语句。这个其实也没什么,可以通过看几个小栗子来理解一下。

    Sam Gor
  • Caffe for Windows 配置与测试

    转载请注明出处:http://my.oschina.net/gaussik/blog/600368

    Gaussic
  • [ASP.NET Core 3框架揭秘] Options[6]: 扩展与定制

    由于Options模型涉及的核心对象最终都注册为相应的服务,所以从原则上讲这些对象都是可以定制的,下面提供几个这样的实例。由于Options模型提供了针对配置系...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券