質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

Cocos2d-xで円運動を行わせたい

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,783

MeramiNium.F

score 30

よろしくお願いします。

C++とCocos2d-xを触りだして一週間程度です。
ゲームの制作において円運動を使いたいのですが、C++とCocos2d-xというものを触ってからとても日が浅いです。

Sceneの作成や遷移は出来ますが、ゲームの動きとなる部分が全く進まず、コードが全く思いつきません。

携帯向けのゲームですので、円の中心は画面の真ん中に考えています。

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

まったく触ったこともないけれどここ読めば作れそうな気がする(2page目あたり)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/26 15:48

    あーー、すいません、書いていませんでした。Windows10でCocos2d-x動かしてます。
    なるほど...確かに、事前に色々調べましたが、有力そうな事が書いてあるサイトに限って古いバージョンってのが多かったですね...

    効率悪いのは明確に今回わかったので、帰りに本を買って出直します。
    ありがとうございました、またよろしければお願い致します。

    キャンセル

  • 2016/07/26 15:53

    あとは 「知ってそうな人」 または 「知ってそうな人を知ってる人」 と
    お友達になることです。 コミュニティを見つけるのがいちばん。

    キャンセル

  • 2016/07/26 15:55

    なるほど、アドバイスありがとうございます

    キャンセル

0

初めまして! cocos2d-xの検索から来ました。
もしご自分で解決済みでしたら、あれなのですが、私もcocos2d-xを使いいろいろとしているので、にわかですが回答をさせていただきます!
まず、cocos2d-xのバージョンと、なにをどう動かしたいかを書いていただけると幸いです!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは Cocos2d-x 等を使っている者です
Cocos2d-x(C++版)として回答します

■方法1、フレーム単位に呼んでもらい自分で動きを付ける

this->scheduleUpdate() を呼ぶとフレーム単位で自身の update がコールされるので、update で setPosition() などを使って動きを付けます。

自レイヤーを作り init でスケジュールする。
※レイヤーではなく自分のシーンクラスでも構いません。

bool MyLayer::init()
{
  ..略
  this->scheduleUpdate();
  ..略


すると自レイヤークラスの update メソッドが約 1/60 秒ごとに呼ばれる

自転

void MyLayer::update(float delayTime)    // delayTime がフレーム時間(秒)です
{
  float newRot = _sprite->getRotation()  +  delayTime * _angVel;
  _sprite->setRotation( newRot );
}

公転

void MyLayer::update(float delayTime)    // delayTime がフレーム時間(秒)です
{
  // レイヤーの中心座標
  Size siz = this->getContentSize();
  Vec2 center( siz.width/2,  siz.height/2 );

  // 画面のサイズならこちら
// auto pDirector = Director::getInstance();
// Size siz = pDirector->getWinSize();

  _revo += delayTime * _angVel;  // 時間経過による角度を更新

  float r = CC_DEGREES_TO_RADIANS( _revo );  // 度数法を弧度法へ
  Vec2 newPos( _len * cosf(r),   _len * sinf(r) );
  _sprite->setPosition( center + newPos );
}

以下をメンバーなどで事前に定義&設定したとする

Sprite* _sprite は create & addChildしたスプライト
float   _angVel は自転角速度 (度数法)
float   _revo   は公転角度 (度数法)
float   _len    は公転で中心からの距離 (pixel)

・参考
http://study-cocos2d-x.info/move-object/123/

■2、アクションで動きを付ける

条件などによる細かな動きがなければアクションで行うと簡単です。

自転

_sprite->runAction(
    RepeatForever::create(         // 無限に動かす
      RotateBy:crete( 0.5f, 90 )   // 0.5 秒あたり 90 度+
    ));

公転

// レイヤーの中心座標
  Size siz = this->getContentSize();
  Vec2 center( siz.width/2,  siz.height/2 );

  _sprite->runAction(
    RepeatForever::create(                 // 無限に動かす
      ActionFloat::create( 2.0f, 0, 360,   // 2 秒で 360 度+
      [this, center](float angle)          // C++ のラムダ式で処理
      {
         float r = CC_DEGREES_TO_RADIANS( angle );  // 度数法を弧度法へ
         Vec2 newPos( _len * cosf(r),   _len * sinf(r) );
         _sprite->setPosition( center + newPos );
      })
    ));

他にも多くのアクションがあります。

  • 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 だけではなくシーンやレイヤーやボタンやラベルなど全てのパーツに使えます。

ボタンにアクションをつける

MenuItemSprite* menuItem;
  menuItem->runAction( ~

  ui::Button* button;
  button->runAction( ~

例えばキャラの種類が多くあり、種類ごとに異なる動きを付ける場合、レイヤーの update で行うと複雑なコードになりますが、スプライトごとにクラス分けして動きを付けるとスマートになります。

class BattleShip02 : public Sprite
{
};

という自スプライトクラスを作り

bool BattleShip02 ::init()
{
  this->scheduleUpdate();
  ・・略

void BattleShip02 ::update(float delayTime)
{
  this->setPosition( ~ );
  などで動きをつける
}

と実装する事もできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる