我在主菜单上使用enum来使用,但是遇到了错误,我已经查看了一段时间,但找不到错误的地方。

我在做的是在菜单的每一页上都有一个类,其中包含图像和矩形。当鼠标悬停在图像上方并单击时,它将字符串更改为名称,以使程序执行某些操作。

问题

由于某些原因,当我的mouseOn更新时,字符串"None"不会从TitleScreen.cs更改。怎么了?

TitleScreen类:

public class TitleScreen
{
    Game1 game1;

    public void Initialize()
    {
        game1 = new Game1();
    }

    public void Update(GameTime gameTime)
    {
        MouseState mouse = Mouse.GetState();

        if (mouse.LeftButton == ButtonState.Pressed && game1.mouseUsed == false && game1.mouseActive == true)
        {
            if (play.Contains(mouse.X, mouse.Y))
            {
                game1.mouseOn = "Play";
                game1.mouseUsed = true;
            }
            else if (title.Contains(mouse.X, mouse.Y))
            {
                game1.mouseOn = "Title";
                game1.mouseUsed = true;
            }
            else if (options.Contains(mouse.X, mouse.Y))
            {
                game1.mouseOn = "Options";
                game1.mouseUsed = true;
            }
            else if (quit.Contains(mouse.X, mouse.Y))
            {
                game1.mouseOn = "Quit";
                game1.mouseUsed = true;
            }
        }
    }


内部主要类别:

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

        images = new Images();
        startup = new StartUp();
        resolution = new Resolution(new Vector2(screenWidth, screenHeight));
        options = new Options();
        credits = new Credits();
        titlescreen = new TitleScreen();

        images.Content = Content;

        graphics.PreferredBackBufferHeight = (int)resolution.screenResolution.Y;
        graphics.PreferredBackBufferWidth = (int)resolution.screenResolution.X;
        graphics.ApplyChanges();
    }

    protected override void Initialize()
    {
        titlescreen.Initialize();

        base.Initialize();
    }

最佳答案

您正在TitleScreen类中创建另一个Game对象。我不确定为什么需要在标题屏幕中引用完整的Game类,如果仅用于输入命令,通常最好创建一个单独的输入类并对其进行引用。无论如何,如果要正确引用Game1而不是新引用,则需要执行以下操作:

public class TitleScreen
{
    Game1 game1;

    public void Initialize(Game game1) //Or (Game1 game1) both work since Game1 is a child from Game.
    {
        this.game1 = new Game1();
    }
}


现在,当您在TitleScreen对象上调用Initialize方法时,将使用this将Game1对象传递给它。

protected override void Initialize()
    {
        titlescreen.Initialize(this);

        base.Initialize();
    }


如果您实际上正在检查Game1类中的输入,则不会传递给TitleScreen。解决此问题的最简单方法是,以与上述相同的方式在更新方法中传递Game1。

public void Update(GameTime gameTime, Game1 game1)
    {
        this.game1 = game1;
        MouseState mouse = Mouse.GetState();
    }


同样,您需要在Game1更新方法中传递每个更新循环:

titleScreen.Update(gameTime, this);


我不能保证这会起作用,您可能只需要一个更好的体系结构(仅传递完整的Game1对象并不是一个好主意,恕我直言)。当我需要Game1中的特定物品时,我只是为其创建属性并引用它。我确实希望事情能够为您解决,这就像您正在传递GameTime和SpriteBatch一样,如果您已经传递了整个Game1对象,则不需要传递那些。

关于c# - 引用类和字符串使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22561367/

10-13 08:10