1.学习HGE的tutorial02

HGE的tutorial01很简单,看了下就跳过了。直接进入tutorial02。说实话还是因为数据结构课的大作业需要,所以看得比较快:P

tutorial02教我们如何在程序里载入图片和声音。文档是英文的,看得还是有点吃力呀。这里还是拿源码来分析吧:

#include "hge.h" HGE *hge=0;//HGE类的指针,对HGE的操作都靠它。 // hgeQuad类可以载入图片,并设置图片显示区域、在屏幕中的位置、色彩等信息 hgeQuad quad; //用于操作声音的 Handle HEFFECT snd; /* 游戏参数。这里作为全局变量,因为每次刷新的时候都要调用到。x,y是图片在屏幕中的位置。 dx,dy是x方向和y方向的增量。*/ 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); //snd指向的是个声音文件;100指大的是音量,范围是0-100; //pan用于调整声道,范围从-100到100,-100即声音完全在左声道中,100即声音完全在右声道。 //pitch貌似指的是播放文件时的频率(文档中的那个英文单词没查到呀) //当我把它设置得很低时,就像慢放,调到100多就感觉正常了。 } 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; // 当图片碰到程序框边时,弹回,并且播放声音。 //程序框默认是800*600像素的。图片是32*32像素的。从图片中心到各边的距离是16像素。 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是方形的,所以它的坐标由逆时针顺序的四个点决定。 //这里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继续刷新屏幕,ture则终止刷新 return false; } // 每次刷新屏幕都执行这个函数,将各种类绘制到屏幕上 bool RenderFunc() { // Begin rendering quads. // This function must be called // before any actual rendering. hge->Gfx_BeginScene(); // Clear screen with black color hge->Gfx_Clear(0); // Render quads here. This time just // one of them will serve our needs. hge->Gfx_RenderQuad(&quad); // End rendering and update the screen hge->Gfx_EndScene(); // RenderFunc should always return false return false; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { // Get HGE interface hge = hgeCreate(HGE_VERSION); // Set up log file, frame function, render function and window title hge->System_SetState(HGE_LOGFILE, "hge_tut02.log"); //我对MFC不太了解,但是感觉下面这两句会在每次循环更新屏幕时, //依次调用FrameFunc()和RenderFunc()。编程中发现FrameFunc() //和RenderFunc()都是不能加参数的,否则会报错。不知道是不是自己方法不对? 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"); // Set up video mode hge->System_SetState(HGE_WINDOWED, true);//以窗口模式显示 hge->System_SetState(HGE_SCREENWIDTH, 800); hge->System_SetState(HGE_SCREENHEIGHT, 600); hge->System_SetState(HGE_SCREENBPP, 32);//色深为32位。感觉这句多余,因为文档中说在窗口模式下,色深自动与系统保持一致。这句设置失效。 if(hge->System_Initiate()) { // Load sound and texture snd=hge->Effect_Load("menu.wav");//HGE支持多种音频和图片 quad.tex=hge->Texture_Load("particles.png"); if(!snd || !quad.tex) { // If one of the data files is not found, display // an error message and shutdown. MessageBox(NULL, "Can't load MENU.WAV or PARTICLES.PNG", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL); hge->System_Shutdown(); hge->Release(); return 0; } // 图片模式绑定。好像必须设置绑定,否则图片显示不了。 //前后两个绑定模式不太认识,中间那个BLEND_COLORMUL可以加深图片颜色。在BLEND_COLORMUL模式下Quad的颜色设置为0xFFFFFFFF时可以使图片以原色显示。 quad.blend=BLEND_ALPHAADD | BLEND_COLORMUL | BLEND_ZWRITE; for(int i=0;i<4;i++) { // Set up z-coordinate of vertices quad.v[i].z=0.5f; // Set up color. The format of DWORD col is 0xAARRGGBB quad.v[i].col=0xFFFFA000; } // 设置图片显示区域。坐标以逆时针为顺序。范围为0-1。表示在原图片中的百分比位置 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; // Let's rock now! hge->System_Start(); // 释放载入的声音和图片 hge->Texture_Free(quad.tex); hge->Effect_Free(snd); } else MessageBox(NULL, hge->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL); // Clean up and shutdown hge->System_Shutdown(); hge->Release(); return 0; }   

 

这就是我结合源码加上开发文档学到的一些东西吧。

你可能感兴趣的:(1.学习HGE的tutorial02)