2

Visual C#2010Expressを使用しています。私はゲームに取り組んでいて、小さな初心者の問題に遭遇しました。実は、私たちはベストプラクティスタイプの状況を扱っていると思いますが、私が実際に手伝ってくれた数少ない初心者向けの本はありません。皆さんができることを願っています。

つまり、2つのフォームがあります。1つはスプラッシュスクリーン/スタートアップフォームで、もう1つはメインゲームウィンドウです。すべてのワールドデータを含むクラスを作成しました。最初の画面でユーザーが「新しいゲーム」をクリックすると、このクラスの新しいインスタンスが生成され、データが入力されます。

ここまでは順調ですね。

newgameボタンは、ワールドインスタンスの作成に加えて、メインゲームウィンドウを開きます。問題は、メインのゲームウィンドウで、gameworldインスタンスの属性を使用しようとすると、このコンテキストには存在しないと表示されることです。

だから、私がそれを正しく理解すれば、作成されたインスタンスは最初のフォームクラス内にのみ存在します...それは正しいですか?

したがって、そのデータ全体を移動したい場合は、実際にワールドクラスのインスタンスデータをシリアル化して保存し、それを2番目の形式でロードする必要がありますか?または、これにどのようにアプローチする必要がありますか。

私はそれが非常に初心者の質問であることを理解しています、そして私はそれをうまく機能させるためにそれをハックすることができます、しかし問題は-私は本当に私がしているすべてを理解しなければならないように感じます。

前もって感謝します!

4

4 に答える 4

3

ワールドクラスのインスタンスを受け入れるコンストラクターをゲームフォームに作成し、それを同じタイプのフィールドに割り当てる必要があります。このフィールドには、ゲームフォームメソッドからアクセスできます。

World world;

// constructor
public GameForm (World world)
{
  this.world = world;
}

// Can now use `world` in all `GameForm` methods

コンストラクターインジェクションの代わりに(私の例で示したように)、プロパティインジェクションを使用できますが、前者の方が好きです(適切な初期化を確実にする傾向があります-null渡されているかどうかを確認することもできます)。

于 2012-08-29T09:46:09.877 に答える
1

スプラッシュ画面にワールドデータオブジェクトの参照がある場合は、これをメイン画面のパブリックメンバーに割り当てるか、コンストラクターを介してメイン画面に渡すことができます。

だからスプラッシュ画面で

FrmMain frmMain = new FrmMain();
frmMain.WorldData = this.WorldData;

スプラッシュ画面のインスタンスメンバーの場合

または多分何かのような

FrmMain frmMain = new FrmMain();
frmMain.WorldData = new WorldData();

あるいは

FrmMain frmMain = new FrmMain(this.WorldData);

また

FrmMain frmMain = new FrmMain(new WorldData());

FrmMainコンストラクターを次のように使用します

public FrmMain(WorldData worldData)
{
    this.m_WorldData = worldData;
}

フォーム間でのデータの受け渡しをご覧ください

于 2012-08-29T09:46:18.137 に答える
1

Windows フォームのみを使用しており、XNA や同様のフレームワークを使用していないと仮定すると、winforms はありません。

起動フォーム:

void StartButton_Click(object sender, EventArgs e)
{
    GameWorld gw = new GameWorld();
    // Initialize gw instance here

    GameForm mainForm = new GameForm(gw);
    mainForm.Show();
}

ゲームフォームにコンストラクターを追加します。

public class GameForm
{
    private GameWorld _gw;
    public GameForm()
    {
        InitializeComponent();
    }
    public GameForm(GameWorld gw) : this()
    {
        _gw = gw;
    }
}

その時点で、ゲーム フォームでプライベート変数 _gw を使用できます。

また、その値はフォームにとって重要であるため、プロパティではなく、コンストラクターを介して GameWorld インスタンスを渡すことをお勧めします。一般に、プロパティは、いくつかの動作を調整する方法を提供するのに適している可能性があり、オブジェクトが正常に機能するためには、任意のコンストラクター パラメーターが必須であると見なすことができます。デフォルトのコンストラクター (パラメーターのないコンストラクター) をプライベートにすることもできます。

于 2012-08-29T09:51:09.597 に答える
0

データのサイズに応じて、またワールドオブジェクトクラスがシリアル化可能かどうかに応じて、データをキャッシュすることを検討するかもしれません。そうすれば、データを必要とする各フォームは、必要なときにいつでもキャッシュからデータを取得できます。

于 2012-08-29T10:37:01.060 に答える