1. // CSprite class
  2.  
  3. #include "csprite.h"
  4.  
  5. void CSprite::setHome(int tileX, int tileY)
  6. {
  7.      home.x = tileX;
  8.      home.y = tileY;    
  9.  
  10.      setTarget(tileX, tileY);
  11.  
  12.      destTile.x = tileX;
  13.      destTile.y = tileY;
  14. }
  15.  
  16. POINT CSprite::getHome()
  17. {
  18.      return home;
  19. }
  20.  
  21. void CSprite::goHome()
  22. {
  23.      setTarget(home.x, home.y);
  24. }
  25. void CSprite::gotoTile(int tileX, int tileY)
  26. {
  27.      // current window location is {x,y}
  28.      // now we want to move to a tile, in a straight line
  29.      // one tile at a time
  30.      // we'll assume that this is (1) square at a time
  31.      destTile.x = tileX;
  32.      destTile.y = tileY;
  33.  
  34.      POINT destPT = {tileX * TILEWIDTH, tileY * TILEHEIGHT };
  35.  
  36.      if (windowX < destPT.x)
  37.           setFacing(EAST);
  38.      else if (windowX > destPT.x)
  39.           setFacing(WEST);
  40.      else if (windowY > destPT.y)
  41.           setFacing(NORTH);
  42.      else if (windowY < destPT.y)
  43.           setFacing(SOUTH);
  44. }
  45.  
  46. // sets the TILE location ... duh
  47. void CSprite::setTarget(int tileX, int tileY)
  48. {
  49.      targetTile.x = tileX;
  50.      targetTile.y = tileY;
  51. };
  52.  
  53. POINT CSprite::getTarget()
  54. {
  55.      return targetTile;
  56. };
  57. void CSprite::setSpeed(int newSpd)
  58. {
  59.  speed = newSpd;
  60. }
  61.  
  62. int CSprite::nextFrame()
  63. {
  64.      if (++animcount > animdelay)
  65.           animcount=0;
  66.      else
  67.           return 1; // use anim delay to slow down animations
  68.  
  69.      // increments current frame and checks for max
  70.      if (++curframe > lastframe)
  71.      {
  72.           curframe=1;
  73.           return 1;
  74.      }
  75.      else
  76.           return 0;
  77. }
  78. int CSprite::getFrame()
  79. {
  80.      return curframe;
  81. }
  82. void CSprite::setFrame(int newFrame)
  83. {
  84.      curframe=newFrame;
  85. }
  86. void CSprite::setLastFrame(int newLastFrame)
  87. {
  88.      lastframe = newLastFrame;
  89. }
  90. int CSprite::getLastFrame()
  91. {
  92.      return lastframe;
  93. }
  94.  
  95. void CSprite::setDelay(int newDelay)
  96. {
  97.      animdelay = newDelay;
  98. }
  99. int CSprite::getDelay()
  100. {
  101.      return animdelay;
  102. }
  103.  
  104. void CSprite::setupAnim(int numFrames, DIRS newDir, int perRow)
  105. {
  106.      curframe = 1;
  107.      lastframe = numFrames-1;
  108.      frames_per_anim = numFrames;
  109.      facingDir = newDir;
  110.      animdelay = 2;
  111.      animcount = 0;
  112.      columns = perRow; // sprite per row in sprite sheet
  113. }
  114.  
  115. void CSprite::setXY(int newWindowX, int newWindowY)
  116. {
  117.      windowX = newWindowX;
  118.      windowY = newWindowY;
  119. }  
  120.  
  121. void CSprite::setMoveXY(int moveX, int moveY)
  122. {
  123.      movex = moveX;
  124.      movey = moveY;
  125. }
  126.  
  127. int CSprite::getX()
  128. {
  129.      return windowX;
  130. }
  131. int CSprite::getY()
  132. {
  133.      return windowY;
  134. }
  135.  
  136. int CSprite::getMoveY()
  137. {
  138.      return movey;
  139. }
  140. void CSprite::setMoveY(int newY)
  141. {
  142.      movey = newY;
  143. }
  144.  
  145. int CSprite::getMoveX()
  146. {
  147.      return movex;
  148. }
  149. void CSprite::setMoveX(int newX)
  150. {
  151.      movex = newX; 
  152. }
  153.  
  154. void CSprite::setX(int newWindowX)
  155. {
  156.      windowX = newWindowX; 
  157. }
  158. void CSprite::addX(int addtoWindowX)
  159. {
  160.      windowX += addtoWindowX;
  161. }
  162.  
  163. void CSprite::setY(int newWindowY)
  164. {
  165.      windowY = newWindowY; 
  166. }
  167. void CSprite::addY(int addtoWindowY)
  168. {
  169.      windowY += addtoWindowY;
  170. }
  171.  
  172. int CSprite::getHeight()
  173. {
  174.      return height;
  175. }
  176. int CSprite::getWidth()
  177. {
  178.      return width; 
  179. }
  180.  
  181. void CSprite::doMove()
  182. {
  183.      //move the sprite
  184.      windowX += movex;
  185.      windowY += movey;
  186. }
  187.  
  188. LPDIRECT3DTEXTURE9 CSprite::getImage()
  189. {
  190.      return _image;
  191. }
  192.  
  193. // returns a rect pointing to the sprites frame
  194. RECT CSprite::getRect()
  195. {
  196.      /*
  197.      EAST        = 1,
  198.      NORTH  = 2,
  199.      SOUTH  = 3,
  200.      WEST        = 4       
  201.      */
  202.  
  203.      // offset starting location based on direction sprite is facing
  204.      int offset = (facingDir-1) * frames_per_anim; //
  205.  
  206.      RECT srcRect;
  207.  
  208.      // will return the RECT point to current sprite, within sprite sheet      
  209.      srcRect.left   = ((curframe+offset) % columns) * width;
  210.      srcRect.top    = ((curframe+offset) / columns) * height;
  211.      srcRect.right  = srcRect.left + width;
  212.      srcRect.bottom = srcRect.top  + height;
  213.  
  214.      return srcRect;
  215. }
  216.  
  217. DIRS CSprite::getFacing()
  218. {
  219.      return facingDir;
  220. }
  221.  
  222. void CSprite::setFacing(DIRS newFacing)
  223. {
  224.      facingDir = newFacing;
  225.  
  226.      switch(newFacing)
  227.      {
  228.      case  NORTH:   movey= -speed;  break;  // NORTH
  229.      case  SOUTH:   movey=  speed;  break;  // SOUTH
  230.      case  EAST:    movex=  speed;  break;  // EAST
  231.      case  WEST:    movex= -speed;  break;  // WEST
  232.      };
  233. }
  234.  
  235. bool CSprite::atDest()
  236. {
  237.      return ((windowX == targetTile.x * TILEWIDTH) && (windowY == targetTile.y * TILEHEIGHT));
  238. }
  239.  
  240. POINT CSprite::getTile()
  241. {
  242.      POINT temp = { windowX / TILEWIDTH, windowY / TILEHEIGHT };
  243.  
  244.      return temp;
  245. }
  246.  
  247. // returns true if not 100% in a tile
  248. bool CSprite::isBetweenTiles()
  249. {
  250.      POINT offset = {windowX % TILEWIDTH, windowY % TILEHEIGHT };    
  251.  
  252.      // true if not in a tile
  253.      return (! (offset.x == 0 && offset.y == 0) );
  254. }
  255.  
  256. bool CSprite::isMoving()
  257. {
  258.      return moving;
  259. }
  260.  
  261. void CSprite::setMoving(bool newState)
  262. {
  263.      moving = newState;
  264. }
  265.  
  266. void CSprite::setTileXY(int tileX, int tileY)
  267. {
  268.      windowX = tileX * 32;
  269.      windowY = tileY * 32;
  270. }
  271.  
  272. // returns a rectangle in window coordinates, of sprites current location
  273. RECT CSprite::getWindowRect()
  274. {
  275.      RECT r1;
  276.      r1.left   = windowX;
  277.      r1.right  = r1.left + width -1;
  278.      r1.top    = windowY;
  279.      r1.bottom = r1.top + height -1 ;
  280.  
  281.      return r1;
  282. }
  283.  
  284. POINT CSprite::getWindowPT()
  285. {
  286.      POINT tPT;
  287.      tPT.x = windowX;
  288.      tPT.y = windowY;
  289.  
  290.      return tPT;
  291. }
  292.  
  293. void CSprite::setNewDIR(int newDir)
  294. {
  295.      switch(newDir)
  296.      {
  297.      case  1: movey=-speed; facingDir = NORTH;  break;  // NORTH
  298.      case  2: movey= speed; facingDir = SOUTH;  break;  // SOUTH
  299.      case  3: movex= speed; facingDir = EAST;   break;  // EAST
  300.      case  4: movex=-speed; facingDir = WEST;   break;  // WEST
  301.      };
  302. }
  303.  
  304. // sets new state for object
  305. void CSprite::setSTATE(STATEtype newS)
  306. {
  307.      STATE = newS;
  308.      if (newS == DEAD)
  309.           facingDir = DYING;
  310. }
  311.  
  312. // returns the current State of object
  313. int CSprite::getSTATE()
  314. {
  315.      return STATE;
  316. }
  317.  
  318. // constructor for new sprites ... curFrame will always be (1) .. scale and rotation not currently implemented
  319. // and this is for non-animated sprites
  320. CSprite::CSprite(int X, int Y, int Width, int Height, char *Filename)
  321. {
  322.      windowX = X;
  323.      windowY = Y;
  324.      width = Width;
  325.      height = Height;
  326.  
  327.      // initialize these, but not currently in use since this is non-animated sprite
  328.      curframe = lastframe = 1;
  329.      animdelay = 3;
  330.      animcount = 0;
  331.      movex = movey = 0;
  332.      facingDir = WEST; // default
  333.  
  334.      curframe = 0;
  335.      lastframe = 0;
  336.      frames_per_anim = 1;
  337.      columns = 0;
  338.  
  339.      speed = 2;
  340.  
  341.      // Load the sprite file
  342.      LoadImage(Filename);      
  343. }
  344.  
  345. // destructor -- the default one should release all memory allocated for this sprite
  346. CSprite::~CSprite(void)
  347. {
  348.      // release the sprite sheet
  349.      _image->Release();
  350. }
  351.  
  352.  
  353. void CSprite::LoadImage(char *Filename)
  354. {
  355.      _image = LoadTexture(Filename, D3DCOLOR_XRGB(255,0,255));
  356.      assert(_image);        
  357. }
  358.  
  359. void CSprite::setHasBody(bool newVal)
  360. {
  361.      hasBody = newVal;    
  362. };
  363.  
  364. bool CSprite::getHasBody()
  365. {
  366.      return hasBody;
  367. }