よろしくお願いします。
C++とCocos2d-xを触りだして一週間程度です。
ゲームの制作において円運動を使いたいのですが、C++とCocos2d-xというものを触ってからとても日が浅いです。
Sceneの作成や遷移は出来ますが、ゲームの動きとなる部分が全く進まず、コードが全く思いつきません。
携帯向けのゲームですので、円の中心は画面の真ん中に考えています。
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
こんにちは Cocos2d-x 等を使っている者です
Cocos2d-x(C++版)として回答します
###■方法1、フレーム単位に呼んでもらい自分で動きを付ける
this->scheduleUpdate() を呼ぶとフレーム単位で自身の update がコールされるので、update で setPosition() などを使って動きを付けます。
自レイヤーを作り init でスケジュールする。
※レイヤーではなく自分のシーンクラスでも構いません。
C++
1bool MyLayer::init() 2{ 3 ..略 4 this->scheduleUpdate(); 5 ..略
すると自レイヤークラスの update メソッドが約 1/60 秒ごとに呼ばれる
自転
C++
1void MyLayer::update(float delayTime) // delayTime がフレーム時間(秒)です 2{ 3 float newRot = _sprite->getRotation() + delayTime * _angVel; 4 _sprite->setRotation( newRot ); 5}
公転
C++
1void MyLayer::update(float delayTime) // delayTime がフレーム時間(秒)です 2{ 3 // レイヤーの中心座標 4 Size siz = this->getContentSize(); 5 Vec2 center( siz.width/2, siz.height/2 ); 6 7 // 画面のサイズならこちら 8// auto pDirector = Director::getInstance(); 9// Size siz = pDirector->getWinSize(); 10 11 _revo += delayTime * _angVel; // 時間経過による角度を更新 12 13 float r = CC_DEGREES_TO_RADIANS( _revo ); // 度数法を弧度法へ 14 Vec2 newPos( _len * cosf(r), _len * sinf(r) ); 15 _sprite->setPosition( center + newPos ); 16}
以下をメンバーなどで事前に定義&設定したとする
C++
1Sprite* _sprite は create & addChildしたスプライト 2float _angVel は自転角速度 (度数法) 3float _revo は公転角度 (度数法) 4float _len は公転で中心からの距離 (pixel)
・参考
http://study-cocos2d-x.info/move-object/123/
###■2、アクションで動きを付ける
条件などによる細かな動きがなければアクションで行うと簡単です。
自転
C++
1 _sprite->runAction( 2 RepeatForever::create( // 無限に動かす 3 RotateBy:crete( 0.5f, 90 ) // 0.5 秒あたり 90 度+ 4 ));
公転
C++
1 // レイヤーの中心座標 2 Size siz = this->getContentSize(); 3 Vec2 center( siz.width/2, siz.height/2 ); 4 5 _sprite->runAction( 6 RepeatForever::create( // 無限に動かす 7 ActionFloat::create( 2.0f, 0, 360, // 2 秒で 360 度+ 8 [this, center](float angle) // C++ のラムダ式で処理 9 { 10 float r = CC_DEGREES_TO_RADIANS( angle ); // 度数法を弧度法へ 11 Vec2 newPos( _len * cosf(r), _len * sinf(r) ); 12 _sprite->setPosition( center + newPos ); 13 }) 14 ));
他にも多くのアクションがあります。
- MoveTo::create で移動
- ScaleTo::create で拡大縮小
- TintTo::create で色変化
- FadeTo::create でフェードインアウト
- Sequence::create で流れが組めます。(回転後に移動してその後でフェードアウトするなど)
- Spawn::create で組み合わせができます(回転しながら移動しつつ同時に色変化など)
- DelayTime::create で時間待ち
- RemoveSelf::create で自動削除ができます
これ以外にもアクションがあります。
・参考
プロジェクト cpp-tests の 3.Actions ~ 5.Actions を参照
コードは ActionsTest/ActionsTest.cpp ActionsEaseTest/ActionsEaseTest.cpp など
http://cocos2d-x.org/docs/programmers-guide/actions/
(chrome ならば右クリックで日本語に翻訳)
###■方法3、物理エンジンで動きを付ける
余談ですがこのような方法もあるという事で、モーターや関節でクランクなどもできます。
基本的な物理シーンの設定
http://qiita.com/KawabataLemon/items/7da1072e0ecfadb7490b
動きや値の設定例
http://qiita.com/tadamatu/items/df7e9ad060462936fcde
プロジェクト cpp-tests の PhysicsTest を参照
###■補足
update や runAction は Node クラスの仕様なので、Sprite だけではなくシーンやレイヤーやボタンやラベルなど全てのパーツに使えます。
ボタンにアクションをつける
C++
1 MenuItemSprite* menuItem; 2 menuItem->runAction( ~ 3 4 ui::Button* button; 5 button->runAction( ~
例えばキャラの種類が多くあり、種類ごとに異なる動きを付ける場合、レイヤーの update で行うと複雑なコードになりますが、スプライトごとにクラス分けして動きを付けるとスマートになります。
C++
1class BattleShip02 : public Sprite 2{ 3};
という自スプライトクラスを作り
C++
1bool BattleShip02 ::init() 2{ 3 this->scheduleUpdate(); 4 ・・略 5 6void BattleShip02 ::update(float delayTime) 7{ 8 this->setPosition( ~ ); 9 などで動きをつける 10}
と実装する事もできます。
投稿2016/12/04 06:11
総合スコア35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/26 06:19
2016/07/26 06:34 編集
2016/07/26 06:43
2016/07/26 06:48
2016/07/26 06:53
2016/07/26 06:55
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。