hgesprite.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.7
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hgeSprite helper class implementation
  7. */
  8. #include "....includehgesprite.h"
  9. #include <math.h>
  10. HGE *hgeSprite::hge=0;
  11. hgeSprite::hgeSprite(HTEXTURE texture, float texx, float texy, float w, float h)
  12. {
  13. float texx1, texy1, texx2, texy2;
  14. hge=hgeCreate(HGE_VERSION);
  15. tx=texx; ty=texy;
  16. width=w; height=h;
  17. if(texture)
  18. {
  19. tex_width = (float)hge->Texture_GetWidth(texture);
  20. tex_height = (float)hge->Texture_GetHeight(texture);
  21. }
  22. else
  23. {
  24. tex_width = 1.0f;
  25. tex_height = 1.0f;
  26. }
  27. hotX=0;
  28. hotY=0;
  29. bXFlip=false;
  30. bYFlip=false;
  31. bHSFlip=false;
  32. quad.tex=texture;
  33. texx1=texx/tex_width;
  34. texy1=texy/tex_height;
  35. texx2=(texx+w)/tex_width;
  36. texy2=(texy+h)/tex_height;
  37. quad.v[0].tx = texx1; quad.v[0].ty = texy1;
  38. quad.v[1].tx = texx2; quad.v[1].ty = texy1;
  39. quad.v[2].tx = texx2; quad.v[2].ty = texy2;
  40. quad.v[3].tx = texx1; quad.v[3].ty = texy2;
  41. quad.v[0].z = 
  42. quad.v[1].z = 
  43. quad.v[2].z = 
  44. quad.v[3].z = 0.5f;
  45. quad.v[0].col = 
  46. quad.v[1].col = 
  47. quad.v[2].col = 
  48. quad.v[3].col = 0xffffffff;
  49. quad.blend=BLEND_DEFAULT;
  50. }
  51. hgeSprite::hgeSprite(const hgeSprite &spr)
  52. {
  53. memcpy(this, &spr, sizeof(hgeSprite));
  54. hge=hgeCreate(HGE_VERSION);
  55. }
  56. void hgeSprite::Render(float x, float y)
  57. {
  58. float tempx1, tempy1, tempx2, tempy2;
  59. tempx1 = x-hotX;
  60. tempy1 = y-hotY;
  61. tempx2 = x+width-hotX;
  62. tempy2 = y+height-hotY;
  63. quad.v[0].x = tempx1; quad.v[0].y = tempy1;
  64. quad.v[1].x = tempx2; quad.v[1].y = tempy1;
  65. quad.v[2].x = tempx2; quad.v[2].y = tempy2;
  66. quad.v[3].x = tempx1; quad.v[3].y = tempy2;
  67. hge->Gfx_RenderQuad(&quad);
  68. }
  69. void hgeSprite::RenderEx(float x, float y, float rot, float hscale, float vscale)
  70. {
  71. float tx1, ty1, tx2, ty2;
  72. float sint, cost;
  73. if(vscale==0) vscale=hscale;
  74. tx1 = -hotX*hscale;
  75. ty1 = -hotY*vscale;
  76. tx2 = (width-hotX)*hscale;
  77. ty2 = (height-hotY)*vscale;
  78. if (rot != 0.0f)
  79. {
  80. cost = cosf(rot);
  81. sint = sinf(rot);
  82. quad.v[0].x  = tx1*cost - ty1*sint + x;
  83. quad.v[0].y  = tx1*sint + ty1*cost + y;
  84. quad.v[1].x  = tx2*cost - ty1*sint + x;
  85. quad.v[1].y  = tx2*sint + ty1*cost + y;
  86. quad.v[2].x  = tx2*cost - ty2*sint + x;
  87. quad.v[2].y  = tx2*sint + ty2*cost + y;
  88. quad.v[3].x  = tx1*cost - ty2*sint + x;
  89. quad.v[3].y  = tx1*sint + ty2*cost + y;
  90. }
  91. else
  92. {
  93. quad.v[0].x = tx1 + x; quad.v[0].y = ty1 + y;
  94. quad.v[1].x = tx2 + x; quad.v[1].y = ty1 + y;
  95. quad.v[2].x = tx2 + x; quad.v[2].y = ty2 + y;
  96. quad.v[3].x = tx1 + x; quad.v[3].y = ty2 + y;
  97. }
  98. hge->Gfx_RenderQuad(&quad);
  99. }
  100. void hgeSprite::RenderStretch(float x1, float y1, float x2, float y2)
  101. {
  102. quad.v[0].x = x1; quad.v[0].y = y1;
  103. quad.v[1].x = x2; quad.v[1].y = y1;
  104. quad.v[2].x = x2; quad.v[2].y = y2;
  105. quad.v[3].x = x1; quad.v[3].y = y2;
  106. hge->Gfx_RenderQuad(&quad);
  107. }
  108. void hgeSprite::Render4V(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)
  109. {
  110. quad.v[0].x = x0; quad.v[0].y = y0;
  111. quad.v[1].x = x1; quad.v[1].y = y1;
  112. quad.v[2].x = x2; quad.v[2].y = y2;
  113. quad.v[3].x = x3; quad.v[3].y = y3;
  114. hge->Gfx_RenderQuad(&quad);
  115. }
  116. hgeRect* hgeSprite::GetBoundingBoxEx(float x, float y, float rot, float hscale, float vscale, hgeRect *rect) const
  117. {
  118. float tx1, ty1, tx2, ty2;
  119. float sint, cost;
  120. rect->Clear();
  121. tx1 = -hotX*hscale;
  122. ty1 = -hotY*vscale;
  123. tx2 = (width-hotX)*hscale;
  124. ty2 = (height-hotY)*vscale;
  125. if (rot != 0.0f)
  126. {
  127. cost = cosf(rot);
  128. sint = sinf(rot);
  129. rect->Encapsulate(tx1*cost - ty1*sint + x, tx1*sint + ty1*cost + y);
  130. rect->Encapsulate(tx2*cost - ty1*sint + x, tx2*sint + ty1*cost + y);
  131. rect->Encapsulate(tx2*cost - ty2*sint + x, tx2*sint + ty2*cost + y);
  132. rect->Encapsulate(tx1*cost - ty2*sint + x, tx1*sint + ty2*cost + y);
  133. }
  134. else
  135. {
  136. rect->Encapsulate(tx1 + x, ty1 + y);
  137. rect->Encapsulate(tx2 + x, ty1 + y);
  138. rect->Encapsulate(tx2 + x, ty2 + y);
  139. rect->Encapsulate(tx1 + x, ty2 + y);
  140. }
  141. return rect;
  142. }
  143. void hgeSprite::SetFlip(bool bX, bool bY, bool bHotSpot)
  144. {
  145. float tx, ty;
  146. if(bHSFlip && bXFlip) hotX = width - hotX;
  147. if(bHSFlip && bYFlip) hotY = height - hotY;
  148. bHSFlip = bHotSpot;
  149. if(bHSFlip && bXFlip) hotX = width - hotX;
  150. if(bHSFlip && bYFlip) hotY = height - hotY;
  151. if(bX != bXFlip)
  152. {
  153. tx=quad.v[0].tx; quad.v[0].tx=quad.v[1].tx; quad.v[1].tx=tx;
  154. ty=quad.v[0].ty; quad.v[0].ty=quad.v[1].ty; quad.v[1].ty=ty;
  155. tx=quad.v[3].tx; quad.v[3].tx=quad.v[2].tx; quad.v[2].tx=tx;
  156. ty=quad.v[3].ty; quad.v[3].ty=quad.v[2].ty; quad.v[2].ty=ty;
  157. bXFlip=!bXFlip;
  158. }
  159. if(bY != bYFlip)
  160. {
  161. tx=quad.v[0].tx; quad.v[0].tx=quad.v[3].tx; quad.v[3].tx=tx;
  162. ty=quad.v[0].ty; quad.v[0].ty=quad.v[3].ty; quad.v[3].ty=ty;
  163. tx=quad.v[1].tx; quad.v[1].tx=quad.v[2].tx; quad.v[2].tx=tx;
  164. ty=quad.v[1].ty; quad.v[1].ty=quad.v[2].ty; quad.v[2].ty=ty;
  165. bYFlip=!bYFlip;
  166. }
  167. }
  168. void hgeSprite::SetTexture(HTEXTURE tex)
  169. {
  170. float tx1,ty1,tx2,ty2;
  171. float tw,th;
  172. quad.tex=tex;
  173. if(tex)
  174. {
  175. tw = (float)hge->Texture_GetWidth(tex);
  176. th = (float)hge->Texture_GetHeight(tex);
  177. }
  178. else
  179. {
  180. tw = 1.0f;
  181. th = 1.0f;
  182. }
  183. if(tw!=tex_width || th!=tex_height)
  184. {
  185. tx1=quad.v[0].tx*tex_width;
  186. ty1=quad.v[0].ty*tex_height;
  187. tx2=quad.v[2].tx*tex_width;
  188. ty2=quad.v[2].ty*tex_height;
  189. tex_width=tw;
  190. tex_height=th;
  191. tx1/=tw; ty1/=th;
  192. tx2/=tw; ty2/=th;
  193. quad.v[0].tx=tx1; quad.v[0].ty=ty1; 
  194. quad.v[1].tx=tx2; quad.v[1].ty=ty1; 
  195. quad.v[2].tx=tx2; quad.v[2].ty=ty2; 
  196. quad.v[3].tx=tx1; quad.v[3].ty=ty2; 
  197. }
  198. }
  199. void hgeSprite::SetTextureRect(float x, float y, float w, float h, bool adjSize)
  200. {
  201. float tx1, ty1, tx2, ty2;
  202. bool bX,bY,bHS;
  203. tx=x;
  204. ty=y;
  205. if(adjSize)
  206. {
  207. width=w;
  208. height=h;
  209. }
  210. tx1=tx/tex_width; ty1=ty/tex_height;
  211. tx2=(tx+w)/tex_width; ty2=(ty+h)/tex_height;
  212. quad.v[0].tx=tx1; quad.v[0].ty=ty1; 
  213. quad.v[1].tx=tx2; quad.v[1].ty=ty1; 
  214. quad.v[2].tx=tx2; quad.v[2].ty=ty2; 
  215. quad.v[3].tx=tx1; quad.v[3].ty=ty2; 
  216. bX=bXFlip; bY=bYFlip; bHS=bHSFlip;
  217. bXFlip=false; bYFlip=false;
  218. SetFlip(bX,bY,bHS);
  219. }
  220. void hgeSprite::SetColor(DWORD col, int i)
  221. {
  222. if(i != -1)
  223. quad.v[i].col = col;
  224. else
  225. quad.v[0].col = quad.v[1].col = quad.v[2].col = quad.v[3].col = col;
  226. }
  227. void hgeSprite::SetZ(float z, int i)
  228. {
  229. if(i != -1)
  230. quad.v[i].z = z;
  231. else
  232. quad.v[0].z = quad.v[1].z = quad.v[2].z = quad.v[3].z = z;
  233. }