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

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

新規登録して質問してみよう
ただいま回答率
86.02%
Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

受付中

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

MeramiNium.F
MeramiNium.F

総合スコア28

Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3回答

0グッド

0クリップ

2753閲覧

投稿2016/07/26 05:54

よろしくお願いします。

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

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

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

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

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答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

roasan

総合スコア30

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

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

投稿2016/11/30 14:24

kyu0224

総合スコア12

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

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

投稿2016/07/26 06:08

episteme

総合スコア16009

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

MeramiNium.F

2016/07/26 06:13

回答ありがとうございます。 けど、このページでのCocosのバージョンはかなり古いもののようで読解して組めるかどうか...
episteme

2016/07/26 06:19

ざっくり読んでみたかぎり、「定期的に呼ばれるトコロがあるので、そこで位置の更新とスプライトの移動をする」ってだけのことみたい。現バージョンってそんなに大きく変わってるんですか?
MeramiNium.F

2016/07/26 06:34 編集

コードの書き方は全体的に違ってますね。 []なんて私使ったことないです... 私もざっくり読んでみて正直サッパリなので、毎フレーム更新かけるように作ってしまったほうがわかりやすくていいような気がします。 ですが、これだと目的の円運動まで果たせるかどうか...
episteme

2016/07/26 06:43

> []なんて私使ったことないです... あー...Objective-C ベースだからでしょうねぇ。 Cocos-2d 本家のドキュメント/チュートリアル読むか教本一冊入手するのが近道だと思いますよ。netで探すのはタダだけど効率悪いし(今回みたいに旧いの見つけてガッカリとか
MeramiNium.F

2016/07/26 06:48

あーー、すいません、書いていませんでした。Windows10でCocos2d-x動かしてます。 なるほど...確かに、事前に色々調べましたが、有力そうな事が書いてあるサイトに限って古いバージョンってのが多かったですね... 効率悪いのは明確に今回わかったので、帰りに本を買って出直します。 ありがとうございました、またよろしければお願い致します。
episteme

2016/07/26 06:53

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

2016/07/26 06:55

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

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。