2017-08-26 115 views
-3

所以,我需要將一個Labyrinth類的實例從Form1類傳遞給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

你的問題可能是因爲'clicked'不等於'1','2'或'3',這會導致'迷宮'不被初始化。嘗試在'switch'語句中添加一個'default'。此外,您可以通過簡單地編寫'Labyrinth labyrinth = new Labyrinth(int.Parse(clicked))'來完全消除'switch'聲明;' – Icemanind

+0

感謝您的回答。 它應該被初始化,因爲它完美的工作,如果我在OnKeyPress函數中初始化迷宮和單獨移動功能,所以開關按預期工作。我試圖在全球宣佈迷宮,並通過它來避免一些問題。 –

回答

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行更改爲一行。 labyrinth = new Labyrinth(convert.toint(clicked)); –

+0

如果我將其從案例中刪除,我該如何在函數外部用參數「level」聲明它? –

+0

我的不好。你的代碼在comppile時應該有錯誤。讓我更改現有的代碼 –

相關問題