zoukankan      html  css  js  c++  java
  • 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);
    
    
        }
    }
  • 相关阅读:
    依赖注入模式与反模式
    WPF异常——某个ItemsControl与它的项源不一致
    C# 3进化的数据访问之智能的编译器
    C# 2的重大改进之可空类型
    C# 1之外:构建于坚实基础上的新特性
    C# 1的核心基础之二——类型系统
    C# 1的核心基础之一——委托
    C#进化史
    单一职责原则
    HBase简介
  • 原文地址:https://www.cnblogs.com/yufenghou/p/4166111.html
Copyright © 2011-2022 走看看