开发者社区> 余二五> 正文

【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)抛物线并同时播放两个Action动作!

简介:
+关注继续查看

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

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

 

  1. //  抛物线    -Himi   
  2. //mSprite:需要做抛物线的精灵  
  3. //startPoint:起始位置  
  4. //endPoint:中止位置  
  5. //dirTime:起始位置到中止位置的所需时间  
  6. - (void) moveWithParabola:(CCSprite*)mSprite startP:(CGPoint)startPoint endP:(CGPoint)endPoint dirTime:(float)time{   
  7.     float sx = startPoint.x;  
  8.     float sy = startPoint.y;   
  9.     float ex =endPoint.x+50;  
  10.     float ey =endPoint.y+150;   
  11.     int h = [mSprite contentSize].height*0.5;  
  12.     ccBezierConfig bezier; // 创建贝塞尔曲线  
  13.     bezier.controlPoint_1 = ccp(sx, sy); // 起始点  
  14.     bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+200); //控制点  
  15.     bezier.endPosition = ccp(endPoint.x-30, endPoint.y+h); // 结束位置     
  16.     CCBezierTo *actionMove = [CCBezierTo actionWithDuration:time bezier:bezier];   
  17.     [mSprite runAction:actionMove];  
  18. }  


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

 

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

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

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

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

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

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

      

  1. //  抛物线运动并同时旋转    -Himi   
  2. //mSprite:需要做抛物线的精灵  
  3. //startPoint:起始位置  
  4. //endPoint:中止位置  
  5. //startA:起始角度  
  6. //endA:中止角度  
  7. //dirTime:起始位置到中止位置的所需时间  
  8. - (void) moveWithParabola:(CCSprite*)mSprite startP:(CGPoint)startPoint endP:(CGPoint)endPoint startA:(float)startAngle endA:(float)endAngle dirTime:(float)time{   
  9.     float sx = startPoint.x;  
  10.     float sy = startPoint.y;   
  11.     float ex =endPoint.x+50;  
  12.     float ey =endPoint.y+150;   
  13.     int h = [mSprite contentSize].height*0.5;  
  14.     //设置精灵的起始角度  
  15.     sprite.rotation=startAngle;  
  16.     ccBezierConfig bezier; // 创建贝塞尔曲线  
  17.     bezier.controlPoint_1 = ccp(sx, sy); // 起始点  
  18.     bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+200); //控制点  
  19.     bezier.endPosition = ccp(endPoint.x-30, endPoint.y+h); // 结束位置     
  20.     CCBezierTo *actionMove = [CCBezierTo actionWithDuration:time bezier:bezier];   
  21.     //创建精灵旋转的动作  
  22.     CCRotateTo *actionRotate =[CCRotateTo actionWithDuration:time angle:endAngle];  
  23.     //将两个动作封装成一个同时播放进行的动作  
  24.     CCAction * action = [CCSpawn actions:actionMove, actionRotate, nil];   
  25.     [mSprite runAction:action];  
  26. }  

 

  附上运行效果图:

  

   

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

 

     好了,就讲这么多吧,今天样书出来了,比较海皮~哈哈;  

 










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/665781,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Windows 平台上也可以进行 iOS App 的开发
为了将 iOS APP 上架至 App Store,我们需要准备以下基本需求资料:1. 苹果开发者账号(如果还没有账号,需要先申请,可以参考苹果开发者账号申请教程)
38 0
iOS开发 自拍及照片镜面翻转问题解决办法
iOS开发 自拍及照片镜面翻转问题解决办法
15 0
iOS开发-用keychain替代UDID
随着H5技术和VUE技术的流行,现在越来越多人喜欢试用hbuilder、uniapp或apicloud这些框架或工具来生成ios的app,这些工具会帮我们生成一个ipa文件。
20 0
ios APP最新iOS开发上架测试教程
本文详细介绍最新的在windows上进行ios app开发编译打包安装到手机测试的完整流程。介绍ios开发经常遇到的问题和解决方法,包括ios开发证书,ios开发描述文件等。
58 0
iOS开发之打包上传到App Store——(一)各种证书的理解
OK,有日子没写iOS开发的相关文章啦,主要是最近的精力都没在这上面,不过既然产品已经快要出来了,就有必要了解一下各种证书啥的(众所周知iOS的一堆证书可是很让人头大呀),最近确实被这个搞得头大,然后就决定参考网上的一些资料,进行一下整理,留作一个备份。
26 0
100个iOS开发面试题汇总
关于iOS开发面试,不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的好机会。
20 0
+关注
余二五
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
深入剖析iOS性能优化
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载