2012-05-13 9 views
5

私のアプリでは足を持っているキャラクターがあり、私のアプリでは別のCCSpriteの上に立っているように見えるようにしたいので、画面(アニメーション)を移動します。私はちょうど把握することができない少し位置決めの問題がある以外はすべてが正常に働いています! 問題をもう少し説明しましょう。文字がCCSpriteの上にあるとき、文字が非常に速い間隔で約10ポイントアップ/ダウンするようです。他のCCSpriteの上にCCSpriteポジショニングの問題があり、画面がアニメーション化されますか?

これはなぜ起こっているのですか?

ありがとうございます!

最終編集:私はこのすべてを手伝ってくれてありがとう。最初は、投稿が長すぎるため、他の編集内容をすべて削除しました。何らかの理由で古い編集内容を参照する必要がある場合は、編集履歴を調べてください。

約1時間のテストの後、私はあなたが先に述べた1つの問題に絞り込みました。文字と床の部分が衝突しているかどうかを調べるif文は、ではありません彼らがSHOULDのときにループしてください(UI内で見える限り)。

マイcocosGameLoopログが外であり、あなたは以下を参照することができますよう、衝突検出コードのすべてが、まだゲーム内

loop.f前に、私は私のNSLogsにパターンをも気づいている:

2012-05-27 17:00:54.791 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.811 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.825 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.841 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.858 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.874 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.891 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.908 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.924 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.928 App[2769:707] collisiontwo 
2012-05-27 17:00:54.929 App[2769:707] two 
2012-05-27 17:00:54.941 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.944 App[2769:707] collisiontwo 
2012-05-27 17:00:54.945 App[2769:707] two 
2012-05-27 17:00:54.958 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.974 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.991 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.008 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.025 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.043 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.058 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.076 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.078 App[2769:707] collisiontwo 
2012-05-27 17:00:55.078 App[2769:707] two 
2012-05-27 17:00:55.091 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.094 App[2769:707] collisiontwo 

私がNSLogのキャラクタのY座標を知ったのは、それがいくつかの介入のために同じポイントの周りにあるということです(上記のNSLogでcocosGameLoopコールの束と一致するように衝突する必要があるときでも)実際には(プログラム的に)衝突し、前のY座標から約14ポイント上に移動します。したがって、上下に約14ポイントのジッタがあります。

結論はどのようにすれば衝突コードがすべての繰り返しと呼ばれ、約14ポイントのジッタがないようにするのですか?アンカーポイントを変更したくないのは、アニメーションの配置などが乱れるからです。とにかく、何をお勧めしますか?また、私はCocos2Dコードですべてを保持する必要があるので、私は衝突検出のためにBox2Dを使用していることに留意してください。

最後に、私のアプリで重力のために丸めポイントエラーがあると思ったが、重力を整数に変更したような値をつぶしても、ちらつきが修正されず、100%私が上記の問題。

とにかく、これは問題の中心で、私はあなたが私ができない何かを見ることができると思います!あなたの考えを教えてください:)

ありがとうございました!

+0

申し訳ありませんが、あなたがここに置いた係数は私を文脈から感じさせてくれます。 WHOLEステートメントをelse以外の場所に配置できますか? – Coder404

+0

もっと多くの文脈を提供するためにいくつかのコードを追加しました。また、大きなコメントアウトラインの下では、else ifで始まります。なぜなら、衝突検出のためのif文がいくつかありますが、この問題には関係していないからです。 –

+0

あなたはおそらくあなたのタグに(トラフィックの増加のために)あなたのタグにBox2dを追加し、 – Coder404

答えて

3

最初のことは、Some other tag collision checking beforeのコメントの直後にタグをチェックすることです。これは、より理にかなって:

else if ((spriteA.tag == 1 && spriteB.tag == 5) || (spriteB.tag == 1 && spriteA.tag == 5)) 
... 
else if ((spriteA.tag == 6 && spriteB.tag == 1) || (spriteB.tag == 6 && spriteA.tag == 1)) 
... 

すなわち、これはあなたがに対してテストしている衝突接触があなたのいずれかの順番で2体を与えることができることを前提として - 例えば接触する聴取者は、身体Aとして足を身体B、足を身体A、身体を身体Bとして与えることができる。上記のステートメントは、注文に関係なく、同じ条件ブロックを実行することを保証します。実行パスが2つのelse ifブロックの間で振動している可能性があります。そのため、間違ったブロックに入ると誤った位置に設定されますか?

