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 条评论
登录 后参与评论

相关文章

来自专栏hightopo

基于 HTML5 WebGL 的 3D 网络拓扑图

1673
来自专栏UAI人工智能

RLLAB 入门

3953
来自专栏阿凯的Excel

让你的Excel表动起来!!!

本次是第二次分享广大网友向我提问的经典问题。 本周问题,利用名称管理器完成二维表的匹配返回!让你的表格动起来! 话说!本次解决方案相对复杂,能看明白并且自己会...

3004
来自专栏猿说1024

Markdown 语法

1504
来自专栏葡萄城控件技术团队

前端代码标准最佳实践:CSS篇

上一篇《前端代码标准最佳实践:javascript》发表后,大家讨论还是很热烈,从侧面体现了前端工程师对写标准的前端代码的重视程度很高。这些最佳标准实践并不是那...

20910
来自专栏华章科技

10个非常实用的Excel技巧

Excel可以说是MS Office系列中最神奇也最重要的软件。对于专业的职场人士,工作中经常需要用到Excel来分析数据。亲们别再傻傻地用鼠标点来点去啦,用这...

1568
来自专栏小詹同学

如何用 Python 打飞机 ?

前言:python 除了生孩子 ,啥都会 。包括打飞机 !今天小詹的一位读者就来教你如何用 python 打飞机 !

3425
来自专栏流媒体人生

mpg文件切片之后,不能播放问题分析

对于大部分mpg文件切片都能正常播放,而少部分mpg切片之后只有第一个切片能播放,后续的切片视频播放均失败,只能播放视频。

972
来自专栏琦小虾的Binary

二维码生成原理及解析代码

二维码生成原理及解析代码 自从大街小巷的小商小贩都开始布满了腾讯爸爸和阿里爸爸的二维码之后,我才感觉到我大天朝共享支付的优越性。最近毕业论文写的差不多了,在入职...

1.4K6
来自专栏HT

基于 HTML5 WebGL 的 3D 网络拓扑图

  在数据量很大的2D 场景下,要找到具体的模型比较困难,并且只能显示出模型的的某一部分,显示也不够直观,这种时候能快速搭建出 3D 场景就有很大需求了。但是搭...

3095

扫码关注云+社区

领取腾讯云代金券