cocos3 抛物线运动

#pragma once
#include "cocos2d.h"

USING_NS_CC;

class Parabola:public ActionInterval
{
public:
    static Parabola* create(const CCPoint& startPosition, const CCPoint& endPosition,
        float angle, float g,float &return_duration);

     //override
    virtual Parabola* clone() const override;
    virtual Parabola* reverse() const override;

    virtual void update(float time) override;

protected:
    bool initWithDuration(float duration, const CCPoint& startPosition,
        const CCPoint& endPosition, float angle, float g, float vx0, float vy0);

protected:
    float    m_vx0;
    float    m_vy0;
    Point    m_startPosition;
    Point    m_endPosition;
    float    m_angle;
    float    m_dur ;
    float    m_tan_a;
    float    m_g;
};
#include "Parabola.h"

#define PIXELS_PER_METER 100

Parabola* Parabola::create(const CCPoint& startPosition, const CCPoint& endPosition,
                           float angle, float g,float &return_duration)
{
    Parabola *pRet = new Parabola();
    float vx0,vy0, x1, y1,  duration;

    x1 = endPosition.x - startPosition.x;
    y1 = endPosition.y - startPosition.y;
    x1 /= PIXELS_PER_METER; //像素到米的转换,PIXELS_PER_METER为转换系数,这里设置为100
    y1 /= PIXELS_PER_METER;
    angle = angle*3.14 / 180;//convert t to radian

    if (x1<0)
    {
        angle *= -1;
    }

    vx0 = x1*sqrt(g / 2 / (x1*tan(angle) - y1)); //求出初速度
    vy0 = vx0 * tan(angle);

    duration = x1 / vx0; //求出整个运动的时间
    return_duration = duration; //将duration通过参数返回
    pRet->initWithDuration(duration,startPosition, endPosition, angle,g, vx0, vy0);
    pRet->autorelease();

    return pRet;
}

bool Parabola::initWithDuration(float duration, const Point& startPosition, const Point& endPosition, float angle, float g, float vx0, float vy0)
{
    if (CCActionInterval::initWithDuration(duration))
    {
        m_vx0 = vx0;
        m_vy0 = vy0;
        m_startPosition = startPosition;
        m_endPosition = endPosition;
        angle = angle*3.14 / 180;//convert t to radian
        m_angle = angle;
        m_dur = duration;
        m_tan_a = tan(angle);
        m_g = g;
        return true;
    }

    return false;
}

Parabola* Parabola::clone() const
{
    CC_ASSERT(0);
    return nullptr;
}

Parabola* Parabola::reverse() const
{
    CC_ASSERT(0);
    return nullptr;
}

void Parabola::update(float time)
{
    if (_target)
    {
        float elapsed = _elapsed; //获得当前的运动时间
        float diff_x = m_vx0 * elapsed;
        float diff_y = m_vy0 * elapsed - 0.5 * m_g * elapsed * elapsed; 

        CCPoint newPos = ccpAdd(m_startPosition, ccp(diff_x * PIXELS_PER_METER, diff_y * PIXELS_PER_METER)); //单位由米转换为像素
        _target->setPosition(newPos);

    }
}
时间: 2024-10-12 13:13:10

cocos3 抛物线运动的相关文章

小tips:用java模拟小球做抛物线运动

这几天刚刚学习了java线程,然后跟着书做了几个关于线程的练习,其中有一个练习题是小球动起来.这个相信很简单,只要运用线程就轻松能够实现.然后看到了它的一个课后思考题,怎样让小球做个抛物线运动,这点我调试了很久,上网也找了很多资料,但是没有那种适合我们小白的教程,于是我简单讲讲我的思路.我将从如何画一个小球开始到一步步实现小球进行抛物线运动.嘿嘿!! 一.任务分解 现在我们来做抛物线运动的小球,先不急写代码,先来想象一下做好的结果是什么样子的.我将这个任务分成三步,第一步,画一个小球:第二步,该

cocos3.2 搭建开发环境

---恢复内容开始--- 需要的东西 ant ndk sdk cocos3.2 python 2.7 首先修改host保证能访问google,让后可以再eclipse当中下载android sdk的任何版本. 下载好上面的东西以后解压. 让后统统添加到环境变量当中. ANDROID_SDK_ROOT NDK_ROOT ANT_ROOT 让后运行setup.py 重启cmd就可以创建工程了 cocos new MyGame -p com.dong.cn -l cpp -d e:/cocosproj

自由落体和抛物线运动

自由落体是个加速的过程,让速度递加,再给速度个系数,减小速度即可 抛物线是在自由落体的前提下left也会变,速度,速度系数 js函数 //自由落体和抛物线运动 function fallMove(obj) { var speed = 0; var speedX = 10; clearInterval(obj.timer); obj.timer = setInterval(function() { speed += 3; var T = obj.offsetTop + speed; if(T >

cocos3.10 使用cocostudio 回调特性 c++版本说明

好久没捣鼓cocos2dx了,又拿起来玩玩,看着版本一次次的升级,真的好快,今天用cocos3.10版本测试下时间特性功能,跟着官方文档去做都挺顺利,唯一最后一步代码不知道该放哪里,下午吃完饭回来,又在看官方的这句话(官方地址http://www.cocos.com/doc/article/index?type=Cocos%20Studio&url=/doc/cocos-docs-master//manual/studio/v4/chapter3/HowToCode/CallBack/zh.md

cocos3 python脚本建立类文件

以前看过一本关于精简工作内容的书,要把工作中重复的东西都简化 今天我就来简化cocos3建立.h文件和.cpp文件 ClassName="TestSprite" Type="Sprite" #.h file write file = open(ClassName+'.h', 'w') str='''#pragma once #include "cocos2d.h" USING_NS_CC; class ClassName:public Type

js实现抛物线运动 兼容IE低版本(转)

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="keywords" content="javascript, 动画, 抛物线" /> <title>抛物线运动</title> <style> body { margin: 0; font-size: 14px; font-

cocos2.x cocos3.x创建命令

cocos2.x 创建命令: 1.cmd 去到cocos2d-x-2.2.3\tools\project-creator\目录下 2.python create_project.py -project HelloWorld -package com.eyu.HelloWorld -language cpp cocos3.x 进入到目录**cocos2d-x-3.2alpha0/tools/cocos2d-console/bin/cocos.py** 打开终端运行**cocos.py**脚本创建文

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

在不使用物理引擎的情况下,模拟物体在重力作用下的抛物线运动(忽略空气阻力).给出运动起始点位置,终点位置,重力加速度g,起始点的发射角作为参数. 先根据已知条件求出物体在x轴和y轴上的初速度,再根据公式f(t)=v0t+0.5*at2  求出运动轨迹. 类CCParabolaMove继承自CCAction. 1 CCParabolaMove* CCParabolaMove::create(const CCPoint& startPosition, const CCPoint& endPos

cocos3.2版本中的一些新特性

1.设置屏幕分辨率的大小,需要手动添加: 2.去掉了所有CC开头的命名: 3.所有的单例(以前是采用shared开头方法),全部改为getInstance(); 4.cocos3.x以上的版本支持C++11的特性,例如使用auto关键字,支持进行自动类型推导,也支持lamba表达式,bind等: 5.设置ZOrder方法,用setLocalZOrder()代替原来的setZOrder() virtual void setLocalZOrder(int localZOrder); 6.Ref代替原