1 /*
2 ** Haaf's Game Engine 1.8
3 ** Copyright (C) 2003-2007, Relish Games
4 ** hge.relishgames.com
5 **
6 ** hge_tut05 - Using distortion mesh
7 */
8
9
10 // 复制"particles.png","menu.wav","font1.fnt","font1.png","trail.psi"
11
12
13
14 #include <hge.h>
15 #include <hgefont.h>
16 #include <hgedistort.h>
17 #include <math.h>
18 #pragma comment(lib,"hge.lib")
19 #pragma comment(lib,"hgehelp.lib")
20
21
22 HGE *hge=0;
23
24 HTEXTURE tex;
25
26 // HGE的 形变网格 的指针
27 hgeDistortionMesh* dis;
28 hgeFont* fnt;
29
30
31 const int nRows=16;
32 const int nCols=16;
33 const float cellw=512.0f/(nCols-1);//网格中每格宽度
34 const float cellh=512.0f/(nRows-1);//网格中每格高度
35
36 const float meshx=144;
37 const float meshy=44;
38
39
40 bool FrameFunc()
41 {
42 float dt=hge->Timer_GetDelta();
43 static float t=0.0f;
44 static int trans=0;
45
46 int i, j, col;
47 float r, a, dx, dy;
48
49 t+=dt;
50
51 // 和之前不同的按键检测,这次检测空格键
52 switch(hge->Input_GetKey())
53 {
54 case HGEK_ESCAPE:
55 return true;
56
57 case HGEK_SPACE:
58 if(++trans > 2) trans=0;
59 dis->Clear(0xFF000000);
60 break;
61 }
62
63 // 为了产生特效而计算位移和颜色
64 switch(trans)
65 {
66 case 0: for(i=1;i<nRows-1;i++)
67 for(j=1;j<nCols-1;j++)
68 {
69 dis->SetDisplacement(j,i,cosf(t*10+(i+j)/2)*5,sinf(t*10+(i+j)/2)*5,HGEDISP_NODE);
70 }
71 break;
72
73 case 1: for(i=0;i<nRows;i++)
74 for(j=1;j<nCols-1;j++)
75 {
76 dis->SetDisplacement(j,i,cosf(t*5+j/2)*15,0,HGEDISP_NODE);
77 col=int((cosf(t*5+(i+j)/2)+1)*35);
78 dis->SetColor(j,i,0xFF<<24 | col<<16 | col<<8 | col);
79 }
80 break;
81
82 case 2: for(i=0;i<nRows;i++)
83 for(j=0;j<nCols;j++)
84 {
85 r=sqrtf(powf(j-(float)nCols/2,2)+powf(i-(float)nRows/2,2));
86 a=r*cosf(t*2)*0.1f;
87 dx=sinf(a)*(i*cellh-256)+cosf(a)*(j*cellw-256);
88 dy=cosf(a)*(i*cellh-256)-sinf(a)*(j*cellw-256);
89 // 指定要设置的坐标位置的平移量(列,行,x方向平移量,y方向平移量,平移量引用点)
90 // 列坐标和行坐标都是从0开始的.
91 // 平移量引用点可以取:HGEDISP_NODE - 引用点是默认点的位置
92 // HGEDISP_TOPLEFT - 引用点是网格的左上角 HGEDISP_CENTER - 引用点是网格的中心
93 dis->SetDisplacement(j,i,dx,dy,HGEDISP_CENTER);
94 col=int((cos(r+t*4)+1)*40);
95 // 指定要设置的坐标位置的颜色(列,行,颜色)
96 dis->SetColor(j,i,0xFF<<24 | col<<16 | (col/2)<<8);
97 }
98 break;
99 }
100
101 return false;
102 }
103
104
105 bool RenderFunc()
106 {
107 // 绘制图像
108 hge->Gfx_BeginScene();
109 hge->Gfx_Clear(0);
110 dis->Render(meshx, meshy);
111 fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d\n\nUse your\nSPACE!", hge->Timer_GetDelta(), hge->Timer_GetFPS());
112 hge->Gfx_EndScene();
113
114 return false;
115 }
116
117
118 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
119 {
120 hge = hgeCreate(HGE_VERSION);
121
122 hge->System_SetState(HGE_LOGFILE, "hge_tut05.log");
123 hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
124 hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
125 hge->System_SetState(HGE_TITLE, "HGE Tutorial 05 - Using distortion mesh");
126 hge->System_SetState(HGE_WINDOWED, true);
127 hge->System_SetState(HGE_SCREENWIDTH, 800);
128 hge->System_SetState(HGE_SCREENHEIGHT, 600);
129 hge->System_SetState(HGE_SCREENBPP, 32);
130 hge->System_SetState(HGE_USESOUND, false);
131
132 if(hge->System_Initiate()) {
133
134 // 加载纹理
135 tex=hge->Texture_Load("texture.jpg");
136 if(!tex)
137 {
138 MessageBox(NULL, "Can't load TEXTURE.JPG", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
139 hge->System_Shutdown();
140 hge->Release();
141 return 0;
142 }
143
144 // 创建一个形变网格
145 dis=new hgeDistortionMesh(nCols, nRows);//网格列,行的数量
146 dis->SetTexture(tex);//设置用于形变的纹理
147 dis->SetTextureRect(0,0,512,512);//设置纹理中用于形变的区域(纹理左上角x,纹理左上角y,宽度,高度)
148 dis->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_ZWRITE);
149 //用指定的颜色和Z序清空网格的平移和着色(颜色=0xFFFFFFFF,Z序=0.5f),=后面的数值为默认值,以后不再说明
150 dis->Clear(0xFF000000);//此处使用的是黑色,默认是白色
151
152 fnt=new hgeFont("font1.fnt");
153
154 hge->System_Start();
155
156 delete fnt;
157 delete dis;
158 hge->Texture_Free(tex);
159 }
160
161 hge->System_Shutdown();
162 hge->Release();
163 return 0;
164 }