3
Cocos2d-iphone 1.0.1.
  • 私のメインのゲーム シーンでは、プレイヤーが指で画面を押してキャラクターを動かす必要があります。
    • キャラクターが動いている間(指が画面を押している間)、戦闘が発生する場合があります。そのような戦闘は、にプッシュされる新しいCCSceneをトリガーします(したがって、メインのゲーム シーンはまだメモリ内に存在します)。CCDirector
    • 戦闘中、当然、プレイヤーはどこかで指を離すでしょう。
    • バトルが終わると、これCCSceneポップされます。したがって、メインのゲーム シーンが返されます。
  • ここで問題が発生します。メインのゲーム シーンでは、戦闘前に最初に画面を押していた指が同じポイントを押し続けていると考えられているため、ジョイスティックはまだ「機能」しており、プレイヤーは実際に動いいます。指が画面を押していないことを確認します。

画面タッチを「リセット」する方法はありますか? onEnterメインのゲームシーンのやり方でやりたいです。私は次のようなものを試しました

self.isTouchEnabled = NO;
self.isTouchEnabled = YES;

そのようなことがタッチディスパッチャーを再登録し、何らかのリセットを引き起こすことを期待しています。それは動かなかった。

基本的には、メインのゲーム シーンに「おい、どう考えても誰も画面に触れていない」と伝える方法が必要です。

編集

再度画面を押すと固定されますのでご注意ください。

4

3 に答える 3

1

問題を確実に理解するには:

戦闘シーンをポップした後、ユーザーがジョイスティックから指を離したことがないかのように、キャラクターは動き続けますか?

私の最初の考えは、コードのどこかに根本的な設計上の欠陥があるということです。入力を処理するために少なくとも1つのレイヤーを使用したいというのは私の理解です。その「ゲーム」CCScene のすべてを「ゲーム」CCLayer にシフトして、レイヤーをシーンの子として追加してみてください。次に、レイヤーを登録してタッチ入力を受け取ります。

それがうまくいかない場合は、いつでもフラグを使用できます。自分がいるシーンと自分が入りたいシーンを比較し、そうでない場合はジョイスティック コントローラーをアクティブにしないでください。ハックのようなものですが、動作します。

于 2012-12-10T02:39:53.770 に答える
0

おそらく最も簡単な解決策は、CCDirector で戦闘シーンのポップが完了したら、最初に呼び出しresignFirstResponderてから、問題のあるビューで「becomeFirstResponder」を呼び出すことです。とにかく、私の頭の上から離れて、タッチを別のレスポンダーに転送する必要があるようです。

UIView メソッドへのより複雑なダイブは、このプライベート コールを提供しますcancelTouchTracking。ほとんどの場合、@skytz がまとめたものと同様のことを行います。警告: 最後はほとんどの場合、アプリ ストアのプロセスで拒否される可能性がありますが、参考までに説明します。

私はより簡単な解決策を選び、それがうまくいくことを願っています。O_o

于 2012-12-14T07:36:43.273 に答える
0

私はこの種の問題に遭遇しました。

どのように修正しましたか:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches){
[touchesOnScreen addObject:touch];
}
}

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches){
[touchesOnScreen removeObject:touch];
}}

- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{

[touchesOnScreen removeAllObjects];
}

したがって、基本的に iOS は画面上のすべてのタッチへのポインターを保持します。あなたがしていることは、NSSet を使ってそれらのタッチを自分で管理することです。シーンをプッシュするときは、セットからすべての UITouch を nil に設定するだけです。これは に相当しUITouchPhaseCancelledます。これにより、画面上のすべてのタッチがキャンセルされます。ユーザーがまだ画面に指を置いている場合、そのタッチはもう登録されません...たとえ指を動かしたとしても。

注:すべてのオブジェクトを削除する必要がありますccTouchesCancelled(ユーザーが画面に6回以上タッチしたときに呼び出されます)。そうしないと、もう一度タッチするとアプリがクラッシュします。アプリで 5 回以上のタッチが必要な場合は、それを回避する方法を見つける必要があります。

于 2012-12-13T23:22:31.713 に答える