2011-12-17 8 views
1

Cocos2Dを使用してシューティングアップの弾丸地獄スタイルのゲームを作成します。 1本の指がドラッグして船を移動し、コーナーに火の層があります。1つのレイヤーから始まり、ccMovedコール(またはtouchesMoved)を防止するタッチを食べる

私のメインレイヤーから、ccTouchesBegan、ccTouchesMovedおよびccTouchesEndedを検出します。 CGPointをロジックコントローラに渡します。

タッチダウンポイントが2つの「ファイヤーボタン」レイヤーのいずれかにある場合、私は火事イベントをトリガーします。それ以外の場合は、プレイヤー船の新しい場所を設定します。炎の層の領域の外にタッチが移動すると、プレイヤーの船の新しい場所が設定されます。

問題:ファイアレイヤー内の指をドラッグして非ファイアレイヤースペースにすると、「プレイヤーの位置を設定するタッチ移動」ルールのために船がそのポイントにジャンプします。

どのようにこれをよりうまく設計できますか?

「タッチオブジェクト」の配列が必要なのかもしれません。そして、ファイアレイヤの境界を越えるときにそれらを無効にします。私は、タッチ操作に関する重要な概念が不足していると思います。わかっていれば、どこの場所にタップしているのかを比較する「タッチオブジェクト」クラスをハックすることなく、コントロールを与えたいと思います。

お知らせください。ありがとう!

(はい、私は見ました:How do I limit touch handling to one layer when layers overlap?。私の質問には答えられません。rectContainsPointは、タッチがファイアレイヤーの内外にあるかどうかを判断する方法です)。

答えて

1

touchesBeganにフラグ(BOOL ivar)を設定して、接触が火災領域で開始されたことを示すことができます。このフラグが設定されている場合、船を移動しないでください。あなたはtouchesEndedでそれを再設定します。

あまりにも単純すぎると聞こえるので、おそらく何か不足しています。

私は本当にありました。マルチタッチを扱うには、質問で推測するような配列が必要です。タッチが始まったときにタッチが火災ゾーンにあった場合は、アレイに追加してから、引き続き船を移動させないでください。終了時に削除を終了します。

UITouchオブジェクトは、マルチタッチシーケンスを通して永続的です。これは、私が間違っていたり、ハッキーではありません。イベントを処理するときは、UITouchオブジェクトを保持しないでください。あるフェーズから別のフェーズへの接触に関する情報を保持する必要がある場合は、その情報をUITouchオブジェクトからコピーする必要があります。

しかし、永続性は、あなたがしたいことをサポートするようです。私は別のクラスがcocos2dで使用されているかどうかはわかりませんが、原則は同じです。

+0

"移動"領域で2回目をタップすると、接触がワープから始まるのを防ぐために、火災領域のタッチ*ではない*にBOOL iVarを設定しています。 あなたの解決策は動作しません。なぜなら、プレイヤーは同時に移動して発砲できるからです。私が火を打つことからivarをマークし、私の主な動きの指が動くなら、何も起こりません。 (迅速な対応ありがとう) – quantumpotato

+0

プレイヤーが火災エリアに触れてそこから引きずり出すとどうなりますか?船を動かすためにさらに触れることを許している間に、その特定のタッチを無視したいのですか? (私は何かが欠けていたと言っていました - 何かがマルチタッチでしたか?) – jrturton

+0

はい - そうです! 私はこの質問のより簡単なバージョンをここに尋ねました: http://stackoverflow.com/questions/8543473/ignoring-touchesmoved-for-subsequent-touches-while-counting-touchesbegan-total実際には、もっと難しいかもしれません。複数のレイヤーが存在しないためです。 (普遍的な答えがある場合は、フラグを立てる) – quantumpotato

関連する問題