[HGE]-源码分析-2 一个小demo
2013-10-23 10:23
399 查看
先来看看HGE是怎么使用的吧。
先上代码
这个是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了。
最后在结束时释放掉资源。
先上代码
/* ** 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了。
最后在结束时释放掉资源。
相关文章推荐
- [HGE]-源码分析-4 core里的demo和graphics(a)
- Mesos源码分析(10): MesosSchedulerDriver的启动及运行一个Task
- 参照JDK源码实现一个LinkedList,分析常用的List集合及其适用场景
- View视图框架源码分析之一:android是如何创建一个view
- demo/misc/map(集成地图)源码分析
- Python源码分析2 - 一个简单的Python程序的执行
- 2017年8月14日---阶段性工作总结(sp se框架中的一个简单方法源码分析)
- 一个学生对HashMap源码注释分析
- 一个书上的Ajax登录验证的源码以及分析
- 一步步搭建自己的轻量级MVCphp框架-(四)一个国产轻量级框架Amysql源码分析(3) 总进程对象
- java写的一个zip压缩源码错误分析
- 开源项目Logger源码分析-----一个好看、简单、强大的logcat信息输出项目
- 一个病毒源码的分析
- [HGE]-源码分析-9 input,power,random
- 一个U盘病毒汇编源码分析
- Mesos源码分析(13): MesosContainerier运行一个Task
- [HGE]-源码分析-10 resource
- Nginx源码分析 - 实战篇 - 编写一个自定义的模块
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
- Profile 分析 Erlang 虚拟机源码时要注意的一个问题