PolyScreenSprite.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * PolyScreenSprite.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 9/13/09.
  6. * Copyright 2009 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyScreenSprite.h"
  10. using namespace Polycode;
  11. ScreenSprite::ScreenSprite(String fileName, float spriteWidth, float spriteHeight) : ScreenShape(ScreenShape::SHAPE_RECT, spriteWidth, spriteHeight) {
  12. this->spriteWidth = spriteWidth;
  13. this->spriteHeight = spriteHeight;
  14. loadTexture(fileName);
  15. spriteUVWidth = 1.0f / ((float) texture->getWidth() / spriteWidth);
  16. spriteUVHeight = 1.0f / ((float) texture->getHeight() / spriteHeight);
  17. currentFrame = 0;
  18. currentAnimation = NULL;
  19. }
  20. ScreenSprite::~ScreenSprite() {
  21. }
  22. void ScreenSprite::addAnimation(String name, String frames, float speed) {
  23. SpriteAnimation *newAnimation = new SpriteAnimation();
  24. vector<String> frameNumbers = frames.split(",");
  25. int numFramesX = texture->getWidth() / spriteWidth;
  26. int numFramesY = texture->getHeight() / spriteHeight;
  27. int frameNumber;
  28. int frameX;
  29. int frameY;
  30. for(int i=0; i < frameNumbers.size(); i++) {
  31. frameNumber = atoi(frameNumbers[i].c_str());
  32. frameX = frameNumber % numFramesX;
  33. frameY = frameNumber/numFramesX;
  34. newAnimation->framesOffsets.push_back(Vector2(spriteUVWidth * frameX, spriteUVHeight * frameY));
  35. }
  36. newAnimation->speed = speed;
  37. newAnimation->name = name;
  38. newAnimation->numFrames = frameNumbers.size();
  39. animations.push_back(newAnimation);
  40. }
  41. void ScreenSprite::playAnimation(String name, int startFrame, bool once) {
  42. for(int i=0; i < animations.size(); i++) {
  43. if(animations[i]->name == name) {
  44. currentAnimation = animations[i];
  45. currentFrame = 0;
  46. if(currentFrame < currentAnimation->numFrames)
  47. currentFrame = startFrame;
  48. playingOnce = once;
  49. lastTick = 0;
  50. }
  51. }
  52. }
  53. void ScreenSprite::Update() {
  54. if(!currentAnimation)
  55. return;
  56. float newTick = CoreServices::getInstance()->getCore()->getTicksFloat();
  57. float elapsed = newTick - lastTick;
  58. if(elapsed > currentAnimation->speed) {
  59. currentFrame++;
  60. if(currentFrame >= currentAnimation->numFrames) {
  61. if(playingOnce)
  62. return;
  63. else
  64. currentFrame = 0;
  65. }
  66. float xOffset = currentAnimation->framesOffsets[currentFrame].x;
  67. float yOffset = 1.0f - currentAnimation->framesOffsets[currentFrame].y - spriteUVHeight;
  68. Polygon *imagePolygon = mesh->getPolygon(0);
  69. imagePolygon->getVertex(0)->setTexCoord(xOffset, yOffset+spriteUVHeight);
  70. imagePolygon->getVertex(1)->setTexCoord(xOffset+spriteUVWidth, yOffset+spriteUVHeight);
  71. imagePolygon->getVertex(2)->setTexCoord(xOffset+spriteUVWidth, yOffset);
  72. imagePolygon->getVertex(3)->setTexCoord(xOffset, yOffset);
  73. mesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  74. lastTick = newTick;
  75. }
  76. }