cocos2dx扩展CCAction实现精灵抛物线运动

  在不使用物理引擎的情况下,模拟物体在重力作用下的抛物线运动(忽略空气阻力)。给出运动起始点位置,终点位置,重力加速度g,起始点的发射角作为参数。

  先根据已知条件求出物体在x轴和y轴上的初速度,再根据公式f(t)=v0t+0.5*at2  求出运动轨迹。

   类CCParabolaMove继承自CCAction。

 1 CCParabolaMove* CCParabolaMove::create(const CCPoint& startPosition, const CCPoint& endPosition, float angle, float g,float &return_duration)
 2 {
 3     CCParabolaMove *pRet = new CCParabolaMove();
 4     float vx0,vy0, x1, y1,  duration;
 5
 6     x1 = endPosition.x - startPosition.x;
 7     y1 = endPosition.y - startPosition.y 8     x1 /= PIXELS_PER_METER; //像素到米的转换,PIXELS_PER_METER为转换系数,这里设置为100
 9     y1 /= PIXELS_PER_METER;
10     angle = angle*3.14 / 180;//convert t to radian
11
12     if (x1<0)
13     {
14         angle *= -1;
15     }
16
17     vx0 = x1*sqrt(g / 2 / (x1*tan(angle) - y1)); //求出初速度
18     vy0 = vx0 * tan(angle);
19
20     duration = x1 / vx0; //求出整个运动的时间
21     return_duration = duration; //将duration通过参数返回22     pRet->initWithDuration(duration,startPosition, endPosition, angle,g, vx0, vy0);
23     pRet->autorelease();
24
25     return pRet;
26 }

create()为静态函数,所以对非静态成员变量的赋值要在initWithDuration()中实现:

 1 bool CCParabolaMove::initWithDuration(float duration, const CCPoint& startPosition, const CCPoint& endPosition, float angle, float g, float vx0, float vy0)
 2 {
 3     if (CCActionInterval::initWithDuration(duration))
 4     {
 5         m_vx0 = vx0;
 6         m_vy0 = vy0;
 7         m_startPosition = startPosition;
 8         m_endPosition = endPosition;
 9         angle = angle*3.14 / 180;//convert t to radian
10         m_angle = angle;
11         m_dur = duration;
12         m_tan_a = tan(angle);
13         m_g = g;
14         return true;
15     }
16
17     return false;
18 }

在runaction时startWithTarget(CCNode *pTarget)会首先被调用,通过pTarget为执行动作的对象指针:

1 void CCParabolaMove::startWithTarget(CCNode *pTarget)
2 {
3     CCActionInterval::startWithTarget(pTarget);
4
5 }

update(float t)中参数t表示当前运动时间与整个运动时长的比值,范围0到1。

 1 void CCParabolaMove::update(float t)
 2 {
 3     if (m_pTarget)
 4     {
 5         float elapsed = t * m_fDuration; //获得当前的运动时间
 6         float diff_x = m_vx0 * elapsed;
 7         float diff_y = m_vy0 * elapsed - 0.5 * m_g * elapsed * elapsed;
 8
 9         CCPoint newPos = ccpAdd(m_startPosition, ccp(diff_x * PIXELS_PER_METER, diff_y * PIXELS_PER_METER)); //单位由米转换为像素
10         m_pTarget->setPosition(newPos);
11
12
13     }
14 }
时间: 2024-10-27 06:01:39

cocos2dx扩展CCAction实现精灵抛物线运动的相关文章

[cocos2d-x]-会动的精灵

小鸟一直在扑翅膀的代码块: auto sprite = Sprite::create(); Animation *animation = Animation::create(); animation->addSpriteFrameWithFileName("bird_blue_1.png"); animation->addSpriteFrameWithFileName("bird_blue_2.png"); animation->addSprite

Cocos2d-x Lua中Sprite精灵类

