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

游戏引擎

开发平台:

Visual C++

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