1

Cocos2D を使用して、シューティング ゲームの弾幕スタイルのゲームを作成します。1 本の指でドラッグして船を動かし、隅に火の層があります。

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

タッチ ダウン ポイントが 2 つの「発射ボタン」レイヤーのいずれかの内側にある場合は、発射イベントをトリガーします。それ以外の場合は、プレイヤー船の新しい場所を設定します. タッチが火層エリアの外に移動すると、プレイヤーの船に新しい場所を設定します。

問題: Fire レイヤー内から非 Fire レイヤー スペースに指をドラッグすると、「タッチ ムーブ セット プレーヤーの位置」ルールにより、船がそのポイントにジャンプします。

どうすればこれをより適切に設計できますか?

おそらく、「タッチオブジェクト」の配列が必要であり、火のレイヤーの境界を越えるときにそれらを無効にします。ここで、タップしている場所を場所の配列と比較する「タッチオブジェクト」クラスをハックすることなく、理解すれば必要なコントロールを提供するタッチ処理に関する重要な概念が欠けているように感じます。

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

(はい、見ました:レイヤーが重なっているときにタッチ処理を 1 つのレイヤーに制限するにはどうすればよいですか?。それは私の質問には答えません。rectContainsPoint は、タッチが火のレイヤー内にあるか外にあるかを判断する方法です)。

4

1 に答える 1

1

touchesBegan にフラグ (BOOL ivar) を設定して、火災エリアでタッチが開始されたことを示すことができますか?このフラグが設定されている場合、船を動かさないでください。touchesEnded で再設定します。

それは単純すぎるように聞こえるので、おそらく何かが欠けています。

私は確かにそうでした。マルチタッチを処理するには、質問で推測したように配列が必要です-タッチが始まったときに、タッチが発砲ゾーンにある場合はそれを配列に追加し、その後そのタッチで船を動かさないようにします。終了したタッチで削除します。UITouch docs の次のメモを除いて、これについて間違っていることやハッキリしていることは何もありません。

UITouch オブジェクトは、マルチタッチ シーケンス全体で持続します。イベントを処理するときは、UITouch オブジェクトを保持しないでください。あるフェーズから別のフェーズへのタッチに関する情報を保持する必要がある場合は、その情報を UITouch オブジェクトからコピーする必要があります。

でもその粘り強さが、あなたのやりたいことを支えているようです。cocos2d で別のクラスが使用されているかどうかはわかりませんが、原則は同じです。

于 2011-12-17T07:34:27.247 に答える