日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d 走动椭圆

發布時間:2023/11/29 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 走动椭圆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。