Tutorial 02 – 使用声音,输入和图象
要渲染一些东西我们需要hgeQuad结构体。Quad是HGE的基本渲染元素。它包含4个顶点,顺时针0到3。
同时我们需要声音效果的句柄。
hgeQuad quad;
HEFFECT snd;
这里我们放些游戏需要的变量和常量。
float x=100.0f, y=100.0f;
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->Effect_PlayEx(snd,100,pan,pitch);
}
现在来到frame function。我们需要知道从上次调用函数到现在的时间来调整动画的速度在当前的帧速率下。用Timer_GetDelta来获得时间。
bool FrameFunc()
{
float dt=hge->Timer_GetDelta();
现在我们处理按键。我们用Input_GetKeyState函数来检测按键状态。捕获键的点击用Input_GetKey。
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();}
现在我们更新屏幕并且更新quad的顶点来反映改变。
quad.v[0].x=x-16; quad.v[0].y=y-16;
quad.v[1].x=x+16; quad.v[1].y=y-16;
quad.v[2].x=x+16; quad.v[2].y=y+16;
quad.v[3].x=x-16; quad.v[3].y=y+16;
更新结束应返回false使程序继续运行。
return false;
}
现在来到渲染部分。我们将会设置当窗口被刷新时调用的函数。
bool RenderFunc()
{
调用Gfx_BeginScene函数开始渲染。用Gfx_Clear清空屏幕,Gfx_RenderQuad渲染精灵。最后我们结束渲染并更新屏幕,调用Gfx_EndScene。
hge->Gfx_BeginScene();
hge->Gfx_Clear(0);
hge->Gfx_RenderQuad(&quad);
hge->Gfx_EndScene();
return false;
}
渲染函数应该总是返回false。
现在来看看WinMain函数的改变。在这例子中我们在HGE初始化前设置更多的系统状态。首先指定渲染函数。也要启用记录文件的支持并明确指定视频模式。
hge->System_SetState(HGE_LOGFILE, "hge_tut02.log");
hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
hge->System_SetState(HGE_TITLE,
"HGE Tutorial 02 - Using input, sound and rendering");
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初始化后我们要载入纹理和音效。
snd=hge->Effect_Load("menu.wav");
quad.tex=hge->Texture_Load("particles.png");
现在我们设置需要渲染的hgeQuad结构体。纹理已经设置好,现在设置渲染模式并填充顶点数据。
这个例子中我们不使用z-buffer,所以顶点的z-order被忽略,任意设置一个0.0到1.0的值。颜色的DWORD值格式为0xAARRGGBB。
tx和 tx定义纹理的每个部分在精灵上渲染的位置。值为0.0到1.0。0,0意味着左上角,1,1是右下角。这里有个128x128的纹理,我们希望使用它的32 x32大的从96,64开始的一部分。
quad.blend=BLEND_ALPHAADD | BLEND_COLORMUL | BLEND_ZWRITE;
for(int i=0;i<4;i++)
{
quad.v[i].z=0.5f;
quad.v[i].col=0xFFFFA000;
}
quad.v[0].tx=96.0/128.0; quad.v[0].ty=64.0/128.0;
quad.v[1].tx=128.0/128.0; quad.v[1].ty=64.0/128.0;
quad.v[2].tx=128.0/128.0; quad.v[2].ty=96.0/128.0;
quad.v[3].tx=96.0/128.0; quad.v[3].ty=96.0/128.0;
现在我们准备用System_Start开始游戏循环。当frame function返回true并且游戏结束我们应该释放载入的纹理和音效。
hge->System_Start();
hge->Texture_Free(quad.tex);
hge->Effect_Free(snd);