分享一个unity3d子弹飞行拖尾的效果,详细制作教程,在游戏开发中,有时会需要在某个游戏对象上的运动轨迹上实现渐隐效果。就好像子弹的运动轨迹,如果不借助引擎的帮助,那么这样的效果就需要通过大量的图片来实现。而Cocos2D-x的拖动渐隐效果类CCMotionStreak就帮助我们实现这个效果。下面是子弹飞行火焰拖尾的效果实现。


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