1 bool HelloWorld::init()
2 {
3     if ( !Layer::init() )
4     {
5         return false;
6     }
7  
8     Size visibleSize = Director::getInstance()->getVisibleSize();
9  
10     //创建一个精灵用来执行贝塞尔曲线
11     auto sprite = Sprite::create("sprite.png");
12     sprite->setPosition(Point(visibleSize.width/2,visibleSize.height/3));
13     this->addChild(sprite);
14  
15     //贝塞尔曲线一共有四个点组成,开始点,结束点,以及俩个控制点,开始点和结束点顾名思义就是精灵开始动作的
16     //位置和结束动作的位置,而这俩个控制点可以控制曲线的形状,ccBezierConfig保存的就是这些配置信息
17     ccBezierConfig bezier;
18     bezier.controlPoint_1 = CCPoint(200,0);
19     bezier.controlPoint_2 = CCPoint(200,200);
20     bezier.endPosition = CCPoint(0,200);
21     //BezierBy动作和BezierTo动作的区别就是By所使用的坐标都是相对坐标,上边的配置信息中没有起始点,这是因为精灵
22     //的当前位置就是起始点,并且这个点的坐标在By看来就是0,0,,其他的坐标点是相对于这个0,0点的坐标位置,例如第一
23     //个控制点的坐标是200,0,这个坐标不是实际中的200,0,而是相对于精灵的起始坐标x方向增大200个单位
24     auto action = BezierBy::create(2.0f,bezier);
25     //To所使用的坐标就是绝对坐标了,例如第一个控制点的坐标是200,0,那么它就是位于屏幕上的200,0这个坐标,最后
26     //结束点的0,200也说明精灵最后移动到的点是200,0这个点
27     auto action2 = BezierTo::create(2.0f,bezier);
28     sprite->runAction(action2);
29  
30     return true;
31 }

有了上边贝塞尔曲线的知识,下面我们就来添加一下UFO吧,仍然新建一个类用来表示UFO,代码如下。

1 #ifndef _UFO_H_
2 #define _UFO_H_
3 #include "cocos2d.h"
4  
5 USING_NS_CC;
6  
7 //ufo和炸弹类,继承自sprite
8 class Ufo : public Sprite
9 {
10 public:
11     Ufo(void);
12     ~Ufo(void);
13 public:
14     bool init();
15     CREATE_FUNC(Ufo);
16 public:
17     //根据不同的纹理初始化不同的ufo和炸弹
18     void initUfo(std::string name);
19     int getRandomNumber(int start,int end);
20 };
21  
22 #endif
1 #include "Ufo.h"
2  
3 Ufo::Ufo(void)
4 {
5 }
6  
7 Ufo::~Ufo(void)
8 {
9 }
10  
11 bool Ufo::init()
12 {
13     if(!Sprite::init())
14         return false;
15  
16     return true;
17 }
18  
19 void Ufo::initUfo(std::string name)
20 {
21     this->initWithSpriteFrameName(name);
22  
23     //获得坐标
24     auto size = Director::getInstance()->getWinSize();
25     auto contentSize = this->getContentSize();
26     //横纵坐标按照以下的方法设置
27     auto point = Point(getRandomNumber(contentSize.width/2,
28         size.width-this->getContentSize().width/2),
29         size.height);
30     this->setPosition(point);
31  
32     //设置一个曲线动作让ufo来执行
33     ccBezierConfig bezier;
34     //贝塞尔曲线的俩个控制点都在屏幕内
35     bezier.controlPoint_1 = Point(getRandomNumber(contentSize.width/2,
36         size.width-contentSize.width/2),
37         getRandomNumber(contentSize.height/2,size.height-contentSize.height/2));
38     bezier.controlPoint_2 = Point(getRandomNumber(contentSize.width/2,
39         size.width-contentSize.width/2),
40         getRandomNumber(contentSize.height/2,size.height-contentSize.height/2));
41     //贝塞尔曲线的结束点是屏幕的下边,这样UFO就相当于飞走了
42     bezier.endPosition = Point(getRandomNumber(contentSize.width/2,
43         size.width-contentSize.width/2),-contentSize.height);
44  
45     //使用BezierTo动作,因为上边的控制点配置信息使用的都是绝对坐标点
46     auto bezierAction = BezierTo::create(2.0f,bezier);
47     //移除自己
48     auto removeAction = RemoveSelf::create();
49     auto action = Sequence::create(bezierAction,removeAction,NULL);
50     //执行上边的动作
51     this->runAction(action);
52 }
53  
54 //如果要获得a~b之间的一个随机数,则应该是CCRANDOM_0_1*(b-a)+a,传入的参数就是a和b
55 int Ufo::getRandomNumber(int start,int end)
56 {
57     return CCRANDOM_0_1()*(end-start)+start;
58 }

我们创建了一个UFO类,并且让UFO的出现位置是随机的,UFO出现了以后开始执行贝塞尔曲线运动,最后移动出屏幕并且从父节点中移除。下面需要在主场景中添加一下UFO。

1 //场景切换完毕调用
2 void MainGame::onEnterTransitionDidFinish()
3 {
4     //必须先调用父类的函数
5     Layer::onEnterTransitionDidFinish();
6     //添加敌机,每秒添加一个
7     this->schedule(SEL_SCHEDULE(&MainGame::addEnemy),1.0f);
8     //添加子弹
9     this->schedule(SEL_SCHEDULE(&MainGame::addBullet),0.08f);
10     //添加UFO和炸弹
11     this->schedule(SEL_SCHEDULE(&MainGame::addUfo),1.0f);
12     //碰撞检测
13     this->schedule(SEL_SCHEDULE(&MainGame::isHitEnemy));
14 }
15  
16 //添加UFO和炸弹
17 void MainGame::addUfo(float tm)
18 {
19     auto ufo = Ufo::create();
20     int num = CCRANDOM_0_1()*3+1;
21     //在不同的概率下添加不同的物品
22     if(num == 1)
23     {
24         ufo->initUfo("ufo1.png");
25     }
26     else if(num == 2)
27     {
28         ufo->initUfo("ufo2.png");
29     }
30     else
31     {
32         ufo->initUfo("bomb.png");
33     }
34     this->addChild(ufo);
35 }