使用3.0实现微信打飞机——7.贝塞尔曲线和添加UFO
2014-08-21 15:29
417 查看
本篇博客为我们的飞机大战来添加UFO和炸弹,UFO和炸弹的运动轨迹是不确定的,而且是曲线运动,这样的话就得使用贝塞尔曲线运动了。所以我们先来看下如何使用贝塞尔曲线。贝塞尔曲线一共有四个点组成,开始点,结束点,以及俩个控制点,开始点和结束点顾名思义就是精灵开始动作的位置和结束动作的位置,而这俩个控制点可以控制曲线的形状,ccBezierConfig变量中保存的就是这些配置信息,然后我们可以有BezierTo和BezierBy动作,BezierBy动作和BezierTo动作的区别就是By所使用的坐标都是相对坐标,配置信息中没有起始点,这是因为精灵的当前位置就是起始点,并且这个点的坐标在By看来就是0,0,,其他的坐标点是相对于这个0,0点的坐标位置,To所使用的坐标就是绝对坐标了,好了看下代码中怎么用。
有了上边贝塞尔曲线的知识,下面我们就来添加一下UFO吧,仍然新建一个类用来表示UFO,代码如下。
我们创建了一个UFO类,并且让UFO的出现位置是随机的,UFO出现了以后开始执行贝塞尔曲线运动,最后移动出屏幕并且从父节点中移除。下面需要在主场景中添加一下UFO。
版权声明:本文由(
小塔 )原创,转载请保留文章出处!
本文链接:http://www.zaojiahua.com/bezier-curves-and-add-ufo.html
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 | } |
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 | } |
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 | } |
版权声明:本文由(
小塔 )原创,转载请保留文章出处!
本文链接:http://www.zaojiahua.com/bezier-curves-and-add-ufo.html
相关文章推荐
- 使用3.0实现微信打飞机——3.添加玩家飞机
- 使用3.0实现微信打飞机——5.添加子弹及管理器
- 使用3.0实现微信打飞机——13.添加声音
- 使用3.0实现微信打飞机——4.添加敌机
- 使用3.0实现微信打飞机——10.用户数据的操作
- 使用3.0实现微信打飞机——14.终结篇
- 使用3.0实现微信打飞机——6.碰撞检测
- 使用3.0实现微信打飞机——8.改变玩家技能
- 使用3.0实现微信打飞机——12.游戏结束场景
- 使用3.0实现微信打飞机——2.滚动地图
- 使用3.0实现微信打飞机——9.通过截屏实现暂停功能
- 使用3.0实现微信打飞机——11.分数排行榜的实现
- 使用3.0实现微信打飞机——1.游戏开始场景
- 使用大数据分析+AI+图片动态处理实现“朋友圈@微信官方头像添加圣诞帽”
- .net 3.0+关于实现IEnumerable的类型的扩展方法的使用一
- 使用jquery实现表格的动态添加和删除
- 【视频】配置信息管理 的 使用方法(六):实现添加、修改、查询
- VC下使用Macro (vbs)来实现标准函数注释的自动添加
- 使用触发器操作表1(添加,更新,删除) 同步实现表2的操作
- 使用OpenLayers实现一个在鼠标点击处添加标记的效果