【IOS-COCOS2D游戏开发之十三】CCSPRITE利用BEZIER(贝塞尔)做抛物线动作并让CCSPRITE同时播放两个ACTION动作!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/480.html

如果我们想实现让CCSprite进行抛物线运动的话,那么我想童鞋们首先会想到利用Box2d或者其他物理引擎去为CCSprite创建物理世界中对应的刚体进行实现,但是反过来想,对于不熟悉Box2d或者其他物理引擎的童鞋,肯定不方便,那么Himi今天为大家介绍另外一种不实用物理引擎实现CCSprite抛物线方式;

这里我直接将封装好的方法贴上来,注释都在代码中了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//  抛物线    -Himi  

//mSprite:需要做抛物线的精灵  

//startPoint:起始位置  

//endPoint:中止位置  

//dirTime:起始位置到中止位置的所需时间  

- (void) moveWithParabola:(CCSprite*)mSprite startP:(CGPoint)startPoint endP:(CGPoint)endPoint dirTime:(float)time{  

    float sx = startPoint.x;  

    float sy = startPoint.y;  

    float ex =endPoint.x+50;  

    float ey =endPoint.y+150;  

    int h = [mSprite contentSize].height*0.5;  

    ccBezierConfig bezier; // 创建贝塞尔曲线  

    bezier.controlPoint_1 = ccp(sx, sy); // 起始点  

    bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+200); //控制点  

    bezier.endPosition = ccp(endPoint.x-30, endPoint.y+h); // 结束位置    

    CCBezierTo *actionMove = [CCBezierTo actionWithDuration:time bezier:bezier];  

    [mSprite runAction:actionMove];  

}

之前在Android上我也有讲解过贝塞尔曲线的博文,但是Android中不同于cocos2d封装这个,在cocos2d中的Bezier是封装为了精灵动作,让精灵按照贝塞尔曲线的路线去运动;那么以上封装的代码中对于抛物线运动来说最重要的一点就是创建贝塞尔曲线的第二个点,这个点控制着精灵路径的所经过的最高点,这里务必要知道;

 

这种实现方式虽然没有物理系统对刚体施加力来的真实,但是!我想这段代码的实用性还是很大的,至少不需要使用box2d引擎相关知识,最重要的优点是不会存在上一章介绍的代码混编带来的编译错误~

//—-  OK,下面来介绍第二个知识点:

很多童鞋学习cocos2d,一般不经常更新的动画,会使用cocos2d封装的动作,例如旋转、渐变、位移等等,那么一旦使用动作后,肯定就有需要两个动作一起播放的需求,那么基本上童鞋们大脑中第一闪现的就是利用cocos2d的动作序列  CCSequence,但是效果不理想,原因很简单,因为顾名思义,既然是动作序列,那就是按照动作的顺序一个动作一个动作的进行播放,也就是说利用动作序列只能达到连续播放动作,无法同时播放动作的目的;

那么在这里给大家一个方法能让两个动作同时播放的方法:

这里为了讲解方便,我在刚才封装的贝塞尔曲线上的方法上进行修改,添加一个旋转的动作,让贝塞尔曲线运动与旋转动作同时播放,这里Himi使用一根“矛”的图片作用示意图来说明,因为矛与箭的运动方式最常用的动作肯定是一边旋转一边抛物线位移,这样才更加真实;

OK,看下封装角度后的抛物线并同时旋转方法如下:

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

//  抛物线运动并同时旋转    -Himi  

//mSprite:需要做抛物线的精灵  

//startPoint:起始位置  

//endPoint:中止位置  

//startA:起始角度  

//endA:中止角度  

//dirTime:起始位置到中止位置的所需时间  

- (void) moveWithParabola:(CCSprite*)mSprite startP:(CGPoint)startPoint endP:(CGPoint)endPoint startA:(float)startAngle endA:(float)endAngle dirTime:(float)time{  

    float sx = startPoint.x;  

    float sy = startPoint.y;  

    float ex =endPoint.x+50;  

    float ey =endPoint.y+150;  

    int h = [mSprite contentSize].height*0.5;  

    //设置精灵的起始角度  

    sprite.rotation=startAngle;  

    ccBezierConfig bezier; // 创建贝塞尔曲线  

    bezier.controlPoint_1 = ccp(sx, sy); // 起始点  

    bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+200); //控制点  

    bezier.endPosition = ccp(endPoint.x-30, endPoint.y+h); // 结束位置    

    CCBezierTo *actionMove = [CCBezierTo actionWithDuration:time bezier:bezier];  

    //创建精灵旋转的动作  

    CCRotateTo *actionRotate =[CCRotateTo actionWithDuration:time angle:endAngle];  

    //将两个动作封装成一个同时播放进行的动作  

    CCAction * action = [CCSpawn actions:actionMove, actionRotate, nil];  

    [mSprite runAction:action];  

}

