私は Angry Birds のオプションなどの「ロールアウト」に似たものに取り組んでいますが、かなり重大な問題に直面しています。
ロールアウト自体は単なるトグル ボタンであり、トグル ボタンをタッチすると移動する他のいくつかのボタンが表示リストに追加されています。これらの各ボタンは、Sprite を拡張するクラスであり、タッチ イベント、begin、end、および out の個々のメソッドが含まれています。これらのボタンが初期化される (インスタンス化されない) と、タッチ開始リスナーが追加されます。このようなもの:
public function Initialize():void
{
this.addEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin, false, int.MAX_VALUE);
}
private function OnTouchBegin(e:TouchEvent):void
{
this.removeEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin);
this.addEventListener(TouchEvent.TOUCH_END, OnTouchRelease, false, int.MAX_VALUE);
this.addEventListener(TouchEvent.TOUCH_OUT, OnTouchOut, false, int.MAX_VALUE);
}
private function OnTouchRelease(e:TouchEvent):void
{
this.addEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin, false, int.MAX_VALUE);
this.removeEventListener(TouchEvent.TOUCH_END, OnTouchRelease);
this.removeEventListener(TouchEvent.TOUCH_OUT, OnTouchOut);
}
private function OnTouchOut(e:TouchEvent):void
{
this.addEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin, false, int.MAX_VALUE);
this.removeEventListener(TouchEvent.TOUCH_END, OnTouchRelease);
this.removeEventListener(TouchEvent.TOUCH_OUT, OnTouchOut);
}
次に、これらのボタンが画面から非表示になると、現在アクティブなリスナーを削除するメソッドが呼び出されます。
public function Deactivate():void
{
this.removeEventListener(TouchEvent.TOUCH_OUT, OnTouchOut);
this.removeEventListener(TouchEvent.TOUCH_END, OnTouchRelease);
this.removeEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin);
}
これは、標準のボタン機能 (アップ/ダウン テクスチャとサウンド) のためだけのものです。これに加えて、ゲームを作成するときに、ロールアウト クラスに、発生するカスタム ロジック用の別のイベント リスナーを追加する追加のメソッドがあります。ボタンがタッチされたとき (ボタン自体は別の場所で作成されます)。
public function AddRolloutButton(listener:Function):void
{
if (listener != null)
{
_buttons[index].addEventListener(TouchEvent.TOUCH_BEGIN, listener);
}
ロールアウト自体のボタンは、表示されるまで表示リストから削除されます。ロールアウトが閉じられると、ボタンは非アクティブになります(表示リストから削除され、ボタン クラス内の 3 つのボタン リスナーが削除されます)。
ロールアウトを初めて開いて閉じると、すべてが正常に機能します。その後、イベント ディスパッチ システムが不可解に機能しなくなります。位置やタイプに関係なく、画面上のすべての InteractiveObject が使用できなくなります。リスナーがまだロールアウトのトグル ボタンにあるかどうかを調べたところ、ありました。また、表示リストにあるのはロールアウト ボタン自体だけであることも確認しました。
私が気付いたのは、タッチ開始リスナーのボタンの非アクティブ化メソッドでリスナーの削除をコメントアウトするか、AddRolloutButton メソッドのリスナー メソッドに null を渡すと、すべてが正常に機能することです。この問題は、ロールアウト ボタンに同じタイプの複数のリスナーがあり、それらの 1 つまたはすべてを削除したことが原因のようです。
何が起こっているのかについて誰かが何か考えを持っているなら、それは非常に役に立ちます。同じタイプの複数のリスナーを InteractiveObject に追加することは完全に有効であるという印象を受けました。
アップデート:
私が抱えているこの問題によって、TouchEvents だけが壊れているようです。ロールアウトを開いたり閉じたりした後、ステージでマウス クリック リスナーを使用しようとしましたが、それでも機能します。そのため、タッチ イベントだけが壊れています。