雷电游戏相信很多朋友都玩过,本文就是要实现雷电游戏中,游戏从一开始,英雄飞机就无限发射子弹的功能,让你的战斗暴爽。这里的思想是单独给子弹弄一个层,在这个层不设置一个定时器,每隔一个时间,根据当前英雄飞机传入的位置,生成子弹,并设置子弹的移动事件,和移动后的事件(就是把子弹删除掉,节省内存)。

最终效果:

1426472168581672.gif

Cocos2d-x版本:3.4

工程环境:VS30213


一、英雄子弹层

1、HeroBulletLayer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/** 
*功能 创建子弹并初始化子弹的运动 
*作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka) 
*时间 2015.3.14 
*/  
#include "cocos2d.h"  
USING_NS_CC;  
const float FlYVElOCITY = 500;//运行速度,可以自己控制,每秒所走的像素  
class HeroBulletLayer : public cocos2d::Layer  
{  
public:  
    HeroBulletLayer(Node* heroPlane);  
    ~HeroBulletLayer();  
    virtual bool init();  
   
    //根据英雄飞机创建子弹  
    static HeroBulletLayer* create(Node* heroPlane);  
   
    //移除超出屏幕可视范围的子弹或者碰撞后的子弹清除  
    void removeBullet(Node* pNode);  
   
    //发射子弹,在其中进行子弹的渲染和子弹的飞行动作,默认为单子弹  
    void ShootBullet(float dt);  
   
    //返回子弹列表  
    Vector <Sprite *>& GetBullet();  
public:  
    Vector <Sprite *>vecBullet;//子弹容器  
    SpriteBatchNode* bulletBatchNode;//批次渲染节点  
    Node* heroPlane;//传入的英雄飞机  
};

2、HeroBulletLayer.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/** 
*功能 创建子弹并初始化子弹的运动 
*作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka) 
*时间 2015.3.14 
*/  
#include "HeroBulletLayer.h"  
HeroBulletLayer::HeroBulletLayer(Node* heroPlane) {  
    this->heroPlane = heroPlane;  
}  
HeroBulletLayer::~HeroBulletLayer() {  
}  
/** 
*创建子弹的静态方法 
*@param heroPlane为英雄飞机 
*/  
HeroBulletLayer* HeroBulletLayer::create(Node* heroPlane){  
    HeroBulletLayer* pRet = new HeroBulletLayer(heroPlane);  
    if (pRet&&pRet->init()){  
        pRet->autorelease();  
        return pRet;  
    }  
    else{  
        delete pRet;  
        pRet = NULL;  
        return NULL;  
    }  
   
}  
bool HeroBulletLayer::init() {  
    bool bRet = false;  
    do {  
        CC_BREAK_IF(!Layer::init());  
   
        //创建BatchNode节点  
        bulletBatchNode = SpriteBatchNode::create("bullet1.png");  
        this->addChild(bulletBatchNode);  
   
        //每隔0.2S调用一次发射子弹函数  
        this->schedule(schedule_selector(HeroBulletLayer::ShootBullet), 0.2f);  
        bRet = true;  
    } while (0);  
    return bRet;  
}  
/** 
*用缓存的方法创建子弹,并初始化子弹的运动和运动后的事件 
*/  
void HeroBulletLayer::ShootBullet(float dt) {  
    Size winSize = Director::getInstance()->getWinSize();  
    auto PlanePos = heroPlane->getPosition();  
    //从缓存中创建子弹  
    auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture());  
    //将创建好的子弹添加到BatchNode中进行批次渲染  
    bulletBatchNode->addChild(spritebullet);  
    //将创建好的子弹添加到容器  
    vecBullet.pushBack(spritebullet);  
   
    Point bulletPos = (Point(PlanePos.x,  
        PlanePos.y + heroPlane->getContentSize().height / 2 + 20));  
    spritebullet->setPosition(bulletPos);  
    spritebullet->setScale(0.8f);  
   
   
    float flyLen = winSize.height - PlanePos.y;  
    float realFlyDuration = flyLen / FlYVElOCITY;//实际飞行的时间  
   
    //子弹运行的距离和时间,从飞机处开始运行到屏幕顶端  
    auto actionMove = MoveTo::create(realFlyDuration,  
        Point(bulletPos.x, winSize.height));  
   
    //子弹执行完动作后进行函数回调,调用移除子弹函数  
    auto actionDone = CallFuncN::create(  
        CC_CALLBACK_1(HeroBulletLayer::removeBullet, this));  
   
    //子弹开始跑动  
    Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);  
    spritebullet->runAction(sequence);  
   
   
}  
   
/** 
 * 移除子弹,将子弹从容器中移除,同时也从SpriteBatchNode中移除 
 */  
0