博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d 走动椭圆
阅读量:5127 次
发布时间:2019-06-13

本文共 3921 字,大约阅读时间需要 13 分钟。

1.效果图

艺术与规划说他想与我合作在全国率先主角光环加,椭圆形走动。

cocos2d自带没有,參考网上的写了一个。

2.椭圆数学知识

有关椭圆的数学知识我已经忘光了。网上找了点资料:
a是椭圆的长半轴,b是椭圆的短半轴。

o是角度,范围是[0, 2π]。

我们须要知道椭圆上的位置,能够用以下的公式:

3.直接代码了..

OvalActionInterval.h
#ifndef __JumpGame__OvalInterval__#define __JumpGame__OvalInterval__#include "CCActionInterval.h"//包括系统延时类动作头文件using namespace cocos2d;// 定义一个结构来包括确定椭圆的參数typedef struct OvalConfig {    //中心点坐标    Vec2 centerPosition;    //椭圆a长半轴    float a;    //椭圆b短半轴    float b;    //是否逆时针运动    bool moveInAnticlockwise;    //two zOrder    std::pair
zOrder;} lOvalConfig;/** 以椭圆方式移动*/class CC_DLL MoveOvalBy : public ActionInterval{public: MoveOvalBy(); //用“动作持续时间”和“椭圆控制參数”初始化动作 bool initWithDuration(float t, const OvalConfig& c); virtual MoveOvalBy* clone() const override; virtual MoveOvalBy* reverse() const override; virtual void update(float t);//利用update函数来不断的设定坐标 virtual void startWithTarget(Node *target) override;public: //用“动作持续时间”和“椭圆控制參数”创建动作 static MoveOvalBy *create(float t, const OvalConfig& c); protected: OvalConfig _config; //x = a * cos(t) t = [0, 2Pi] inline float getPositionXAtOval(float t ){//返回X坐标 //參数方程 if(_config.moveInAnticlockwise == false){ return _config.a * cos(6.2831852 * (1 - t)); }else{ return _config.a * cos(6.2831852 * t); } } //y = b * sin(t) t = [0, 2Pi] inline float getPositionYAtOval(float t ){//返回Y坐标 //參数方程 if(_config.moveInAnticlockwise == false){ return _config.b * sin(6.2831852 * (1 - t)); }else{ return _config.b * sin(6.2831852 * t); } }private: CC_DISALLOW_COPY_AND_ASSIGN(MoveOvalBy);};#endif
OvalActionInterval.cpp
#include "OvalActionInterval.h"MoveOvalBy::MoveOvalBy(){}////MoveOvalBy//MoveOvalBy* MoveOvalBy::create(float t, const OvalConfig& c){//利用之前定义的椭圆的參数初始化椭圆    MoveOvalBy *action = new MoveOvalBy();    action->initWithDuration(t, c);    action->autorelease();        return action;}bool MoveOvalBy::initWithDuration(float t, const OvalConfig& c){    if (ActionInterval::initWithDuration(t)){        _config = c;        return true;    }        return false;}void MoveOvalBy::update(float t){    //t [0, 1]    //log("t:%f", t);    if (_target){        float x = getPositionXAtOval(t);//调用之前的坐标计算函数来计算出坐标值        float y = getPositionYAtOval(t);        _target->setPosition(_config.centerPosition + Vec2(x, y));//因为我们画计算出的椭圆你做值是以原点为中心的。所以须要加上我们设定的中心点坐标                if(t <= 0.5){            _target->setLocalZOrder(_config.zOrder.first);        }else{            _target->setLocalZOrder(_config.zOrder.second);        }    }}MoveOvalBy* MoveOvalBy::clone() const{    auto action = new MoveOvalBy();    action->initWithDuration(_duration, _config);    action->autorelease();    return action;}MoveOvalBy* MoveOvalBy::reverse() const{    OvalConfig newConfig;    newConfig.centerPosition = _config.centerPosition;    newConfig.a = _config.a;    newConfig.b = _config.b;    newConfig.moveInAnticlockwise = !_config.moveInAnticlockwise;    newConfig.zOrder = _config.zOrder;    return MoveOvalBy::create(_duration, newConfig);}void MoveOvalBy::startWithTarget(Node *target){    ActionInterval::startWithTarget(target);}
參考:http://blog.csdn.net/ufolr/article/details/7447773
我这里还加上了zOrder。这样有透视效果。

a等于b的时候就是圆形了。

有时候在游戏中略微用上点数学知识感觉非常爽。

调用例如以下:

auto size = this->getContentSize();     auto ball = Sprite::createWithSpriteFrameName("defenceBall.png");    this->addChild(ball);    ball->setPosition(Vec2(size.width * 0.5, size.height * 0.5) + Vec2(0, 10));     OvalConfig config;    config.a = 100;    config.b = 20;    config.centerPosition = ball->getPosition();    config.moveInAnticlockwise = true;    config.zOrder = make_pair(-1, 0);    auto moveAction = MoveOvalBy::create(1.0, config);     ball->runAction(RepeatForever::create(moveAction));

转载于:https://www.cnblogs.com/blfshiye/p/5040004.html

你可能感兴趣的文章
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>