附上运行效果图:

左侧的矛是起始位置,后侧的是抛物线与旋转两个动作同时进行运动中的矛~

好了,就讲这么多吧,今天<Android游戏编程之从零开始>样书出来了,比较海皮~哈哈;

时间: 2024-11-05 12:15:07

【IOS-COCOS2D游戏开发之十三】CCSPRITE利用BEZIER(贝塞尔)做抛物线动作并让CCSPRITE同时播放两个ACTION动作!的相关文章

【IOS-COCOS2D-X 游戏开发之十三】详细讲解在XCODE中利用预编译并通过JNI调用ANDROID的JAVA层代码(COCOS2DX里访问调用ANDROID函数)!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html 很多看过之前Himi的[iOS-cocos2d-X 游戏开发之七]整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可! 博文的童鞋都在问我如何在Xcode中能调用Java的函数,比如在Android端需要加入广告.支付.等第三方平台或者

【IOS-COCOS2D游戏开发之二】COCOS2D 游戏开发资源贴(教程以及源码)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/420.html     这两天抽出一些时间学习cocos2d,发现资料N多,而且讲解的相当的全面:那么这段时间我也处于不断的学习中,当然好东西不私藏,这里我把比较经典的一个iOS游戏开发书籍给出,当然很多童鞋,我想都有了,那么就当是照顾没有的童鞋啦,下次发帖的时候,就应该是自己抽时间做个游戏出来后的时候,那么届

【ANDROID游戏开发二十三】自定义LISTVIEW【通用】适配器并实现监听控件!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html  ListView :在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其实在游戏开发中,也会常常使用到系统组件,比如游戏排行榜,简单的游戏关卡选择等等,都可以来使用ListView来实现:     当然关于ListView我想大家都会使用了

【IOS-COCOS2D-X 游戏开发之十四】XCODE中C++&amp;OBJECT-C混编,详细介绍如何在COCOS2DX中访问OBJECT函数以及APPLE API

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/743.html Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文: [iOS-cocos2d-X 游戏开发之十三]详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用

【ANDROID游戏开发之八】游戏中添加音频-详解MEDIAPLAYER与SOUNDPOO!并讲解两者的区别和游戏中的用途!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/312.html  ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读

【IOS-COCOS2D(2.X) 游戏开发之一】自定义CCSPRITE中-(ID) INIT 重写需注意&amp; 2.X版本中注册触屏事件代码&amp;简述COCOS2D/X/UNITY3D引擎使用感想!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d-v2/736.html 先说下技术相关问题: Himi有段时间没有折腾Cocos2d-iphone了,前几天下载最新的Cocos2d 2.x版本尝试使用,发现两个常用知识点则需要注意的地方,这里分享下: 1.  对于Cocos2d 2.x版中,当你(自定义精灵)自定义一个类并继承精灵CCSprite时,务必要注意

【IOS-COCOS2D游戏开发之十四】音频/音效/视频播放(利用COCOS2D-IPHONE-EXTENSIONS嵌入COCOS2D进行视频播放!)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/482.html 今天Himi为大家讲解如何在cocos2d中视频.音乐.音效的播放教程:    首先介绍音乐.音效的播放: 音频与音效的播放很简单,毕竟cocos2d引擎为我们封装好了这一切,直接上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

【IOS-COCOS2D游戏开发之一】搭建COCOS2D游戏引擎环境HELLOWORLD!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/415.html 最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的: 最后促使我选择cocos2d的原因有两点: 1.最重要的原因是它对应的开发工具,尤其是 "ParticleDesigner",粒子系统编辑器,非常的喜

【IOS-COCOS2D游戏开发之十一】使用BOX2D物理系统以及在COCOS2D框架添加BOX2D物理系统LIB包的方法

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/474.html 上一节讲述了粒子的相关问题,当然啦,不示弱,今天继续将物理系统给大家进行简单的介绍和讲述: 首先先介绍,如何在cocos2d中加入box2d开发lib包,因为一般使用cocos2d引擎进行开发游戏时,大家创建项目都会选用cocos2d框架,而不是直接采用物理系统的cocos2d框架,但是后期忽然