`
yangping_Account
  • 浏览: 186699 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

CCSprite利用Bezier(贝塞尔)做抛物线动作

 
阅读更多

 

原文地址:http://blog.csdn.net/xiaominghimi/article/details/6779873

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

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


//  抛物线    -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,看下封装角度后的抛物线并同时旋转方法如下:


//  抛物线运动并同时旋转    -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];  

}  

  附上运行效果图:

  

 

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

 

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

分享到:
评论

相关推荐

    CCSprite基本处理和动画工程

    CCSprite的基本处理:缩放、旋转、混色 CCSprite的Action:帧动画,move+JUMP,move+rotate,FlowAction等,对于这些了解了,然后如果还有其他需求,相对就简单很多了.

    CCSprite 精灵动画

    CCSprite 精灵动画 动画示例精灵就是将图形资源加载到内存中,并根据游戏需要将其显示到屏幕中的工具,游戏中大到背景、UI,小到NPC、道具,只要是用图片展示的,都是精灵或它的子类。从技术上讲,精灵是一个可以...

    cocos2d 总结:三 CCSprite

    NULL 博文链接:https://o0o0o0o.iteye.com/blog/805581

    ccsprite播放动画的源代码

    在vs2010+cocos2d-x编译环境下实现的ccsprite精灵类的动画播放

    Cocos2d-x初入学堂-->CCSprite基本处理(2)工程

    Cocos2d-x初入学堂-->CCSprite基本处理(2):创建、缩放、旋转、混色;源码和资源都放在包里了

    Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验

    结论:实践证明这三个东西的默认坐标都是0,0 默认锚点都是0.5,0.5。 bool HelloWorld::init() { bool bRet = false; do ... CCSprite * sprite = CCSprite::create("image1.... CCLog("CCSprite.x=%f,CCSprite.y=

    CCMask:使用 cocos2d-x v2.0 屏蔽 CCSprite

    CCSprite* object = CCSprite::create("HelloWorld.png");object->setPosition(ccp(mask->getContentSize().width/2, mask->getContentSize().height/2));// Create a masked imageCCMask* masked = CCMask::create...

    cocos2d-x的粒子创建

    用来自己学习的小资料片段,可做学习用 CCSize size=CCDirector::sharedDirector()->getWinSize(); texture=CCTextureCache::sharedTextureCache()->addImage("bj01.png"); back=CCSprite::createWithTexture...

    Cocos2dx 摇杆控件

    利用cocos2dx引擎开发的摇杆控件,继承自CCSprite,完美兼容2.2.1

    Cocos2D-X游戏开发技术精解

    作者介绍刘剑卓 有点文艺的IT男,会做美食的运动男,喜欢电影的80后。拥有八年的游 戏开发经验,精通移动平台以及PC平台游戏的开发,在过往的职业生涯已有 多款上线畅销游戏。拥有自主研发开发工具、引擎以及游戏...

    【iOS-游戏开发】实现精灵血槽

    IOS-cocos2d 利用子精灵实现血槽,跟随父精灵一起走,并且更新血槽 利用CCProgressTimer,或者直接用CCSprite也可以,简单的写了精灵的奔跑,由于篇幅过大就不上代码,直接发DEMO了

    cocos2dx 3.x实现精灵色相的修改

    Debug模式下,需要注释掉 CCGLProgramState.h apply() 方法中 switch语句default分支下的断言 调用方法 CSpriteWithHue *sprite = CCSpriteWithHue::create("HelloWorld.png"); sprite->setHue(4.6);...

    Learn iPhone and iPad cocos2d Game Development

     3.5.2 动作的处理方式  3.5.3 消息调度  3.6 场景和层  3.6.1 ccscene  3.6.2 场景和内存  3.6.3 推进和弹出场景  3.6.4 cctransitionscene  3.6.5 cclayer  3.7 ccsprite类  3.7.1 定位点揭秘  3.7.2 ...

    cocos2dx动画工具

    按照一定的规范制作动画,然后放置在场景上导出成swf,利用工具解析swf文件,把场景上的动画资源导出成cocos2dx的.h和.cpp文件。导出的类继承自CCLayer所以直接可以A_xx::create();添加到场景中。里面的CCSprite可以...

    SwfTo2dX_V1.0

    按照一定的规范制作动画,然后放置在场景上导出成swf,利用工具解析swf文件,把场景上的动画资源导出成cocos2dx的.h和.cpp文件。导出的类继承自CCLayer所以直接可以A_xx::create();添加到场景中。里面的CCSprite可以...

    Cocos2D-X核心类学习

    Cocos2D-X核心类 Cocos2D-X 引擎的设计思路是将游戏中的各个部分抽象成几个概念:导演、场景、布景层及人物精灵。 导演(CCDirector):游戏的...人物精灵(CCSprite):人物精灵可以分为玩家控制的主角类、敌人类等。

Global site tag (gtag.js) - Google Analytics