ブログBlog

「cocos2d-x:MoveToで、目的位置とズレる。MoveToをupdate()内で呼ぶ」

投稿日:2014年09月29日

こんにちは。平野洋平です。
もうすぐ10月になります。
月見の季節も、ハンバーガーでしか味わっていないような気がします。
今年も早あと3か月。
あっという間です。

今回の話題も、最近プログラムを書いていて悩んだ問題です。
前回の話題にも、少し関係あります。
update()です。この関数は、1フレーム毎(約1/60秒ごと)に呼び出されます。
そのタイミングで、画面を更新してアニメを表現したり、
タイミングごとに時間を足し合わせていって、経過時間を計ったりしています。

<参考サイト>http://d.hatena.ne.jp/DiegoTristan/20130803/1375539009

今回の話題については、この<参考サイト>にお世話になりました。
今回の問題点をざっくりというと「モノを動かす関数とフレーム」です。

CCAction系というモノを動かす関数があります。
例えば、CCMoveToなどがそれに当たります。
これらの関数は、1フレーム毎にモノの移動量を計算するので、
もしフレームの中で何回も呼び出していたら、
毎フレームごとに、どんどん移動量が足されていってしまい、どんどん先のほうへ進んでしまいます。

その解決策として、参考サイトで扱っているのが、
1.このようなアクションを同時に2つ走らせない
2.元々あるマクロ定義を利用する
3.スワイプ中( CCTouchMoved 内)に、このようなアクションを走らせない
でした。
今回私は、一番手軽そうな 2.マクロを利用 を用いました。
問題のマクロですが、cocos2dx > include > ccConfig.h の中にあります。
 CC_ENABLE_STACKABLE_ACTIONS がそれです。
以下にコメントの大体の和訳を載せときます。
「 CC_ENABLE_STACKABLE_ACTIONS について
  これを可(1)にした場合、 位置を変更するような関数 (例: CCMoveBy, CCJumpBy, CCBezierBy, 等ナド)
  の移動量は積算されます。
  だから、一つの node(対象) に対して同時に、2つ以上”位置”を変更するようなアクションを走らせると、
  最終的に行き着く場所は、その積算された移動量の合計になります。
  また、これを不可(0)にした場合は、直近に走らせたアクション(の移動量)のみが有効になります。
  デフォルト:初期設定は「可(1)」です。
  また、v.2.0までの古いバージョンではこのようなアクションの競合は起こりません。 」
つまり、このマクロを、(0)にすればいいわけです。
これで、update()内で呼ばれるMoveToの問題は解決しました。

PAGE TOP