これらの条件がすべて正しいと仮定すると(タグがどのようなボディも参照しているかどうかわからないため、コンタクトリスナーがどのように設定されたかなどはわかりません)、振動物理シミュレーションによるものでなければなりません。 Box2Dを使ってCocos2dでCCSpriteの位置を設定するとどうなりますか?スプライトの位置を設定すると、物理ボディの位置も変更されるのですか、または2つの別々のもの(通常、物理ボディの位置にスプライトがレンダリングされます)ですか?私はCocos2dを使ってからしばらくしていましたが、初期の段階から大幅に変更されていますので、最新のバージョンを開かずに見てもわかりません。 CCSpriteの位置を変更しても物理ボディの位置が変化する場合、これは悪いことです。すべての動きを物理シミュレーションによって制御する必要があります(物理的なボディを動かしたい場合は、位置を直接設定するのではなく、力またはインパルスを適用する)。物理学の外側で身体の位置を変更すると、物理シミュレーションの次のステップが実行されるときに、身体に振動や誤ったインパルスが適用される可能性があります。物理シミュレーションを狂わせないでスプライトの位置を変更する場合は、そのスプライトに関連付けられている物理的ボディを物理シミュレーションから削除して、その位置を直接設定したい場合は、後でそれを再追加することを検討してくださいあなたが物理学の下で行動することを望むならば。これは、フィジックスのボディを削除し、フィジックスの世界に追加/削除するためのクリーンな方法がない場合、後で再作成することを意味します。

もう1つの解決策は、一緒に移動したいボディ間のジョイントを作成することです。距離結合または溶接継手が最も適切です。これはそれらが接続される原因になるので、あなたが1つの周りを動かすと、2つの体の間の同じ距離を維持しながら、もう一方が動きます。この場合、両方とも物理シミュレーションの下で動作します。

実際、文字とその上に立っているCCSpriteの物理体の位置を変更している可能性があります。この場合、物理シミュレーションが制御されていないために悪いだけでなく、位置計算によって2つのボディがわずかに重なり合っている可能性があるため、次に物理シミュレーションを実行すると、それらを強制的に離すが、位置を変更して再び重なり合うようにして、次の更新が再び大きな力をもたらすようにする。

CCSpriteの位置を変更しても、物理ボディの位置が実際に変更されるわけではなく、基本的には、プレイヤーのレンダリング位置を物理位置が異なる別の位置に設定するだけです物理学の世界に何が起こっているのかを考える必要があります。それは何か他のオブジェクトの間で振動するか、世界から落ちていくのですか?あなたのゲームについてもっと知らなくても、何が起こっているのか判断するのは難しいです。しかし、それがあなたの位置計算に影響を与えている可能性があります。物理シミュレーションの影響を受けないでスプライトを移動したい場合は、物理世界から物理オブジェクトを削除することを検討してください。物理的なボディを扱う際には、ある種のデバッグドローを持つことは非常に貴重です。したがって、自分のスプライトやその他のアートワークに関係なく、各ボディの正確な形状と位置、そして相互作用するものを見ることができます。 Cocos2D/Box2Dコンボがこれをすぐに提供するかどうかは不明ですが、そうでない場合は、簡単にオン/オフを切り替えることで、実装を強く検討してください。考慮すべき

もう一つは、二つの文です:

if (spriteA.position.x - spriteA.boundingBox.size.height*.5 <= spriteB.position.x + spriteB.boundingBox.size.height*.5) 

if (spriteB.position.x - spriteB.boundingBox.size.height*.5 <= spriteA.position.x + spriteA.boundingBox.size.height*.5) 

あなたが新しい位置にすべてのフレームを設定するようにしますが、これらの二つの文を削除しようとした持って、代わりに待っていますいくつかのフレームにわたって構築する位置に何らかのエラーがありますか? 1つのオブジェクトを動かすときに、もう一方のオブジェクトをしっかりと取り付けたまま移動させたい場合は、フレームごとに位置を更新したいと思うでしょう。 30fpsから10fpsまでの条件を満たすだけで、30fpsとすれば、あなたが望む滑らかな動きとは対照的に、非常に目立たない動きが得られるはずです。

