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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.7
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hgeAnimation helper class implementation
  7. */
  8. #include "....includehgeanim.h"
  9. hgeAnimation::hgeAnimation(HTEXTURE tex, int nframes, float FPS, float x, float y, float w, float h)
  10. : hgeSprite(tex, x, y, w, h)
  11. {
  12. orig_width = hge->Texture_GetWidth(tex, true);
  13. fSinceLastFrame=-1.0f;
  14. fSpeed=1.0f/FPS;
  15. bPlaying=false;
  16. nFrames=nframes;
  17. Mode=HGEANIM_FWD | HGEANIM_LOOP;
  18. nDelta=1;
  19. SetFrame(0);
  20. }
  21. hgeAnimation::hgeAnimation(const hgeAnimation & anim)
  22. : hgeSprite(anim)
  23. // Copy hgeAnimation parameters: 
  24. this->orig_width   = anim.orig_width;
  25. this->bPlaying        = anim.bPlaying; 
  26. this->fSpeed          = anim.fSpeed; 
  27. this->fSinceLastFrame = anim.fSinceLastFrame;
  28. this->Mode            = anim.Mode;
  29. this->nDelta          = anim.nDelta;
  30. this->nFrames         = anim.nFrames;
  31. this->nCurFrame       = anim.nCurFrame;
  32. }
  33. void hgeAnimation::SetMode(int mode)
  34. {
  35. Mode=mode;
  36. if(mode & HGEANIM_REV)
  37. {
  38. nDelta = -1;
  39. SetFrame(nFrames-1);
  40. }
  41. else
  42. {
  43. nDelta = 1;
  44. SetFrame(0);
  45. }
  46. }
  47. void hgeAnimation::Play()
  48. {
  49. bPlaying=true;
  50. fSinceLastFrame=-1.0f;
  51. if(Mode & HGEANIM_REV)
  52. {
  53. nDelta = -1;
  54. SetFrame(nFrames-1);
  55. }
  56. else
  57. {
  58. nDelta = 1;
  59. SetFrame(0);
  60. }
  61. }
  62. void hgeAnimation::Update(float fDeltaTime)
  63. {
  64. if(!bPlaying) return;
  65. if(fSinceLastFrame == -1.0f)
  66. fSinceLastFrame=0.0f;
  67. else
  68. fSinceLastFrame += fDeltaTime;
  69. while(fSinceLastFrame >= fSpeed)
  70. {
  71. fSinceLastFrame -= fSpeed;
  72. if(nCurFrame + nDelta == nFrames)
  73. {
  74. switch(Mode)
  75. {
  76. case HGEANIM_FWD:
  77. case HGEANIM_REV | HGEANIM_PINGPONG:
  78. bPlaying = false;
  79. break;
  80. case HGEANIM_FWD | HGEANIM_PINGPONG:
  81. case HGEANIM_FWD | HGEANIM_PINGPONG | HGEANIM_LOOP:
  82. case HGEANIM_REV | HGEANIM_PINGPONG | HGEANIM_LOOP:
  83. nDelta = -nDelta;
  84. break;
  85. }
  86. }
  87. else if(nCurFrame + nDelta < 0)
  88. {
  89. switch(Mode)
  90. {
  91. case HGEANIM_REV:
  92. case HGEANIM_FWD | HGEANIM_PINGPONG:
  93. bPlaying = false;
  94. break;
  95. case HGEANIM_REV | HGEANIM_PINGPONG:
  96. case HGEANIM_REV | HGEANIM_PINGPONG | HGEANIM_LOOP:
  97. case HGEANIM_FWD | HGEANIM_PINGPONG | HGEANIM_LOOP:
  98. nDelta = -nDelta;
  99. break;
  100. }
  101. }
  102. if(bPlaying) SetFrame(nCurFrame+nDelta);
  103. }
  104. }
  105. void hgeAnimation::SetFrame(int n)
  106. {
  107. float tx1, ty1, tx2, ty2;
  108. bool bX, bY, bHS;
  109. int ncols = int(orig_width) / int(width);
  110. n = n % nFrames;
  111. if(n < 0) n = nFrames + n;
  112. nCurFrame = n;
  113. // calculate texture coords for frame n
  114. ty1 = ty;
  115. tx1 = tx + n*width;
  116. if(tx1 > orig_width-width)
  117. {
  118. n -= int(orig_width-tx) / int(width);
  119. tx1 = width * (n%ncols);
  120. ty1 += height * (1 + n/ncols);
  121. }
  122. tx2 = tx1 + width;
  123. ty2 = ty1 + height;
  124. tx1 /= tex_width;
  125. ty1 /= tex_height;
  126. tx2 /= tex_width;
  127. ty2 /= tex_height;
  128. quad.v[0].tx=tx1; quad.v[0].ty=ty1;
  129. quad.v[1].tx=tx2; quad.v[1].ty=ty1;
  130. quad.v[2].tx=tx2; quad.v[2].ty=ty2;
  131. quad.v[3].tx=tx1; quad.v[3].ty=ty2;
  132. bX=bXFlip; bY=bYFlip; bHS=bHSFlip;
  133. bXFlip=false; bYFlip=false;
  134. SetFlip(bX,bY,bHS);
  135. }