2009-07-04 4 views
2

私は古いものを再実装しようとしていますReversi board gameすてきなUIをもう少し書いて書きました。私はJens AlfkeのGeekGameBoardのインスピレーションのコードを見てきました.CALayersはUIを実装する方法のようです。モデルとコントローラをCALayerベースのUIとは別に保つにはどうすればいいですか?

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

AIの検索フレンドリーなモデル構造とディスプレイに適した表示との関係を最もよく実装するにはどうすればよいですか?どんな提案や経験もありがとうございます。私は恐ろしい/半分の答えに期待している "良い答えはありません:あなたができる最高の"それを扱うが、私は驚くように準備ができています!


回答ありがとうございました。しかし、私はそれを完全に理解しているとは完全には分かっていません。私は、あなたが周りを移動し、削除さえする初期のセットを持っているだけで、新しいパーツを置くとどうなりますか?

  1. ビューでユーザーがクリックします。
  2. クリックするとボードの位置に変換され、コントローラに通知されます。
  3. コントローラは、後続の状態を持つ新しいボードを作成します(必要に応じて、合法的な動きです)。
  4. ビューはバインディングを介して新しいボードをピックアップし、既存のビュー/レイヤー階層を破棄し、現在の状態に置き換えます。

これは正しいですか?

PS:iPhone用かMac用かを指定できませんでした。私はiPhoneでうまくいくものに最も関心がありますが、最初にMacでうまく動作するようにすれば、自分でiPhone上で動作するようにソリューションを適応させることができます。

+0

いいえ、新しいボードは作成しません。新しいピースを作成してボードに追加します。ボード上で両方のステップを行うかどうかを決定する必要があります(コントローラがボードに「x、yで新しいピースを作って追加する」ように指示する)か、別に(コントローラがピース自体を作成してから理事会にそれを渡す)。 –

+0

あなたはまだiPhone上で私の提案を使用することができるかもしれませんが、Bindingsを持っていないので、KVOを直接使用する必要があります。ボード層はボードの特性を観察し、ピース層はそれぞれのピースの特性を観察する。あまりにも苦痛ではありませんが、私はそれを試していません。 –

答えて

2

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

たとえば、ボードクラスにPiecesが含まれている場合(各ピースは所有しているPlayerへの参照を持ちます)、そのすべてがモデルクラスです。あなたのコントローラーはボードを所有し、あなたのビュー/レイヤーはボードを表示することができ、各Pieceのサブビュー/サブレイヤーを表示することができます。

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

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

ボードについても同じです。ユーザーが1つまたは両方の色を変更できるようにすることができます。ゲームコントローラを介してBoardオブジェクトに色をバインドし、同じBoardの同じプロパティにバインドされたView/Layerを使用して、自動的に変更を取得します。

免責事項:Core Animationは何も使用したことがなく、Cocoaの代わりにCocoa Touchについて質問している場合、上記の解決方法は機能しません。

0

私はan iPhone applicationを持っています。インターフェイスのほとんどすべてがCore Animation CALayersを使用して構築されていますが、私はPeterと同じパターンを使用しています。彼はCALayersをNSViews/UIViewのように扱い、モデルオブジェクトを介してコントローラーとデータを介してロジックを管理したいという点で正しいです。

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

私は、CALayerツリーがタッチイベントまたはマウスイベントに応答できるようにレイヤーホストビュークラスを作成しました(ソースはCore Plotプロジェクト内で利用可能です)。あなたのボードゲームの例では、CALayerのピースはタッチイベントを受け取り、コントローラにバックエンドロジックを管理させることができます(合法的な動きの決定など)。すべての動きですべてを引き裂かずに、同じコントローラを周りに動かすことができます。

関連する問題