您的位置:首页 > 其它

[HGE]-源码分析-2 一个小demo

2013-10-23 10:23 399 查看
先来看看HGE是怎么使用的吧。

先上代码

/*
** Haaf's Game Engine 1.8
** Copyright (C) 2003-2007, Relish Games
** hge.relishgames.com
**
** hge_tut07 - Thousand of Hares
*/

// Copy the files "font2.fnt", "font2.png", "bg2.png"
// and "zazaka.png" from the folder "precompiled" to
// the folder with executable file. Also copy hge.dll
// to the same folder.

#include "hge.h"
#include "hgefont.h"

#pragma comment(lib,"hge.lib")
#pragma comment(lib,"hgehelp.lib")

#define SCREEN_WIDTH  800
#define SCREEN_HEIGHT 600

#define MIN_OBJECTS	100
#define MAX_OBJECTS 2000

struct sprObject
{
float x,y;
float dx,dy;
float scale,rot;
float dscale,drot;
DWORD color;
};

sprObject*	pObjects;
int			nObjects;
int			nBlend;

// Pointer to the HGE interface (helper classes require this to work)

HGE *hge=0;

// Resource handles

HTEXTURE			tex, bgtex;
hgeSprite			*spr, *bgspr;
hgeFont				*fnt;

// Set up blending mode for the scene

void SetBlend(int blend)
{
static int sprBlend[5]=
{
BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE,
BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE,
BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE,
BLEND_COLORMUL | BLEND_ALPHAADD   | BLEND_NOZWRITE,
BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE
};

static DWORD fntColor[5]=
{
0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF
};

static DWORD sprColors[5][5]=
{
{ 0xFFFFFFFF, 0xFFFFE080, 0xFF80A0FF, 0xFFA0FF80, 0xFFFF80A0 },
{ 0xFF000000, 0xFF303000, 0xFF000060, 0xFF006000, 0xFF600000 },
{ 0x80FFFFFF, 0x80FFE080, 0x8080A0FF, 0x80A0FF80, 0x80FF80A0 },
{ 0x80FFFFFF, 0x80FFE080, 0x8080A0FF, 0x80A0FF80, 0x80FF80A0 },
{ 0x40202020, 0x40302010, 0x40102030, 0x40203010, 0x40102030 }
};

if(blend>4) blend=0;
nBlend=blend;

spr->SetBlendMode(sprBlend[blend]);
fnt->SetColor(fntColor[blend]);
for(int i=0;i<MAX_OBJECTS;i++) pObjects[i].color=sprColors[blend][hge->Random_Int(0,4)];
}

bool FrameFunc()
{
float dt=hge->Timer_GetDelta();
int i;

// Process keys

switch(hge->Input_GetKey())
{
case HGEK_UP:		if(nObjects<MAX_OBJECTS) nObjects+=100; break;
case HGEK_DOWN:		if(nObjects>MIN_OBJECTS) nObjects-=100; break;
case HGEK_SPACE:	SetBlend(++nBlend); break;
case HGEK_ESCAPE:	return true;
}

// Update the scene

for(i=0;i<nObjects;i++)
{
pObjects[i].x+=pObjects[i].dx*dt;
if(pObjects[i].x>SCREEN_WIDTH || pObjects[i].x<0) pObjects[i].dx=-pObjects[i].dx;
pObjects[i].y+=pObjects[i].dy*dt;
if(pObjects[i].y>SCREEN_HEIGHT || pObjects[i].y<0) pObjects[i].dy=-pObjects[i].dy;
pObjects[i].scale+=pObjects[i].dscale*dt;
if(pObjects[i].scale>2 || pObjects[i].scale<0.5) pObjects[i].dscale=-pObjects[i].dscale;
pObjects[i].rot+=pObjects[i].drot*dt;
}

return false;
}

