2017-08-26 14 views
-3

したがって、Playerがラビリンスを通過できるように、キーを押すと、Form1クラスのLabyrinthクラスのインスタンスをPlayerクラスに渡す必要があります衝突なし。 まず、Labyrinthオブジェクトをグローバルに宣言して、OnMouseClick関数で作成するとクラスのどこでも使用できるようにし、OnKeyPress関数でPlayerクラスのインスタンスに渡し、Move関数と衝突チェックで移動を実行します。
"オブジェクト参照がオブジェクトのインスタンスに設定されていません"という例外が発生し、なぜ動作しないのかわかりません。多分私はラビリンスクラスの宣言やインスタンス化のどこかを台無しにしてしまったかもしれませんが、私はそれを行うための他の方法を知らないだけです。助言がありますか?クラスのインスタンスをC#のパラメータとして渡す

namespace Labyrinth 
{ 
    public partial class Form1 : Form 
    { 
     Player player = new Player(); 
     Labyrinth labyrinth; 

     private void OnMouseClick(object sender, MouseEventArgs e) 
     { 
      if (window=="lvlSelect") 
       string clicked = levelMenu.Click(e); 

      switch (clicked) 
      { 
       case "1": 
        level = 1; 
        Labyrinth labyrinth = new Labyrinth(level); 
        break; 
       case "2": 
        level = 2; 
        Labyrinth labyrinth = new Labyrinth(level); 
        break; 
       case "3": 
        level = 3; 
        Labyrinth labyrinth = new Labyrinth(level); 
        break; 
      }   
     } 

     private void OnKeyPress(object sender, KeyPressEventArgs e) 
     { 
      char key = e.KeyChar; 
      if (window == "game") 
      {player.Move(k = key.ToString(), labyrinth)} 
     } 
    } 
} 

namespace Labyrinth 
{ 
    class Player 
    { 
     int playerPosX; 
     int playerPosY; 
     public void Move(string key, Labyrinth labyrinth) 
     { 
      switch (key) 
      { 
       case "a": 
        if (!(playerPosX - 1 < 0) && 
         (labyrinth.CheckCollision(playerPosX - 1, playerPosY)==false)) //I get the exception here 
         playerPosX--; 
        break; 
       case ... 
      } 
     } 
    } 
} 
+0

'ラビリンスラビリンス=新しいラビリンス(レベル); ';' 'だけラビリンス=新しいラビリンス(レベル)であるべきです。 –

+0

あなたの問題はおそらく 'クリックされた 'が' 1'、 '2'または' 3'と等しくなく、 'labyrinth'が初期化されないためです。あなたの 'switch'ステートメントに' default'を追加してみてください。また、 'labyrinth labyrinth = new Labyrinth(int.Parse(clicked));と書くだけで' switch'ステートメントを完全に省略することができます; – Icemanind

+0

あなたの答えをありがとう。 OnKeyPress関数とMove関数でLabyrinthを初期化すると、完全に動作するように初期化する必要があるため、スイッチは期待どおりに動作します。私はラビリンスを世界的に宣言し、いくつかの問題を避けるためにそれを渡そうとしました。 –

答えて

0
public partial class Form1 : Form 
    { 
     Player player = new Player(); 
     Labyrinth labyrinth = new Labyrinth(1); // you need to default it to 1 first instead of null. because you might key press then only mouse click 

     private void OnMouseClick(object sender, MouseEventArgs e) 
     { 
     string clicked = "1"; /// default clicked to 1 
      if (window=="lvlSelect") /// if selected level is diff, then change 
       clicked = levelMenu.Click(e); 
     labyrinth = new Labyrinth(Convert.ToInt(level)); 
     } 

     private void OnKeyPress(object sender, KeyPressEventArgs e) 
     { 
      char key = e.KeyChar; 
      if (window == "game") 
      {player.Move(k = key.ToString(), labyrinth)} 
     } 
    } 
+0

代わりにスイッチをクリック(クリック)することができます。 15行を1行に変更するだけです。 labyrinth =新しい迷路(convert.toint(clicked)); –

+0

ケースから削除すると、関数の外にパラメータ "レベル"で宣言するにはどうすればよいですか? –

+0

私の悪い。 comippileの間にコードにエラーがあるはずです。私は既存のコードを変更させてください –

関連する問題