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

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

 
阅读更多

 

如果我们想实现让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];  

}  

  附上运行效果图:

  

 

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

 

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

分享到:
评论

相关推荐

    cocos2d 总结:三 CCSprite

    4. **动作和动画**:CCSprite可以执行各种动作,如平移(moveTo)、旋转(rotateTo)、缩放(scaleTo)等。通过组合动作,可以创建复杂的动画效果。`[sprite runAction:[CCMoveTo actionWithDuration:2 position:ccp...

    ccsprite播放动画的源代码

    在VS2010+Cocos2d-x的编译环境下,我们可以利用ccsprite来实现精灵的动画播放功能。下面将详细解释如何使用ccsprite进行动画播放。 一、Cocos2d-x和ccsprite概述 Cocos2d-x是一个开源的、跨平台的游戏开发框架,它...

    CCSprite基本处理和动画工程

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

    CCSprite 精灵动画

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

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

    缩放CCSprite则需要用到` CCScaleBy `动作。你可以创建一个` CCScaleBy `对象,指定缩放的时间和比例,然后使用` runAction `方法应用到精灵上。例如,` sprite->runAction(CCScaleBy::create(2.0f, 1.5f)) `会让...

    Cocos2d-x横版动作手游完整源码Source

    在Cocos2d-x中,开发者可以利用其内置的Action(动作)系统来实现角色的移动、攻击、跳跃等复杂行为,通过Scheduler(调度器)来安排游戏循环和定时事件,而Physics Engine(物理引擎)则可以帮助创建真实的碰撞检测...

    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=

    cocos2d-x简易动作游戏源码

    通过深入分析"acttest"源码,我们可以学习到如何利用cocos2d-x开发一款简易的动作游戏,理解游戏对象的创建、动作的实现、事件的响应以及资源的管理等核心概念。对于初学者来说,这是一个很好的实践案例,而对于有...

    cocos2d-x初探学习笔记(3)

    ### cocos2d-x初探学习笔记(3)—— 动作(CCAction) #### 内存自动回收 在深入探讨`cocos2d-x`的动作系统之前,我们首先需要了解该框架提供的内存管理机制。与Java等语言不同,C++需要开发者手动管理内存,这在...

    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人物动作类实例

    本文将深入探讨Cocos2d-x的人物动作类实例,帮助开发者理解如何利用这些类创建丰富的游戏动画。 首先,Cocos2d-x的动作类(CCAction)是游戏开发中的核心组件,它们允许开发者对游戏中的节点(如精灵CCSprite)进行...

    coco2d-x面试题(无脑码农).pdf,这是一份不错的文件

    CCNode和CCSprite的绘制是通过OpenGL ES的API完成的,利用顶点数组和纹理坐标来呈现2D图形。 总的来说,Cocos2d-x通过这些组件协同工作,提供了高效的游戏开发环境,允许开发者构建功能丰富的2D游戏,并通过各种...

    cocos2d-x 自学文档

    在cocos2d-x中,我们可以利用Ease系列的方法来实现物体的加速度或减速度效果。Ease动作不改变整个动作的总时长,它们只是改变了速度的曲线。Ease动作分为三类:In actions(加速开始)、Out actions(减速结束)和In...

    【iphone游戏开发】iphone-Cocos2d游戏开发

    然后,利用`CCRepeatForever`动作让这个序列无限次重复,实现持续眨眼的效果。 5. **执行动作**:最后,将创建好的动作应用到小鸟精灵上,`[bird runAction:blinkAction]`,这里的`blinkAction`是包含整个眨眼序列...

    Cocos2D游戏之旅(四):卡牌翻转效果的实现(下)---源代码

    实现卡牌翻转效果的关键在于利用Cocos2D的动作类`CCFlipX`和`CCFlipY`。这两个类分别实现沿X轴和Y轴的翻转效果。为了创建一个完整的翻转动画,我们通常会结合使用这两个动作,并设置适当的持续时间和延迟,以便在...

    cocos2d-x面试题DOCX文档

    CCAction是动作的基类,主要使用CCFiniteTimeAction有限次动作执行,就是按时间顺序执行一系列动作,执行完后动作结束。CCFiniteTimeAction又分为CCActionInstanse瞬时动作的基类和CCActionInterval延时动作的基类。...

    TouchSpriteDemo.zip

    本篇我们将深入探讨一个名为"TouchSpriteDemo"的示例,该示例展示了如何在cocos2d-x环境中实现对触碰事件的响应,让精灵(ccsprite)具备互动性。 首先,让我们理解一下cocos2d-x中的"ccsprite"。ccsprite是cocos2d...

    cocos2d-x播放flash序列帧示例

    在cocos2d-x中播放Flash序列帧动画,我们通常会利用到`CCSpriteBatchNode`和`CCActionInterval`类。`CCSpriteBatchNode`用于优化多个精灵的渲染,而`CCActionInterval`则负责控制动画的播放速度和顺序。 1. **导入...

Global site tag (gtag.js) - Google Analytics