1

私は OOP の経験があまりないので、現在行っていることを共有し、いくつかのことをどのように行うべきかについてアドバイスを求めたいと思いました。

現在、2D グリッドを使用する単純なゲームに取り組んでいます。私のクラス構造の簡単な概要は次のとおりです。

  • 「GameBoard」- ゲームで可能なセル状態の配列と、ルールを実装するメソッドがあります。
  • 「GameView」 - スーパークラス NSView を持ち、カスタム ビューとしてウィンドウに配置されます。このクラスは、ゲーム ボードから読み取り、その drawRect: メソッドで凝視を画像の列挙にマッピングすることによって、配列の内容を描画することを目的としています。
  • 「GameController」 - これは、ゲーム ボードとビューを初期化し、さまざまな UI コントロールを処理するための中間クラスです。このクラスには、「GameBoard」および「GameView」タイプのインスタンス変数があります。

もともと、私は View クラスでほぼすべてのことを行っていて、問題なく動作していましたが、実際に従うのが難しくなり始めました。これが、私のコードを新しいクラスに広げたいと思った主な理由でした。

新しいゲームを初期化するメソッドを「GameController」に作成し、いくつかのユーザー定義パラメーター (スペースを節約するためにスニペットで削除) を使用しました。

-(IBACTION)initialiseGame:(id)sender {
    gameBoard = [[GameBoard alloc] init...];
    gameView = [[GameView alloc] init...];
}

ここでやりたいことは、ゲーム ビューにゲーム ボード インスタンスへのポインターを渡し、その配列を読み取ってゲームの現在の状態を描画できるようにすることです。

-(void)initWithGameBoard:(GameBoard*)gameBoard;

これは正しい方法ですか、それとも別の方法でこれを行う必要がありますか?

コントローラー クラスに移動する際の次の問題は、IB のウィンドウに配置した GameView のインスタンスへのポインターを取得する方法がわからないことです。ビューをインターフェイス ビルダーのウィンドウに配置するのではなく、initialiseGame 関数でプログラムによってウィンドウに配置する方がよいでしょうか? もしそうなら、どうすればそれを行うことができますか?

もう 1 つの質問は、このアイデアを破棄して、GameDraw クラスですべてを行うことに固執する必要があるかどうかということだと思います。

これをお読みいただきありがとうございます。これは、経験豊富なオブジェクト指向プログラマーにとっておそらく非常に単純な質問ですが、具体的な答えがどこにも見つからないようです。

4

1 に答える 1

3

これを機能させる方法は複数ありますが、私が行う方法は次のとおりです。

  1. IB で一度ビューをインスタンス化します。alloc/init を自分で呼び出さないでください。
  2. ビュー コントローラーで、ビューのアウトレットを作成し、それを Interface Builder に接続します。それがあなたのコントローラーがそれにアクセスする方法です。ビュー コントローラーはファイルの所有者である必要があります。おそらく既に所有しています。
  3. ビューを再利用できるように設計します。コントローラー-setGameBoard:が呼び出すメソッドを指定します。ゲーム ボードがない場合、ビューが何か空白を描画できることを確認してください。
  4. 次のように書き-initializeGame:ます。

    -(IBAction) initialiseGame:(id) sender {
        gameBoard = [[GameBoard alloc] init...];
        [gameView setGameBoard:gameBoard];
    }
    
于 2012-11-21T17:47:44.560 に答える