Cocos2d-x Lua中Sprite精灵类 精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin.PhysicsSprite是物理引擎精灵类,Skin是皮肤精灵类用于骨骼动画.创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下:cc.Sprite:create ().创建一个精灵对象,纹理[ 纹理(texture),表示物体表面细

cocos2d-x实现多个精灵动画同步播放(一)

2D游戏经常有角色穿装备的情况,如下图角色手部加了一个武器.此外还有格斗游戏里常有的投技:         注意角色是处在站立状态下的,有Idle动画,手部武器也要随角色一起联动.我们是不是要让美术再画一套加手部动画的素材,那美术显然不干了,那要有脚呢,披风呢?不要画死了.他们只会给你一套纯武器的站立动画,让你自己去拼. 那我们要想让武器随角色一起联动,自然想到设定好位置和zorder后,调用CCSpawn同时动作的方法.可这有个大问题,就是独立执行两个不同的动画会有很大机率产生不同步的问题.为

【Cocos2d-x】使用贝塞尔曲线(Bezier)实现精灵抛物线运动

Cocos2d-x中的贝塞尔曲线 在Cocos2d-x中贝塞尔曲线运动的封装类为CCBezierTo和CCBezierBy. 这两个Action都需要传入一个参数ccBezierConfig,这是一个结构体,这个结构体有三个字段 1.CCPoint endPosition:结束点 2.CCPoint controlPoint_1:控制点1 3.CCPoint controlPoint_2:控制点2 两个控制点的会影响曲线的变化趋势. Cocos2d-x中贝塞尔曲线运动的实现是二次曲线. 曲线的每

Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》

这是自己开发的第一次小游戏,有需要源代码和材料的邮箱留个,这里实现了能通过虚拟摇杆控制精灵的运动,而且能够改变精灵运动时的脸部朝向.之前看了好多人写虚拟摇杆,但是就是没写控制精灵的运动和脸朝向的.所以自己就想要写个文章好好讲下它的实现思路.好了,下面我们开始吧. 目录: 一.修改背景图片和窗口大小 二.添加虚拟摇杆 三.添加精灵并用摇杆控制精灵的运动 四.思路总结 一.修改背景图片和窗口大小 新建一个工程,工程名为HelloCpp.为了让效果更加好些,首先修改下窗口的大小,在main.cpp中改

cocos2dx小知识——更换精灵图片

更换精灵CCSprite的图片有两种方式. 1.直接通过图片更换 使用setTexture(CCTexture2D*)函数,可以重新设置精灵类的纹理图片. // CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage("bg2.png"); bg->setTexture(texture); // 2.通过缓存帧替换 使用setDisplayFrame(CCSpriteFrame*)函数,利用

Cocos2d-X中实现批处理精灵

使用普通方法实现批处理精灵 在Sprite.h中添加下面的代码 #ifndef __Sprite_SCENE_H__ #define __Sprite_SCENE_H__ #include "cocos2d.h" USING_NS_CC; class Sprite : public CCLayer { public: //初始化层 bool init(); //创建场景 static CCScene* scene(); //响应触摸 bool Sprite::ccTouchBegan(

关于Cocos2d-x中节点和精灵的关系以及初始化

1.每一个对象类都有一个自己public的一个create函数(等价于CREATE_FUNC),和init函数. 2.create函数返回的是自身的类型,init函数是在ceate函数被调用的时候自动调用. 3.如果是场景对象类的话,还要public一个 static cocos2d::Scene* createScene();的函数,返回值是Scene类型 如果我们要呈现一个会动的人 1.定义一个对象类,继承自Node 2.定义一个private的Sprite * sprite属性 3.在in

cocos2d-x 扩展 修改 备注

1.引擎源码相关扩展 说明:class/cellsExt 下的全部文件为扩展文件,有auto字样的文件为生成文件,*.pkg文件为自动生成文件的接口配置档,参考tolua++,源文件中代在[solyess]字样的全为对引擎源码修改标注. a.CellsGameFramework GLView适配器,用于处理GLView集成 b.extentions 为功能性的扩展 1) Compress 文件压缩解压相关 2) Devices 获取设备相关信息 3) Express 字符串表达式解析 4) Ge