HGE系列之三 渐入佳境

 

HGE系列之三    渐入佳境函数

 

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

 

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

 

 

 

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

 

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

//提供HGE的底层接口操做日志

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

// HGE精灵类对象

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

// 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;

 

// 一些全局的变量信息

// xy 为小球的当前位置坐标

float x=100.0f, y=100.0f;

// dxdy为小球的位置改变(偏移)量

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原则不是这么用的好吧,我认可你是对的),就让咱们在此点到辄止,至于更深刻的内容就之后再说吧 :)

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

 

 

 

 

本文同步分享在 博客“tkokof1”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索