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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.5
  3. ** Copyright (C) 2003-2004, 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. fSinceLastFrame=-1.0f;
  13. fSpeed=1.0f/FPS;
  14. bPlaying=false;
  15. nFrames=nframes;
  16. Mode=HGEANIM_FWD | HGEANIM_LOOP;
  17. nDelta=1;
  18. SetFrame(0);
  19. }
  20. hgeAnimation::hgeAnimation(const hgeAnimation & anim)
  21. : hgeSprite(anim)
  22. // Copy hgeAnimation parameters: 
  23. this->bPlaying        = anim.bPlaying; 
  24. this->fSpeed          = anim.fSpeed; 
  25. this->fSinceLastFrame = anim.fSinceLastFrame;
  26. this->Mode            = anim.Mode;
  27. this->nDelta          = anim.nDelta;
  28. this->nFrames         = anim.nFrames;
  29. this->nCurFrame       = anim.nCurFrame;
  30. }
  31. void hgeAnimation::SetMode(int mode)
  32. {
  33. Mode=mode;
  34. if(mode & HGEANIM_REV) { nDelta=-1; SetFrame(nFrames-1); }
  35. else { nDelta=1; SetFrame(0); }
  36. }
  37. void hgeAnimation::Play()
  38. {
  39. bPlaying=true;
  40. fSinceLastFrame=-1.0f;
  41. if(Mode & HGEANIM_REV) { nDelta=-1; SetFrame(nFrames-1); }
  42. else { nDelta=1; SetFrame(0); }
  43. }
  44. void hgeAnimation::Update(float fDeltaTime)
  45. {
  46. if(!bPlaying) return;
  47. if(fSinceLastFrame == -1.0f) fSinceLastFrame=0.0f;
  48. else fSinceLastFrame += fDeltaTime;
  49. while(fSinceLastFrame >= fSpeed)
  50. {
  51. fSinceLastFrame -= fSpeed;
  52. if(nCurFrame+nDelta == nFrames)
  53. {
  54. switch(Mode)
  55. {
  56. case HGEANIM_FWD:
  57. case HGEANIM_REV | HGEANIM_PINGPONG:
  58. bPlaying=false;
  59. break;
  60. case HGEANIM_FWD | HGEANIM_PINGPONG:
  61. case HGEANIM_FWD | HGEANIM_PINGPONG | HGEANIM_LOOP:
  62. case HGEANIM_REV | HGEANIM_PINGPONG | HGEANIM_LOOP:
  63. nDelta=-nDelta;
  64. break;
  65. }
  66. }
  67. else if(nCurFrame+nDelta < 0)
  68. {
  69. switch(Mode)
  70. {
  71. case HGEANIM_REV:
  72. case HGEANIM_FWD | HGEANIM_PINGPONG:
  73. bPlaying=false;
  74. break;
  75. case HGEANIM_REV | HGEANIM_PINGPONG:
  76. case HGEANIM_REV | HGEANIM_PINGPONG | HGEANIM_LOOP:
  77. case HGEANIM_FWD | HGEANIM_PINGPONG | HGEANIM_LOOP:
  78. nDelta=-nDelta;
  79. break;
  80. }
  81. }
  82. if(bPlaying) SetFrame(nCurFrame+nDelta);
  83. }
  84. }
  85. void hgeAnimation::SetFrame(int n)
  86. {
  87. float tx1, ty1, tx2, ty2;
  88. bool bX=bXFlip, bY=bYFlip;
  89. int ncols = int(tex_width) / int(width);
  90. n=n%nFrames;
  91. if(n<0) n=nFrames+n;
  92. nCurFrame=n;
  93. // calculate texture coords for frame n
  94. ty1 = ty;
  95. tx1 = tx + n*width;
  96. if(tx1 > tex_width-width)
  97. {
  98. n -= int(tex_width-tx) / int(width);
  99. tx1 = width * (n%ncols);
  100. ty1 += height * (1 + n/ncols);
  101. }
  102. tx2 = tx1 + width;
  103. ty2 = ty1 + height;
  104. tx1 /= tex_width;
  105. ty1 /= tex_height;
  106. tx2 /= tex_width;
  107. ty2 /= tex_height;
  108. quad.v[0].tx=tx1; quad.v[0].ty=ty1;
  109. quad.v[1].tx=tx2; quad.v[1].ty=ty1;
  110. quad.v[2].tx=tx2; quad.v[2].ty=ty2;
  111. quad.v[3].tx=tx1; quad.v[3].ty=ty2;
  112. bXFlip=false; bYFlip=false;
  113. SetFlip(bX,bY);
  114. }