SpriteSample.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #include "SpriteSample.h"
  2. #include "SamplesGame.h"
  3. #if defined(ADD_SAMPLE)
  4. ADD_SAMPLE("Graphics", "Sprite", SpriteSample, 6);
  5. #endif
  6. SpriteSample::SpriteSample()
  7. : _font(NULL), _scene(NULL), _cameraNode(NULL),
  8. _playerSprite(NULL), _playerNode(NULL), _playerAnimation(NULL), _playerMovement(0)
  9. {
  10. }
  11. void SpriteSample::initialize()
  12. {
  13. // Create the font for drawing the framerate.
  14. _font = Font::create("res/ui/arial.gpb");
  15. // Load sprite scene
  16. _scene = Scene::load("res/common/sprites/sprite.scene");
  17. _cameraNode = _scene->findNode("camera");
  18. // Setup the player
  19. _playerNode = _scene->findNode("player");
  20. _playerSprite = dynamic_cast<Sprite*>(_playerNode->getDrawable());
  21. // Idle [0] - Set at load time
  22. // Walk [1 - 11]
  23. _playerSprite->setFrameSource(1, Rectangle( 0, 0, 72, 92));
  24. _playerSprite->setFrameSource(2, Rectangle(73, 0, 72, 97));
  25. _playerSprite->setFrameSource(3, Rectangle(146, 0, 72, 97));
  26. _playerSprite->setFrameSource(4, Rectangle(0, 98, 72, 97));
  27. _playerSprite->setFrameSource(5, Rectangle(73, 98, 72, 97));
  28. _playerSprite->setFrameSource(6, Rectangle(146, 98, 72, 97));
  29. _playerSprite->setFrameSource(7, Rectangle(219, 0, 72, 97));
  30. _playerSprite->setFrameSource(8, Rectangle(292, 0, 72, 97));
  31. _playerSprite->setFrameSource(9, Rectangle(219, 98, 72, 97));
  32. _playerSprite->setFrameSource(10, Rectangle(365, 0, 72, 97));
  33. _playerSprite->setFrameSource(11, Rectangle(292, 98, 72, 97));
  34. // Jump[12]
  35. _playerSprite->setFrameSource(12, Rectangle(438, 93, 67, 94));
  36. // The player animation clips
  37. unsigned int keyTimes[4] = {0, 1, 11, 12};
  38. float keyValues[4] = { 0, 1, 11, 12 };
  39. _playerAnimation = _playerSprite->createAnimation("player-animations", Sprite::ANIMATE_KEYFRAME, 4, keyTimes, keyValues, Curve::LINEAR);
  40. _playerAnimation->createClip("idle", 0, 0);
  41. _playerAnimation->createClip("walk", 1, 11)->setRepeatCount(AnimationClip::REPEAT_INDEFINITE);
  42. // Set the speed to 24 FPS
  43. _playerAnimation->getClip("walk")->setSpeed(24.0f/1000.0f);
  44. _playerAnimation->play("idle");
  45. // Setup player text
  46. Node* playerTextNode = _scene->findNode("text");
  47. playerTextNode->addRef();
  48. _scene->removeNode(playerTextNode); //XXX This is because SceneLoader doesn't support loading child nodes for other nodes
  49. _playerNode->addChild(playerTextNode);
  50. playerTextNode->translateY(_playerSprite->getHeight());
  51. Text* playerText = dynamic_cast<Text*>(playerTextNode->getDrawable());
  52. playerText->setJustify(Font::ALIGN_TOP_HCENTER);
  53. playerText->setWidth(_playerSprite->getWidth());
  54. SAFE_RELEASE(playerTextNode);
  55. // Custom Effect in sprite
  56. Effect* waterEffect = Effect::createFromFile("res/shaders/sprite.vert", "res/common/sprites/water2d.frag");
  57. Sprite* waterSprite = Sprite::create("res/common/sprites/water2d.png", getWidth() * 5, getHeight() / 3, waterEffect);
  58. SAFE_RELEASE(waterEffect);
  59. waterSprite->setAnchor(Vector2::zero());
  60. waterSprite->setOpacity(0.5f);
  61. _scene->findNode("water")->setDrawable(waterSprite);
  62. Material* waterMaterial = waterSprite->getMaterial();
  63. SAFE_RELEASE(waterSprite);
  64. Texture::Sampler* noiseSampler = Texture::Sampler::create("res/common/sprites/water2d-noise.png");
  65. waterMaterial->getParameter("u_texture_noise")->setValue(noiseSampler);
  66. SAFE_RELEASE(noiseSampler);
  67. waterMaterial->getParameter("u_time")->bindValue(this, &SpriteSample::getTime);
  68. }
  69. void SpriteSample::finalize()
  70. {
  71. SAFE_RELEASE(_scene);
  72. SAFE_RELEASE(_font);
  73. }
  74. void SpriteSample::update(float elapsedTime)
  75. {
  76. if ((_playerMovement & WALK_FORWARD) == WALK_FORWARD)
  77. {
  78. float moveX = 0.25 * elapsedTime;
  79. _cameraNode->translateX(moveX);
  80. _playerSprite->setFlip(Sprite::FLIP_NONE);
  81. _playerNode->translateX(moveX);
  82. if (!_playerAnimation->getClip("walk")->isPlaying())
  83. {
  84. _playerAnimation->stop("idle");
  85. _playerAnimation->play("walk");
  86. }
  87. }
  88. else if ((_playerMovement & WALK_BACKWARD) == WALK_BACKWARD)
  89. {
  90. float moveX = -0.25 * elapsedTime;
  91. _cameraNode->translateX(moveX);
  92. _playerSprite->setFlip(Sprite::FLIP_HORIZONTAL);
  93. _playerNode->translateX(moveX);
  94. if (!_playerAnimation->getClip("walk")->isPlaying())
  95. {
  96. _playerAnimation->stop("idle");
  97. _playerAnimation->play("walk");
  98. }
  99. }
  100. else
  101. {
  102. // IDLE
  103. if (!_playerAnimation->getClip("idle")->isPlaying())
  104. {
  105. _playerAnimation->stop("walk");
  106. _playerAnimation->play("idle");
  107. }
  108. }
  109. }
  110. void SpriteSample::render(float elapsedTime)
  111. {
  112. // Clear the color and depth buffers
  113. clear(CLEAR_COLOR_DEPTH, Vector4::zero(), 1.0f, 0);
  114. // Visit all the nodes in the scene, drawing the sprites
  115. _scene->visit(this, &SpriteSample::drawScene);
  116. drawFrameRate(_font, Vector4(0, 0.5f, 1, 1), 5, 1, getFrameRate());
  117. }
  118. void SpriteSample::keyEvent(Keyboard::KeyEvent evt, int key)
  119. {
  120. if (evt == Keyboard::KEY_PRESS)
  121. {
  122. switch (key)
  123. {
  124. case Keyboard::KEY_A:
  125. _playerMovement |= WALK_BACKWARD;
  126. break;
  127. case Keyboard::KEY_D:
  128. _playerMovement |= WALK_FORWARD;
  129. break;
  130. case Keyboard::KEY_C:
  131. Node* clone = _playerNode->clone();
  132. _scene->addNode(clone);
  133. clone->translateZ(-1);
  134. break;
  135. }
  136. }
  137. else if (evt == Keyboard::KEY_RELEASE)
  138. {
  139. switch (key)
  140. {
  141. case Keyboard::KEY_A:
  142. _playerMovement &= ~WALK_BACKWARD;
  143. break;
  144. case Keyboard::KEY_D:
  145. _playerMovement &= ~WALK_FORWARD;
  146. break;
  147. }
  148. }
  149. }
  150. void SpriteSample::touchEvent(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex)
  151. {
  152. switch (evt)
  153. {
  154. case Touch::TOUCH_PRESS:
  155. if (x < 75 && y < 50)
  156. {
  157. // Toggle Vsync if the user touches the top left corner
  158. setVsync(!isVsync());
  159. return;
  160. }
  161. break;
  162. case Touch::TOUCH_RELEASE:
  163. break;
  164. case Touch::TOUCH_MOVE:
  165. break;
  166. };
  167. }
  168. bool SpriteSample::drawScene(Node* node)
  169. {
  170. Drawable* drawable = node->getDrawable();
  171. if (drawable)
  172. drawable->draw();
  173. return true;
  174. }
  175. float SpriteSample::getTime() const
  176. {
  177. float angle = Game::getGameTime() * 0.001 * MATH_PIX2;
  178. if (angle > MATH_PIX2)
  179. angle -= MATH_PIX2;
  180. return angle;
  181. }