2

私は、もう少し洗練されたUIを使用して作成した古いレベルシボードゲームを再実装しようとしています。インスピレーションを得るためにJensAlfkeのGeekGameBoardコードを見てきましたが、CALayersはUIを実装する方法のように見えます。

ただし、GeekGameBoardコードにはモデルとビューの明確な分離はありません。モデルビューであるため、たとえば、AIプレーヤーのゲームツリー検索を実行するためにゲームの状態のコピーを作成することは困難です。ただし、2つの平行なグリッド(モデル用に1つ、ビュー用に1つ)を維持するための絶え間ない戦いを伴わない、モデルとビューの分離を可能にする構造の代替方法を思い付くことができないようです。 )同期しています。もちろん、これには独自の問題があります。

AIの検索に適したモデル構造と表示に適したビューの関係を最適に実装するにはどうすればよいですか?任意の提案/経験をいただければ幸いです。私は「良い答えはありません。できる限り対処してください」という答えを恐れていますが、驚かれる準備ができています。


ピーターの答えをありがとう。しかし、私はそれを完全に理解しているとは完全にはわかりません。最初のピースのセットを動かしたり、取り外したりした場合、これがどのように機能するかはわかりますが、人が新しいピースを置くとどうなりますか?これは次のように機能しますか?

  1. ユーザーがビューをクリックします。
  2. ビュークリックがボードの場所に変換され、コントローラーに通知されます。
  3. コントローラーは、継承国で新しいボードを作成します(適切な場合、つまり、それは合法的な動きでした)。
  4. ビューは、バインディングを介して新しいボードを取得し、既存のビュー/レイヤー階層を破棄して、現在の状態に置き換えます。

それは正しいですか?

PS:それがiPhone用かMac用かを特定できなかったことをお詫びします。私はiPhoneで動作するものに最も興味がありますが、最初にMacでうまく動作させることができれば、iPhoneで動作するようにソリューションを適応させることができると確信しています。(または新しい質問を投稿してください!)

4

2 に答える 2

2

理論的には、NSViewベースのUIの場合と同じである必要があります。モデルプロパティを追加し、それをバインディングとして公開してから、コントローラーを介してビュー(レイヤー)をモデルにバインドします。

たとえば、ピースを含むボードクラス(各ピースにはそれを所有するプレーヤーへの参照があります)があり、それらはすべてモデルクラスである場合があります。コントローラーがボードを所有し、ビュー/レイヤーがボードを表示できるようになります。場合によっては、各ピースのサブビュー/サブレイヤーが表示されます。

ボードビュー/レイヤーをコントローラーのboardプロパティにバインドし、そのプロパティのビュー/レイヤーのセッターで、各ピースのサブビュー/サブレイヤーを作成し、必要なピースの任意のプロパティにバインドします。(メインビュー/レイヤーのボードを交換するときは、すべてのサブビュー/サブレイヤーのバインドを解除して削除することを忘れないでください。)

ピースを移動または変更する場合は、独自のプロパティを使用して行います。これらは、ビュー/レイヤーでのプロパティアクセスに変換されます。表面上は、変更をアニメーション化するようにレイヤーのプロパティを設定します(たとえば、ピースを変更するpositionと、それに応じてレイヤーが移動します)。

理事会についても同じことが言えます。ユーザーに一方または両方のタイルの色を変更させることができます。ゲームコントローラを介してカラーウェルをボードオブジェクトにバインドし、ビュー/レイヤーを同じボードの同じプロパティにバインドすると、変更が自動的に取得されます。

免責事項:私はCore Animationを何にも使用したことがありません。また、Cocoaの代わりにCocoa Touchについて質問している場合、Cocoa Bindingsに依存しているため、上記のソリューションは機能しません。

于 2009-07-04T17:35:30.220 に答える
0

ほとんどすべてのインターフェイスが Core Animation CALayers を使用して構築されている iPhone アプリケーションがあり、Peter の説明と非常によく似たパターンを使用しています。CALayers を NSViews / UIViews であるかのように扱い、コントローラーを介してロジックを管理し、モデル オブジェクトを介してデータを管理するという点で、彼は正しいです。

私の場合、モデル オブジェクトとしても機能するコントローラー オブジェクトの階層を作成します (モデル コンポーネントを分割するためにリファクタリングする場合があります)。コントローラー オブジェクトのそれぞれが CALayer を管理するため、モデル コントローラーの階層と並列の CALayer 表示階層ができあがります。私のアプリケーションでは、この階層を使用して構築された方程式の計算を実行する必要があるため、コントローラーを使用して、ツリーの最下部から計算された値を提供します。コントローラーは、新しいサブオペレーションの挿入やオペレーション ツリーの削除など、ユーザー編集イベントも処理します。

CALayer ツリーがタッチまたはマウス イベントに応答できるようにするレイヤー ホスティング ビュー クラスを作成しました (そのソースはCore Plotプロジェクト内で利用できるようになりました)。ボードゲームの例では、CALayer のピースがタッチ イベントを受け取り、コントローラーにバックエンド ロジックを管理させることができます (正当な動きを決定するなど)。駒を動かすたびにすべてを壊すことなく、同じコントローラーを維持できるはずです。

于 2009-07-06T03:30:43.730 に答える