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<int, int> 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));

http://www.waitingfy.com/archives/1343

cocos2d 走动椭圆的更多相关文章

  1. cocos2d 高仿doodle jump 无源代码

    1. 游戏视频 主角眼熟吗?没错,上次跑酷游戏中的"30"来Jump了,有三种道具.主角光环,竹蜻蜓.翅膀: 有两种怪物,螃蟹和鸟: 有5种板子.点击屏幕,30会把它的嘴巴3给发射 ...

  2. Cocos2d入门--2--三角函数的应用

    其实,三角函数的知识点是初中的数学基础.但是在编程里合理的利用的话,也会很好玩的,可以制作出很多有趣的动画特效. 首先要注意的是 角度 和 弧度 的转换. 360度 = 2×PI弧度 180度 =   ...

  3. 小尝试一下 cocos2d

    好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...

  4. 采用cocos2d-x lua 制作数字滚动效果样例

    require "Cocos2d"require "Cocos2dConstants"local testscene = class("testsce ...

  5. [svg翻译教程]椭圆(ellipse元素)和线(line元素)

    line 先看个例子,这是svg中最简单的线 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http:/ ...

  6. Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板

    很久没有写博客了,这段时间比较忙,又是搬家又是做自己的项目,还有太多琐碎的事情缠身,好不容易抽出时间把最近自己做的一些简单例子记录一下. 在我的项目中,我需要一个显示面板来显示游戏中的一个三维数据,例 ...

  7. iPhone开发与cocos2d 经验谈

    转CSDN jilongliang : 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE.开发框架uikit,还有开 ...

  8. iOS 2D绘图 (Quartz2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    博客原地址:http://blog.csdn.net/hello_hwc?viewmode=list 让我们继续跟着大神的脚步前进吧.这一次 我们学习一些Quartz 2D 最基本的一些用法. 前言: ...

  9. 《图形学》实验七:中点Bresenham算法画椭圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...

随机推荐

  1. Linux权限操作 [转]

    Linux权限操作 本文内容来自<鸟哥linux私房菜>读后个人做的笔记,该书实为学习linux的很好入门教材 一.文件属性 ls ls -al列出所有的档案属性 ls是List的意思 档 ...

  2. MSSQL - 存储过程取出5条热点新闻

    USE [DB_News] GO /****** Object: StoredProcedure [dbo].[SelectHotNews] Script Date: 2015/7/8 13:34:4 ...

  3. 【Ubuntu】升到14,攻克了进入用户后没有菜单条导航栏的问题

    控制台还能够进,用ctrl+alt+f1用老账号登录,用sudo adduser test新建立一个名字叫test的帐号 然后就能够进去了,可能是配置文件坏掉了

  4. Effective C++_笔记_条款02_尽量以const、enum、inline替换#define

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#d ...

  5. 遇到Audio/Speech相关问题,如何抓取log

      [DESCRIPTION] 遇到Audio/Speech相关问题时,经常需要抓取相关log信息,总结抓取方法如下 [SOLUTION] 1.    通话声音相关的问题: Case 1: 通话中某一 ...

  6. jquery mobile 对手势触控提供了如下几个事件监听:

    jquery mobile 对手势触控提供了如下几个事件监听: 复制代码代码如下: tap  当用户点屏幕时触发taphold 当用户点屏幕且保持触摸超过1秒时触发swipe 当页面被垂直或者水平拖动 ...

  7. CSipSimple最新版本号

    要使用CSipSimple有两种方法:第一种是不编译jni,另外一种是编译jni. 这里介绍的是第一种:不编译jni. 首先,用SVNclient检出CSipSimple源代码:svn checkou ...

  8. 编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上

    编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上 作者:雨水  日期:2014-04-30 编译源码的目的还是为了自己改动源码,然后还可以执行在相应的手机 ...

  9. Cocos2dx中Plugin-X 在android下的整合

    直接拉plugin-x中的jar包导入到Eclipse中就可以.用这么麻烦的工具干嘛.

  10. 利用iframe技巧获取訪问者qq

    今天工作时,有个暂时加的好友问我,怎么利用web页面获取訪问者的qq. 曾经没有接触过,感觉到非常好奇,可是工作中脑子非常亢奋,转的快,利用所学的知识迅速想到一条技巧,那就是假想用户在进入我们设定的页 ...