希望するものは、あなたの問題を解決するか、少なくともどこから見始めるべきかを知ることができます。あなたの質問に詳細情報を提供する - おそらく私が言及した仮定/未知数の一部に応答して - 私たちはあなたの問題:)

EDIT 1

たちを充填してくれてありがとうの底に得るのを助ける必要があります余分な詳細と一緒に - それは物事をはるかに明確にします。あなたがしていることは、あなたがBox2Dとの衝突検出だけを行っていることを知った今、完全に意味を成しています。

あなたの問題を解決するには、接触が行われたことを検出したあなたのforループで、この時点で文字の位置を変更するのではなくフラグを設定する必要があります例えばBOOL characterOnPlatform - 接触が検出されるとYESに設定します。その外側のforループ(必ずしも同じ方法である必要はありません - あらゆるフレームと呼ばれるどこにでもあり、どこでも最も感覚的です)ではフラグをチェックし、characterOnPlatfom == YESの場合は位置計算に文字の位置を設定します連絡先リスナーforループ内で現在やっています。つまり連絡先リスナーで何もしないでくださいforループを除いて、あなたが他の場所で参照する状態を変更します。

この変更によって、キャラクターがプラットフォームで正確に移動するようになります。プレイヤーがジャンプなどの入力を行った場合、キャラクターをプラットフォームから飛び越えることができるようにするには、そのフラグをNOに戻す必要があります。そうしないと、希望の移動が強制的にオーバーライドされ、プラットフォーム上で

EDIT 2

それはあなたの新しいコードで起こっている正確に何を見て本当にことはできません。たとえば、resetgravityメソッドでは何が起こっていますか? hasCollidedをどのようにNOに設定しますか(キャラクターがプラットフォーム上に存在しなくなったことをどのように検出しますか)あなたのキャラクターは、上下動でまだジッターがかかっていますか?またはあなたが以前とは違った点滅をしていますか?

あなたがまだ上下運動をしていると仮定すると、あなたが掲示したコードがすべての単一フレームで呼び出されていないか、または他の測位コードと戦っている例えば、プレイヤーの入力に応じてキャラクターを移動させる場所、重力などを適用する場所)。

プラットフォーム上の文字を保持するコードでは、位置が高くなりすぎてプラットフォーム上の文字として検出されないことを確認してください。悪意のある円に終わるでしょう:

  • 文字が
  • 文字位置がちょうど
  • 文字はもはやプラットフォームと衝突しているプラ​​ットフォームの上になるように設定されているプラ​​ットフォームと衝突し、その
  • 文字が下向きに下がる位置決めコードは、プラットフォーム上で彼の位置を変更するために実行されません支払う文字はプラットフォームと
  • を衝突重力の影響(またはしかし、あなたがこれをシミュレート)
  • に...

そのような場合、あなたは文字が衝突していないときの検出を改善する必要がありますキャラクタがプラットフォームとわずかに交差したままになるようにポジショニングコードをオフセットします(視覚的に悪いと思われない場合は、SpriteをBox2Dシェイプからわずかにオフセットして、物理ボディがプラットフォームとわずかに交差するようにすることができます)キャラクターの足はプラットフォーム上に正確に表示されます。

EDIT 3

あなたはジッタの原因となることができ、物事の多くを支配してきたようですね!私は別のゲーム開発者に尋ねました。彼はあなたの問題は、世界の空間からスクリーン空間への変換によって引き起こされる可能性があると提案しました。キャラクターの世界的な位置と、レンダリングされるスクリーンの位置をログアウトすることができます(これは、この変換が行われるCocos2Dのコードを変更することを意味する可能性があります)。少なくともログアウトされた値を見ると、ジッタ/振動する値を絞り込むのに役立ちます。たとえば、浮動小数点精度を整数に切り捨てるなど、丸め点の誤差が存在するかどうかを調べることもできます。あなたのジッタは、+または - 1ピクセルの領域にしかないようであれば、世界の位置とスクリーンの位置を調べる価値があります。これらの値のロギングは、フレームごとにデバッガを停止するよりもはるかに簡単です。

+0

上記の私のedit1をチェックしてください! –

+0

あなたの追加の詳細について私の答えで追加の詳細が提供されています:) –

+0

また、キャラクターがプラットフォーム上にあるときに、それがその上にあるときにも左右に動くことができることを追加したいと思います。ユーザーの入力に基づいているときはいつでも、それは移動して落ちるはずです。 –

関連する問題