cocos2dx 以子弹飞行为例解说拖尾效果类CCMotionStreak

时间:2022-01-28 00:27:50

在游戏开发中,有时会须要在某个游戏对象上的运动轨迹上实现渐隐效果。比方子弹的运动轨迹,假设不借助引擎的帮助,这样的效果则须要通过大量的图片来实现。而Cocos2D-x的拖动渐隐效果类CCMotionStreak就帮助我们实现这个效果。以下是子弹飞行火焰拖尾的效果实现。。

  1. #include "HelloWorldScene.h"
  2. #include "SimpleAudioEngine.h"
  3. using namespace cocos2d;
  4. using namespace CocosDenshion;
  5. CCScene* HelloWorld::scene()
  6. {
  7. CCScene *scene = CCScene::create();
  8. HelloWorld *layer = HelloWorld::create();
  9. scene->addChild(layer);
  10. return scene;
  11. }
  12. bool HelloWorld::init()
  13. {
  14. if ( !CCLayer::init() )
  15. {
  16. return false;
  17. }
  18. size = CCDirector::sharedDirector()->getWinSize();
  19. CCLayerColor* background = CCLayerColor::create(ccc4(255, 200, 255, 255), size.width, size.height);
  20. this->addChild(background);
  21. //存储子弹节点
  22. bulltArr = CCArray::create();
  23. CC_SAFE_RETAIN(bulltArr);
  24. //存储 CCMotionStreak
  25. streakArr = CCArray::create();
  26. CC_SAFE_RETAIN(streakArr);
  27. scheduleUpdate();
  28. return true;
  29. }
  30. void HelloWorld::update(float delta)
  31. {
  32. for (int i = 0; i < bulltArr->count(); i++) {
  33. CCSprite* bullt = (CCSprite*)bulltArr->objectAtIndex(i);
  34. bullt->setPositionY(bullt->getPositionY()+2);
  35. CCMotionStreak* streak = (CCMotionStreak*)streakArr->objectAtIndex(i);
  36. //每次调用setPosition函数又一次设置对象位置时,“影子”将被创建而且慢慢渐隐  注:对于CCMotionStreak对象不可用getPosition()等方法。。
  37. streak->setPosition(bullt->getPosition());
  38. }
  39. for (int i = 0; i < bulltArr->count(); i++) {
  40. CCSprite* bullt = (CCSprite*)bulltArr->objectAtIndex(i);
  41. //删除超出屏幕节点
  42. if (bullt->getPositionY() >= size.height+bullt->getContentSize().height) {
  43. this->removeChild(bullt);
  44. bulltArr->removeObject(bullt);
  45. CCSprite* streak = (CCSprite*)streakArr->objectAtIndex(i);
  46. this->removeChild(streak);
  47. streakArr->removeObject(streak);
  48. break;
  49. }
  50. }
  51. }
  52. //拖尾效果类CCMotionStreak
  53. //创建 子弹节点 和 CCMotionStreak对象
  54. void HelloWorld::createBullt(CCPoint startPoint)
  55. {
  56. CCSprite* bullt = CCSprite::create("bullet3.png");
  57. bullt->setPosition(startPoint);
  58. this->addChild(bullt,2);
  59. bulltArr->addObject(bullt);
  60. //第一个參数是间隐的时间,第二个參数是间隐片断的大小,第三个參数是贴图的宽高,第四个參数是颜色值RGB,第五个參数是贴图的路径或者贴图对象
  61. CCMotionStreak* streak = CCMotionStreak::create(0.8, 10, 10, ccRED, "bullet3.png");
  62. streak->setPosition(startPoint);
  63. this->addChild(streak,1);
  64. streakArr->addObject(streak);
  65. }
  66. bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
  67. {
  68. createBullt(pTouch->getLocation());
  69. return true;
  70. }
  71. void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){}
  72. void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){}
  73. void HelloWorld::onEnter()
  74. {
  75. CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
  76. CCLayer::onEnter();
  77. }
  78. void HelloWorld::onExit()
  79. {
  80. CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
  81. CCLayer::onExit();
  82. }
  83. HelloWorld::~HelloWorld()
  84. {
  85. CC_SAFE_RELEASE(bulltArr);
  86. CC_SAFE_RELEASE(streakArr);
  87. }

cocos2dx 以子弹飞行为例解说拖尾效果类CCMotionStreak

很多其它0