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

感谢点评与关注,欢迎转载与分享。
勤奋努力,持之以恒!

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

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    HelloWorld *layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }
    size = CCDirector::sharedDirector()->getWinSize();
    
    CCLayerColor* background = CCLayerColor::create(ccc4(255, 200, 255, 255), size.width, size.height);
    this->addChild(background);
    
    //存储子弹节点
    bulltArr = CCArray::create();
    CC_SAFE_RETAIN(bulltArr);
    //存储 CCMotionStreak
    streakArr = CCArray::create();
    CC_SAFE_RETAIN(streakArr);
    
    scheduleUpdate();
    
    return true;
}

void HelloWorld::update(float delta)
{
    for (int i = 0; i < bulltArr->count(); i++) {
        CCSprite* bullt = (CCSprite*)bulltArr->objectAtIndex(i);
        bullt->setPositionY(bullt->getPositionY()+2);
        
        CCMotionStreak* streak = (CCMotionStreak*)streakArr->objectAtIndex(i);
        //每次调用setPosition函数重新设置对象位置时,“影子”将被创建并且慢慢渐隐  注:对于CCMotionStreak对象不可用getPosition()等方法。。
        streak->setPosition(bullt->getPosition());
    }
    
    for (int i = 0; i < bulltArr->count(); i++) {
        CCSprite* bullt = (CCSprite*)bulltArr->objectAtIndex(i);
        //删除超出屏幕节点
        if (bullt->getPositionY() >= size.height+bullt->getContentSize().height) {
            this->removeChild(bullt);
            bulltArr->removeObject(bullt);
            
            CCSprite* streak = (CCSprite*)streakArr->objectAtIndex(i);
            this->removeChild(streak);
            streakArr->removeObject(streak);
            
            break;
        }
    }
}

//拖尾效果类CCMotionStreak
//创建 子弹节点 和 CCMotionStreak对象
void HelloWorld::createBullt(CCPoint startPoint)
{
    CCSprite* bullt = CCSprite::create("bullet3.png");
    bullt->setPosition(startPoint);
    this->addChild(bullt,2);
    bulltArr->addObject(bullt);
    
    //第一个参数是间隐的时间,第二个参数是间隐片断的大小,第三个参数是贴图的宽高,第四个参数是颜色值RGB,第五个参数是贴图的路径或者贴图对象
    CCMotionStreak* streak = CCMotionStreak::create(0.8, 10, 10, ccRED, "bullet3.png");
    streak->setPosition(startPoint);
    this->addChild(streak,1);
    streakArr->addObject(streak);
}

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    createBullt(pTouch->getLocation());
    return true;
}

void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){}
void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){}
void HelloWorld::onEnter()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
    CCLayer::onEnter();
}
void HelloWorld::onExit()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCLayer::onExit();
}

HelloWorld::~HelloWorld()
{
    CC_SAFE_RELEASE(bulltArr);
    CC_SAFE_RELEASE(streakArr);
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值