1 /* 2 ** Haaf's Game Engine 1.8 3 ** Copyright (C) 2003-2007, Relish Games 4 ** hge.relishgames.com 5 ** 6 ** hge_tut07 - Thousand of Hares 7 */ 8 9 10 // 复制"font2.fnt", "font2.png","bg2.png","zazaka.png" 11 12 13 #include <hge.h> 14 #include <hgefont.h> 15 #pragma comment(lib,"hge.lib") 16 #pragma comment(lib,"hgehelp.lib") 17 18 #define SCREEN_WIDTH 800 19 #define SCREEN_HEIGHT 600 20 21 #define MIN_OBJECTS 100 22 #define MAX_OBJECTS 2000 23 24 // 本例程中此结构用于表示一只兔子的各方面属性 25 struct sprObject 26 { 27 float x,y; 28 float dx,dy; 29 float scale,rot; 30 float dscale,drot; 31 DWORD color; 32 }; 33 34 sprObject* pObjects; 35 int nObjects; 36 int nBlend; 37 38 39 HGE *hge=0; 40 41 42 HTEXTURE tex, bgtex; 43 hgeSprite *spr, *bgspr; 44 hgeFont *fnt; 45 46 // 这个函数用于快速的设置融合模式 47 void SetBlend(int blend) 48 { 49 static int sprBlend[5]= 50 { 51 BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE, 52 BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE, 53 BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE, 54 BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE, 55 BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE 56 }; 57 58 static DWORD fntColor[5]= 59 { 60 0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF 61 }; 62 63 static DWORD sprColors[5][5]= 64 { 65 { 0xFFFFFFFF, 0xFFFFE080, 0xFF80A0FF, 0xFFA0FF80, 0xFFFF80A0 }, 66 { 0xFF000000, 0xFF303000, 0xFF000060, 0xFF006000, 0xFF600000 }, 67 { 0x80FFFFFF, 0x80FFE080, 0x8080A0FF, 0x80A0FF80, 0x80FF80A0 }, 68 { 0x80FFFFFF, 0x80FFE080, 0x8080A0FF, 0x80A0FF80, 0x80FF80A0 }, 69 { 0x40202020, 0x40302010, 0x40102030, 0x40203010, 0x40102030 } 70 }; 71 72 if(blend>4) blend=0; 73 nBlend=blend; 74 75 spr->SetBlendMode(sprBlend[blend]); 76 fnt->SetColor(fntColor[blend]); 77 //设置MAX_OBJECTS只兔子的属性 78 for(int i=0;i<MAX_OBJECTS;i++) pObjects[i].color=sprColors[blend][hge->Random_Int(0,4)]; 79 } 80 81 bool FrameFunc() 82 { 83 float dt=hge->Timer_GetDelta(); 84 int i; 85 86 87 switch(hge->Input_GetKey()) 88 { 89 case HGEK_UP: if(nObjects<MAX_OBJECTS) nObjects+=100; break; 90 case HGEK_DOWN: if(nObjects>MIN_OBJECTS) nObjects-=100; break; 91 case HGEK_SPACE: SetBlend(++nBlend); break; 92 case HGEK_ESCAPE: return true; 93 } 94 95 // 更新每只兔子的属性(位置,旋转等信息) 96 for(i=0;i<nObjects;i++) 97 { 98 pObjects[i].x+=pObjects[i].dx*dt; 99 if(pObjects[i].x>SCREEN_WIDTH || pObjects[i].x<0) pObjects[i].dx=-pObjects[i].dx; 100 pObjects[i].y+=pObjects[i].dy*dt; 101 if(pObjects[i].y>SCREEN_HEIGHT || pObjects[i].y<0) pObjects[i].dy=-pObjects[i].dy; 102 pObjects[i].scale+=pObjects[i].dscale*dt; 103 if(pObjects[i].scale>2 || pObjects[i].scale<0.5) pObjects[i].dscale=-pObjects[i].dscale; 104 pObjects[i].rot+=pObjects[i].drot*dt; 105 } 106 107 return false; 108 } 109 110 111 bool RenderFunc() 112 { 113 int i; 114 115 hge->Gfx_BeginScene(); 116 bgspr->Render(0,0); 117 118 // 绘制满屏幕的兔子 119 for(i=0;i<nObjects;i++) 120 { 121 spr->SetColor(pObjects[i].color); 122 spr->RenderEx(pObjects[i].x, pObjects[i].y, pObjects[i].rot, pObjects[i].scale); 123 } 124 125 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()); 126 hge->Gfx_EndScene(); 127 128 return false; 129 } 130 131 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 132 { 133 int i; 134 135 hge = hgeCreate(HGE_VERSION); 136 137 hge->System_SetState(HGE_LOGFILE, "hge_tut07.log"); 138 hge->System_SetState(HGE_FRAMEFUNC, FrameFunc); 139 hge->System_SetState(HGE_RENDERFUNC, RenderFunc); 140 hge->System_SetState(HGE_TITLE, "HGE Tutorial 07 - Thousand of Hares"); 141 hge->System_SetState(HGE_USESOUND, false); 142 hge->System_SetState(HGE_WINDOWED, true); 143 hge->System_SetState(HGE_SCREENWIDTH, SCREEN_WIDTH); 144 hge->System_SetState(HGE_SCREENHEIGHT, SCREEN_HEIGHT); 145 hge->System_SetState(HGE_SCREENBPP, 32); 146 147 if(hge->System_Initiate()) 148 { 149 150 // 加载纹理 151 bgtex=hge->Texture_Load("bg2.png"); 152 tex=hge->Texture_Load("zazaka.png"); 153 if(!bgtex || !tex) 154 { 155 MessageBox(NULL, "Can't load BG2.PNG or ZAZAKA.PNG", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL); 156 hge->System_Shutdown(); 157 hge->Release(); 158 return 0; 159 } 160 161 // 加载字体,创建精灵(兔子) 162 fnt=new hgeFont("font2.fnt"); 163 spr=new hgeSprite(tex,0,0,64,64); 164 spr->SetHotSpot(32,32); 165 166 bgspr=new hgeSprite(bgtex,0,0,800,600); 167 bgspr->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE); 168 bgspr->SetColor(0xFF000000,0); 169 bgspr->SetColor(0xFF000000,1); 170 bgspr->SetColor(0xFF000040,2); 171 bgspr->SetColor(0xFF000040,3); 172 173 // 创建MAX_OBJECTS个对象(兔子) 174 pObjects=new sprObject[MAX_OBJECTS]; 175 nObjects=1000; 176 177 for(i=0;i<MAX_OBJECTS;i++) 178 { 179 pObjects[i].x=hge->Random_Float(0,SCREEN_WIDTH); 180 pObjects[i].y=hge->Random_Float(0,SCREEN_HEIGHT); 181 pObjects[i].dx=hge->Random_Float(-200,200); 182 pObjects[i].dy=hge->Random_Float(-200,200); 183 pObjects[i].scale=hge->Random_Float(0.5f,2.0f); 184 pObjects[i].dscale=hge->Random_Float(-1.0f,1.0f); 185 pObjects[i].rot=hge->Random_Float(0,M_PI*2); 186 pObjects[i].drot=hge->Random_Float(-1.0f,1.0f); 187 } 188 189 SetBlend(0); 190 191 192 hge->System_Start(); 193 194 195 delete[] pObjects; 196 delete fnt; 197 delete spr; 198 delete bgspr; 199 hge->Texture_Free(tex); 200 hge->Texture_Free(bgtex); 201 } 202 203 hge->System_Shutdown(); 204 hge->Release(); 205 return 0; 206 }