2012-02-23 8 views
0

進行中のゲームプロジェクトに大きな変更を加える前に、誰かがDisplayObjectのgetObjectsUnderPoint()関数に関する問題を見つけたら、他の人から聞きたいことがありますか?誰かがgetObjectsUnderPointを使用した場合のパフォーマンスの問題を含む、

更新:は だけでなく、パフォーマンスの問題が、それを使用して、任意の他の制限(これは単なる一例としてのUIElementの特定のタイプを()検出しないように)

私は自分のアプリケーションに三層を持っています(これはアイソメゲーム)

  • 背景 - これはちょうど底にとどまる背景である、ゲーム
  • ミドルレイヤーとは何の関係もありません - これはここで、すべての私のゲーム要素プレイ可能エリアです場所になるdこのレイヤーで
  • トップレイヤー - これは1つのダミーの透明なレイヤーで、すべてのマウスイベントを中断する再生可能な領域全体をカバーします。ここで私はgetObjectsUnderPoint()を使用したいです。

プレイヤーは要素をクリックしたい、トップレイヤーはマウスイベントを中断し、何かが配置されているか、または普通のバックグラウンドがあるかどうかをチェックし、アクションのように、下のオブジェクトに通知します。

これは本当にマップに配置されたすべてのアイテムのmouesイベントを単純に追加することができますが、getObjectsUnderPoint()を使用してアイテムの下に何かが存在するかどうかを確認するためです。

誰でもこの機能がどのように機能するのか説明できれば、決断を下すのは簡単ではありません。

+1

あなたがパフォーマンスを心配している場合は、機能をテストしてストレスを軽減し、ゲームの数の2倍のような多くのオブジェクトで遅くなっているかどうかを確認しましょう。 – vulkanino

+0

私が最後に追加したかった欠点があります。今更新されました –

+1

最後の日にtouchlibを書きました。この関数をディスパッチイベントに使用しましたが、いくつかのオブジェクトの問題は見つかりませんでした。それはあなたがそこに持っているオブジェクトの数に依存しますが、あなたはあまりにも多くを持っているなら、いつでもCPUを殺すことができます:]。たぶんあなたはいくつかのストレステストを買った? – turbosqel

答えて

2

しかし、厄介な問題が1つありました。彼らがそれを修正したかどうかはわかりません。少なくともそれは10.1回にあった。

コンテナを持ち、縮尺を変更した場合、container.getObjectsUnderPointは間違った結果を返します。すべての時間。だから私が必要としたどこでもgetObjectsUnderPoint私はstageからそれを呼び出して、適切な結果を得なければならなかった。

+0

私はそれがコンテナの拡大縮小時に間違った値を返すのではないかと疑います。ドキュメンテーションには、「ポイントパラメータはステージの座標空間にあり、表示オブジェクトコンテナの座標空間と異なる場合があります(表示オブジェクトコンテナがステージでない限り)。globalToLocal()およびlocalToGlobal )メソッドを使用して、これらの座標空間間のポイントを変換します。 – Triynko

+0

あなたのオブジェクトが例えば2倍にスケールされていた場合、コンテナ内の(3,3)のポイントはステージ座標で(6,6)になります。あなたのオブジェクトをステージから削除する場合は、前の例のように、オブジェクトのx位置を5に設定してスケールを2にした場合、コンテナの内側の(3,3)のポイントは、実際にはステージ座標で(2 * 3 + 5,3)または(11,3)になります。とにかく、今は機能しているようです。 – Triynko

+0

それは多分それでした。 –

1

これは不完全な関数です。マウスの下にグラフィカルオブジェクトを戻しますが、イベントや対話の目的でマウスターゲットの可能性はありません。実際には、適切なターゲット(実際にそのポイントをクリックした場合に1つのFlashが選択する)がリストにないため、マウスのターゲットを決定するためにgetObjectsUnderPointから返された配列を調べる複雑なロジックが必要です。

まず、オブジェクトの配列を逆順に調べる必要があります。これは、項目が先頭から順に並べ替えられているためです。それぞれのオブジェクトの親チェーン全体を調べ、mouseChildren = falseの親を探して、イベントを傍受してターゲットにする必要があります。そのようなオブジェクトが見つかったかどうかに関わらず、最終的なオブジェクトのmouseEnabledプロパティはtrueに設定されている必要があります。そうでない場合は、スキップして配列内の次のオブジェクト、または最初にチェックしたものの後ろにある形状を選択します。リストを調べている間、親が変更されたときに、その共通の親のすべての子がmouseEnabledプロパティをfalseに設定していると仮定する必要があることに気づく必要があります。その場合、親が次の候補になります。これは実際は非常に複雑です。上から下に生成されたオブジェクトの不完全なセットを使ってボトムアップのアプローチで後方に作業しているからです。

は、トップダウン方式でのステージから開始し、深さ優先探索で表示階層を逆方向に歩いて実際に簡単です...デフォルトディスパッチロジックと一致し、実際の潜在的なマウスイベントのターゲットを、取得するにはmouseChildrenをチェックして子プロセスを実行する必要があるかどうかを確認し、targetである場合はmouseEnabledをチェックします。そうでない場合は、コンテナの子プロセスを実行してプロセスを前から後ろに繰り返します。これははるかに正確で、完全で、かつ、正しかったです。唯一の問題は、あなた自身でコード化する必要があることです。

関連する問題