2016-05-15 8 views
0

私はちょっとしたゲームに取り組んでいます。 "Game.cs"はウィンスクリーン( "winscreen.cs")を開きます。ウィンスクリーンでは、新しいゲームを作成することができます。 Game.csはMainMenuを介して開かれました。Form1から開いたForm3のForm2を閉じます。

あなたはWinscreenに新ゲームボタンをクリックした場合、それは新しいプレイフィールド開きます:

private void winscreen_again_Click(object sender, EventArgs e) 
{ 
    Game loadGame = new Game(); 
    loadGame.Show(); 
} 

を問題は次のようになります。これは、新しいプレイフィールドを開き、古いもの、その一回開かれましたメインメニューは開いたままです。だから私は何もしませんloadGame.Close();しようとしました。

私も自分のForm1.cs(メインメニュー)でこれを実行しようとしました:

public Game loadGame; 

以降、これを呼び出す:

this.loadGame = new Game(); 
this.loadGame.StartPosition = FormStartPosition.CenterScreen; 
this.loadGame.Show(); 

を私がやったWinscreen.csから[ウィンドウを閉じるにはWinscreenでこの:

Game.loadGame.Close(); 

とそのdidntのが働いていたので、私は

をした
Game closeGame = new Game(); 
closeGame.loadGame.Close(); 

でも、私はpublic Game loadGame;を "静的"に設定した場合、this.loadGame ... wouldntはもう動作しません。

したがって、私のWinscreen.csを介して既存のGame.csを閉じるにはどうすればよいですか? ありがとう! CheckWinnerメソッド内Game.cs

+0

確かに、あなたのGameオブジェクトをwinscreenクラスのメンバ変数にする必要がありますか?それ以外の場合は、クリックするたびに新しいインスタンスが開始されます。しかし、m_loadGame変数がある場合は、すでに表示されているかどうかをテストできます。それらは私の考えです。 –

+0

あなたの 'loadGame'変数は' winscreen_again_Click'ハンドラの中で宣言されました。だからあなたは 'Game.loadGame.Close'を行うことはできません。 'Game m_loadGame'変数を実際の' winscreen'クラス自体に追加する必要があります。 –

+0

メインメニューから古いプレイフィールドをウィンスクリーンのコンストラクタに渡すことができます。この方法では、以前に表示されたウィンドウのインスタンスが作成されます。あなたはまだAndrewが言ったようなクラス変数が必要です。コンストラクタで、 'main.cs'から取得したパラメータを割り当てて、新しいものを開く前に' winschreen_again_Click'ハンドラで閉じることができます –

答えて

1
public partial class Winscreen : Form 
{ 
    // Variable to catch the old playfield 
    Game oldPlayfield; 

    // the old playfield is passed in the constructor 
    public Winscreen(Game opf) 
    { 
     this.oldPlayfield = opf; 
     InitializeComponent(); 
    } 

    private void winscreen_again_Click(object sender, EventArgs e) 
    { 
     Game loadGame = new Game(); 
     loadGame.Show(); 

     // close the old field 
     this.oldPlayfield.Close(); 
    } 
// rest of the class 
} 

あなたは、このようWinscreenを呼び出します。

//Shows the winner Animation and changes the Text to the Winning player 
Winscreen loadWinscreen = new Winscreen(this); 

残念ながら、私はそれがうまくいくかどうかを確認するために今それをテストすることはできません。 これは最もクリーンな解決策でもありません。 2.ndオプション: ユーザーがwinscreen_againボタンを押したときに、をtrueに設定できるブール値のプロパティーを持つことをお勧めします。Winscreen.csWinscreenのプロパティをGame.csの中に作成し、GameのコンストラクタのClosingイベントに登録します。 イベントハンドラーの中にrepeatGameフラグが設定されているかどうかを尋ねることができます。そうであれば、プレイフィールドをクリアして新しいゲームを開始することができます。

+0

ああ私の神!どうもありがとうございます! コードにプロファイルをリンクしても問題ありませんか?そして...あなたのアカウントに電子メールを追加するか、Githubに提供された電子メールで私に連絡してください) ありがとう! –

+0

うれしいことを聞いてうれしいです。はい、私のプロフィールをリンクすることができます。 –

関連する問題