cocos2d 走动椭圆
生活随笔
收集整理的這篇文章主要介紹了
cocos2d 走动椭圆
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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 zOrderstd::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 走动椭圆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到自己母亲出车祸预示着什么
- 下一篇: 梦到墓碑倒了是什么意思