最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity3d子弹飞行拖尾
在游戏开发中,有时需要为某个游戏对象的运动轨迹添加渐隐效果,例如子弹的飞行轨迹。若不借助引擎的特定功能,实现这样的效果可能需要大量的图片。而在 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;
}
此函数用于创建一个包含 HelloWorld 层的场景。
初始化函数
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;
}
在初始化函数中,首先检查 CCLayer 是否初始化成功,然后获取窗口大小并创建背景层。接着创建两个数组分别用于存储子弹节点和 CCMotionStreak 对象,并对数组进行安全引用计数操作。最后调度 update 函数。
更新函数
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;
}
}
}
update 函数在每一帧被调用。第一个循环用于更新子弹和拖尾的位置,将子弹的 y 坐标增加 2,并将拖尾的位置设置为子弹的位置。第二个循环用于检查子弹是否超出屏幕,如果超出则删除子弹和对应的拖尾对象。
创建子弹和拖尾对象函数
// 创建 子弹节点 和 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);
}
该函数用于创建子弹和对应的拖尾对象。根据传入的起始点位置创建子弹精灵,并将其添加到层中。同时创建 CCMotionStreak 对象,设置其参数并添加到层中。
触摸事件处理函数
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) {}
ccTouchBegan 函数在触摸开始时被调用,根据触摸位置创建子弹和拖尾对象。ccTouchMoved 和 ccTouchEnded 函数为空,这里不做处理。
进入和退出场景函数
void HelloWorld::onEnter() {
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
CCLayer::onEnter();
}
void HelloWorld::onExit() {
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}
onEnter 函数在进入场景时添加触摸事件代理,onExit 函数在退出场景时移除触摸事件代理。
析构函数
HelloWorld::~HelloWorld() {
CC_SAFE_RELEASE(bulltArr);
CC_SAFE_RELEASE(streakArr);
}
析构函数用于安全释放存储子弹节点和拖尾对象的数组。
通过以上代码,我们可以在 Cocos2D - x 中实现子弹飞行的拖尾效果。当用户触摸屏幕时,会在触摸位置创建子弹和对应的拖尾对象,子弹向上飞行并留下渐隐的拖尾效果,超出屏幕的子弹和拖尾会被自动删除。