今回はCocos2d-xのupdateメソッドでボールを動かしていきます。
さて前回の続きですが、
- ボールをタップすると矢印画像を表示する。
- そのままタップを移動することで、矢印画像を360度回転できる。
- タップを離すとボールが指定された角度で移動する。矢印画像は削除する。
という3つの仕様がありました。残っているのは仕様3の「タップを離すとボールが指定された角度で移動する。」というところです。
プログラム実装
それではプログラムを記述していきましょう。以下のコードを追加してください。
HelloWorldScene.h
void update(float dt); int _speed = 50; bool _isBallMoving = false;
HelloWorldScene.cpp HelloWorld::init
scheduleUpdate();
HelloWorldScene.cpp HelloWorld::update
void HelloWorld::update(float dt){ if(_isBallMoving){ float x = _ball->getPosition().x - _speed*cosf(CC_DEGREES_TO_RADIANS(_degree)); float y = _ball->getPosition().y + _speed*sinf(CC_DEGREES_TO_RADIANS(_degree)); _ball->setPosition(Vec2(x, y)); } }
HelloWorldScene.cpp HelloWorld::onTouchEnded
void HelloWorld::onTouchEnded(Touch* pTouch, Event* pEvent){ if(_allow != nullptr){ _allow->removeFromParent(); _allow = nullptr; } _isBallMoving = true; }
※前回のonTouchEndedに、ハイライトしている7行目を追記して下さい。
・update
cocos2dxのメソッドで、デフォルトではユーザの操作有無に関わらず、1/60秒毎に実行されます。この中でボールの位置座標を更新することでボールが動いているように見えます。
プログラム解説
ボールの移動処理
画面をタップした際に角度を取得します。取得した角度にスピードとCos、Sinで計算して得られたX軸方向の移動量、Y軸方向の移動量を、updateメソッド内でボールの座標に加減算することでボールの移動が可能になります。
updateは1/60毎に実行されます。この1/60秒はよくフレームと呼ばれます。他のゲームやテレビも、フレーム毎に画面を更新することで動きを表現しているわけです。
ボールの移動タイミング
「_isBallMoving」フラグを定義してタップを放した際にtrueにします。そうすることで、タップを放したタイミングでupdate内部の処理が有効になり、ボールの移動が可能となります。
シミュレータの起動
それではシミュレータを起動しましょう。
土星に向けてスイングバイ!どうでしょうか。ボールが移動したかと思います。そしてそのまま画面外へ・・・
次回はボールを画面外に飛ばさないようにしたいと思います。
次回