bool RenderFunc()
{
int i;

// Render the scene

hge->Gfx_BeginScene();
bgspr->Render(0,0);

for(i=0;i<nObjects;i++)
{
spr->SetColor(pObjects[i].color);
spr->RenderEx(pObjects[i].x, pObjects[i].y, pObjects[i].rot, pObjects[i].scale);
}

fnt->printf(7, 7, HGETEXT_LEFT, "UP and DOWN to adjust number of hares: %d\nSPACE to change blending mode: %d\nFPS: %d", nObjects, nBlend, hge->Timer_GetFPS());
hge->Gfx_EndScene();

return false;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
int i;

hge = hgeCreate(HGE_VERSION);

// Set desired system states and initialize HGE

hge->System_SetState(HGE_LOGFILE, "hge_tut07.log");
hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
hge->System_SetState(HGE_TITLE, "HGE Tutorial 07 - Thousand of Hares");
hge->System_SetState(HGE_USESOUND, false);
hge->System_SetState(HGE_WINDOWED, true);
hge->System_SetState(HGE_SCREENWIDTH, SCREEN_WIDTH);
hge->System_SetState(HGE_SCREENHEIGHT, SCREEN_HEIGHT);
hge->System_SetState(HGE_SCREENBPP, 32);

if(hge->System_Initiate())
{

// Load textures

bgtex=hge->Texture_Load("bg2.png");
tex=hge->Texture_Load("zazaka.png");
if(!bgtex || !tex)
{
// If one of the data files is not found,
// display an error message and shutdown
MessageBox(NULL, "Can't load BG2.PNG or ZAZAKA.PNG", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
hge->System_Shutdown();
hge->Release();
return 0;
}

// Load font, create sprites

fnt=new hgeFont("font2.fnt");
spr=new hgeSprite(tex,0,0,64,64);
spr->SetHotSpot(32,32);

bgspr=new hgeSprite(bgtex,0,0,800,600);
bgspr->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE);
bgspr->SetColor(0xFF000000,0);
bgspr->SetColor(0xFF000000,1);
bgspr->SetColor(0xFF000040,2);
bgspr->SetColor(0xFF000040,3);

// Initialize objects list

pObjects=new sprObject[MAX_OBJECTS];
nObjects=1000;

for(i=0;i<MAX_OBJECTS;i++)
{
pObjects[i].x=hge->Random_Float(0,SCREEN_WIDTH);
pObjects[i].y=hge->Random_Float(0,SCREEN_HEIGHT);
pObjects[i].dx=hge->Random_Float(-200,200);
pObjects[i].dy=hge->Random_Float(-200,200);
pObjects[i].scale=hge->Random_Float(0.5f,2.0f);
pObjects[i].dscale=hge->Random_Float(-1.0f,1.0f);
pObjects[i].rot=hge->Random_Float(0,M_PI*2);
pObjects[i].drot=hge->Random_Float(-1.0f,1.0f);
}

SetBlend(0);

// Let's rock now!

hge->System_Start();

// Delete created objects and free loaded resources

delete[] pObjects;
delete fnt;
delete spr;
delete bgspr;
hge->Texture_Free(tex);
hge->Texture_Free(bgtex);
}

// Clean up and shutdown

hge->System_Shutdown();
hge->Release();
return 0;
}


这个是HGE包里面的第7个样例,是一群龙猫满屏飞,看着很温暖,这是HGE的特点吧,所有样例打开都有种很柔和的感觉



代码已经被引擎封装的相当好用了,这是HGE的特点之一,灰常好用。

包含必要的头文件,hge.h是必须的,此外用到什么辅助类就包含哪个,例如这里用到了字体就包含hgefont.h

运行的时候在可执行文件位置放hge.dll,HGE的声音用了bass库,所以在程序需要播放声音的时候也需要添入bass.dll

由于编译器原因编译时可能会报LIBC.lib库打不开,把它屏蔽了就行

ok说说代码吧

其中Winmain是最熟悉的,不过里面的很多都被HGE自己封装过了,窗口的设置方式都变成了类似hge->System_SetState(),有点像DX的SetRanderState。

这里不光会传递进去一些常规的参数比如窗口大小,标题什么的,而且会传进去进入主循环的函数,稍后说。

设定完之后,就是喜闻乐见的初始化操作,初始化时会载入资源,初始化一些对象的参数,比如精灵(管理位图的渲染,坐标,一直不明白为什么会叫精灵)。

在之后是初始化我们的位图对象,就代码最开始那个sprobject,里面有位置,速度,旋转方向,旋转速度,缩放,缩放速度

这里结束以后,就是下面3句,设定混合颜色,然后Let's rock,看来作者也喜欢摇滚嘻嘻。

SetBlend(0);

// Let's rock now!

hge->System_Start();

系统启动后就进入主循环开始掉两个主要的函数FrameFunc和RenderFunc

一个生成帧,一个画出来,好和谐=。=

我们在使用HGE的时候主要写的代码就在这里。

对于这个样例,FrameFunc里面主要是检测一些键盘输入,然后让所有小龙猫按照设定的速度做一些变化

RenderFunc就是写一个循环便利所有的小龙猫然后把他们画出来,所有要用的都是封装好的,灰常方便。

就这么简单就可以完成这个小demo了。

最后在结束时释放掉资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图形 游戏