C# 在C中作为参数传递类的实例

C# 在C中作为参数传递类的实例,c#,class,exception,C#,Class,Exception,所以,当按下一个键时,我需要将迷宫类的一个实例从Form1类传递到Player类,这样Player就能够在没有碰撞的迷宫中移动。 首先,我全局声明一个迷宫对象,以便在OnMouseClick函数中创建时,它在类中的任何位置都可用,然后在OnKeyPress函数中,我将它传递给Player类的一个实例,并使用Move函数执行移动并检查碰撞。 我得到的对象引用没有设置为对象异常的实例,我不明白为什么它不工作。也许我在声明或实例化迷宫类时把事情搞砸了,但我只是不知道其他方法。有什么建议吗 namesp

所以,当按下一个键时,我需要将迷宫类的一个实例从Form1类传递到Player类,这样Player就能够在没有碰撞的迷宫中移动。 首先,我全局声明一个迷宫对象,以便在OnMouseClick函数中创建时,它在类中的任何位置都可用,然后在OnKeyPress函数中,我将它传递给Player类的一个实例,并使用Move函数执行移动并检查碰撞。 我得到的对象引用没有设置为对象异常的实例,我不明白为什么它不工作。也许我在声明或实例化迷宫类时把事情搞砸了,但我只是不知道其他方法。有什么建议吗

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 ...
            }
        }
    }
}

迷宫式迷宫=新迷宫层;应该是迷宫=新迷宫级别;。您的问题可能是因为clicked不等于1、2或3,这导致迷宫无法初始化。尝试向switch语句添加默认值。此外,只需编写迷宫迷宫=new迷宫int.Parseclicked,就可以完全省略switch语句;谢谢你的回答。它应该被初始化,因为如果我在OnKeyPress函数和Move函数中分别初始化迷宫,它工作得很好,所以开关可以按预期工作。我尝试全局声明迷宫并传递它以避免出现一些问题。也许您可以尝试player.Movek=key.ToString,这不起作用,因为我传递迷宫的类是Form1,我需要传递迷宫的一个实例,而不是Form1。您可以删除单击的开关。把15行换成一行就行了。迷宫=单击新迷宫转换.toint;如果我从case中删除它,我如何在函数之外声明它的参数级别?我的错。编译时,您的代码应该有错误。让我更改现有代码我已更新代码,大写/小写字母或拼写可能有错误。拜托,我现在没带vs。非常感谢。我会试试看,然后告诉你是否有效。
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)}
        }
    }