【问题标题】:trying to alter a variable from another class, not working试图改变另一个类的变量,不工作
【发布时间】:2015-04-10 23:44:24
【问题描述】:

我正在制作一款游戏,但遇到了一些障碍。从先前的研究中,我发现了一种从多个类中更改变量的方法,但它不起作用。我已将所有屏幕设置为一个数组列表,并且我正在尝试使用此变量在屏幕之间进行更改,但屏幕没有更改。 Visual Studio 中没有出现错误,所以我不知道出了什么问题。很抱歉无法指出某一行。非常感谢任何帮助。

这是使用 Int32 GlobalVar.activescreen 的类

public class ManageTheseScreens
{
    ArrayList Screens;
    Screen CurrentScreen;

    public ManageTheseScreens()
    {
        Screens = new ArrayList();
        Screens.Add(new TitleScreen());
        Screens.Add(new OptionScreen());
        CurrentScreen = (Screen)Screens[GlobalVar.activescreen];
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        CurrentScreen.Draw(spriteBatch);
    }
}

这是保存 Int32 的类

    public static class GlobalVar
    {
        public static Int32 activescreen = 0;
    }

这是试图改变它的类

class OptionScreen : Screen
{
    Rectangle titleButton1Rectangle = new Rectangle(450, 100, 222, 44);

    MouseState mouseState;

    public OptionScreen()
        : base()
    {

    }

public void Update()
{
    mouseState = Mouse.GetState();
    if (titleButton1Rectangle.Contains(new Point(Mouse.GetState().X, Mouse.GetState().Y)))
    {
        if (Mouse.GetState().RightButton == ButtonState.Pressed)
        {
             ///this should switch screens
             GlobalVar.activescreen = 1;
        }
     }
 }

【问题讨论】:

  • 什么不起作用?我猜屏幕没有变化?可能是因为您更改了变量但在更改后没有调用任何检查它的东西....在这里猜测是因为您没有提供足够的信息
  • 正确,屏幕没有变化。我认为我不需要调用任何更新它的东西,因为它在一个每秒调用多次的 Draw 函数中。如果我错了,请纠正我,但我相信这就是它的工作原理。
  • 请学习使用调试器,您应该能够通过运行程序并查看变量的值来告诉我们变量的值是否真的发生了变化
  • 您在屏幕上绘图,但您不更改屏幕。 CurrentScreen = (Screen)Screens[GlobalVar.activescreen];更改变量后需要再次调用。
  • @Sorceri 好的,所以我将 CurrentScreen = (Screen)Screens[GlobalVar.activescreen]; 放入每秒会调用多次的 draw 方法中,但值对于 GlobalVar.activescreen 仍然没有改变

标签: c# visual-studio visual-studio-2013 xna xna-4.0


【解决方案1】:

你不需要调用 CurrentScreen = (Screen)Screens[GlobalVar.activescreen]; 在您的绘图方法中。在 ManageScreen 类中你应该有一个更新方法

Public void UpdateCurrentScreen()
{
    CurrentScreen = (Screen)Screens[GlobalVar.activescreen];
}

在您调用的更新方法中

GlobalVar.activescreen = 1;

设置 var 后,您将在 ManageScreens 中调用更新方法

public void Update()
{
    mouseState = Mouse.GetState();
    if (titleButton1Rectangle.Contains(new Point(Mouse.GetState().X, Mouse.GetState().Y)))
    {
        if (Mouse.GetState().RightButton == ButtonState.Pressed)
        {
             ///this should switch screens
             GlobalVar.activescreen = 1;
             //variable changes so you now have to update the member CurrentScreen to reflect the change hence the example of below
             manageScreensInstance.UpdateCurrentScreen();
        }
     }
 }

静态变量及其生命周期的良好链接 C# Static variables - scope and persistence

那么 GlobalVar.activescreen 总是 0 吗?您是否设置了断点以确保它实际上是在代码行中更改变量?

【讨论】:

  • 如果我将 GlobalVar.activescreen = 1; 添加到更新类,那么它将始终设置为 1。关键是让它改变,所以我在哪里使用 GlobalVar.acticescreen 将等于我要绘制的屏幕的数组元素。我已经放了一个断点,它现在正在更新变量,但屏幕仍然没有切换。
  • @MlkShakes 你完全错过了我所说的。除了更新成员 Currentscreen 以反映变量更改的构造函数之外,我在代码中看不到任何地方。您必须将其设置为 arraylist 中的元素。它只是不自己做。
猜你喜欢
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2013-09-25
  • 2015-07-11
相关资源
最近更新 更多