学习了tutorial02之后,自己也模仿着做了一下。没有载入声音,但是加入了更多对象,使对象以正弦曲线为轨迹运动。用Visual Studio 2010调试时发现几个对于我这种初学者容易出错的地方:
1.将debug版本更换为release版本时,还要重新设置一次编程环境。否则会出错。
2.如果要载入文件,要将文件放在debug或release目录中,否则找不到。
3.要使程序在只装了Microsoft.Net Framework2.0的机器上运行,在新建工程时就得选这个,否则VS2010默认为.Net Framework4,那就基本上只能在本机运行了。另外要将程序、hge.dll(位于HGE的根目录)、bass.dll和载入的资源文件放在同一个文件夹。(我觉得要摆脱.Net Framework还是用其他的编译器编译得好,比如DEV。 .Net Framework好烦啊,我编个黑框程序也要用那个东西,搞得我用VS 6.0以上的VS编的程序,在学校的电脑里都不能运行。不知道有没有什么更好的解决方法。搜了很久都没找到,也许大虾们都决定这个太容易了吧,都没有什么指导~~~~(>_<)~~~~ )
在模仿tutorial02也尝试了一些开发文档中的其他设置,同样还是看着代码说话吧:
#include"hge.h" #include<cmath> HGE *hge=NULL; hgeQuad *quad;//用动态数组存储hgeQuad对象 const char *sheep="sheep.jpg";//这是我要载入的图片 const float speed = 1;//每次刷新x方向增加的步长,单位为像素 float x = 100.0f;//hgeQuad对象在x方向的位置 float t = 0.0f;//每次循环时sin()的相位的变化量 int FPS = 50;//每秒50帧 int sheepNum = 2;//sheep的数量 //以上这些参数均设为全局变量,因为每次FrameFunc()调用时都要用,而HGE中FrameFunc()又不能有参数 //不知道这个问题怎么解决呀?所以只能设成全局变量了 bool FrameFunc(); bool RenderFunc(); int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { hge = hgeCreate(HGE_VERSION); //initial quad = new hgeQuad[sheepNum]; hge->System_SetState(HGE_FRAMEFUNC, FrameFunc); hge->System_SetState(HGE_RENDERFUNC, RenderFunc ); hge->System_SetState(HGE_TITLE, "Simulation of Ecosystem" ); //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_HIDEMOUSE, false );//不要在窗口中隐藏鼠标 hge->System_SetState(HGE_FPS,FPS );//设置每秒的帧数为FPS帧/秒 if(hge->System_Initiate()) { for( int i=0;i<sheepNum;i++ ) { //载入图片 quad[i].tex = hge->Texture_Load( sheep ); if( !quad[i].tex ) { MessageBox(NULL, "Can't load picture of sheep", "ERROR" , MB_OK | MB_ICONERROR | MB_APPLMODAL ); hge->System_Shutdown(); hge->Release(); delete [] quad; return 0; } quad[i].v[0].tx = 0.0f;quad[i].v[0].ty = 0.0f; quad[i].v[1].tx = 1.0f;quad[i].v[1].ty = 0.0f; quad[i].v[2].tx = 1.0f;quad[i].v[2].ty = 1.0f; quad[i].v[3].tx = 0.0f;quad[i].v[3].ty = 1.0f; quad[i].blend=BLEND_COLORMUL; quad[i].v[0].col = 0xFFFFFFFF;quad[i].v[0].z = 0.5f; quad[i].v[1].col = 0xFFFFFFFF;quad[i].v[1].z = 0.5f; quad[i].v[2].col = 0xFFFFFFFF;quad[i].v[2].z = 0.5f; quad[i].v[3].col = 0xFFFFFFFF;quad[i].v[3].z = 0.5f; } hge->System_Start(); //Free loaded texture for( int i=0;i<sheepNum;i++ ) hge->Texture_Free(quad[i].tex); delete [] quad; } else MessageBox(NULL, hge->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL); hge->Release(); return 0; } bool FrameFunc() { float dt=hge->Timer_GetDelta(); float y = 0;//图片在y轴的坐标 for( int i=0;i< sheepNum;i++ ) { //在程序窗口中,x,y轴的原点在窗口的左上角。 y = 100*(i+0.5)*sin(t)+300; t+=1/M_PI*0.1;//每出刷新一帧,y的相位增加0.1弧度。这里M_PI是内置常量,代表π。 quad[i].v[0].x = x-50.0;quad[i].v[0].y = y-50.0; quad[i].v[1].x = x+50.0;quad[i].v[1].y = y-50.0; quad[i].v[2].x = x+50.0;quad[i].v[2].y = y+50.0; quad[i].v[3].x = x-50.0;quad[i].v[3].y = y+50.0; //图片的x轴方向位置自加,到另一端后折回。 x=x+speed; while( x>800-50 ) x-=750; } return false; } bool RenderFunc() { hge->Gfx_BeginScene(); hge->Gfx_Clear(0); for( int i=0;i<sheepNum;i++ ) hge->Gfx_RenderQuad(&quad[i]); hge->Gfx_EndScene(); return false; }
另外附我使用的图片,嘿嘿: