【问题标题】:In XNA, how do I modify something in the main game class from another class?在 XNA 中,如何从另一个类修改主游戏类中的某些内容?
【发布时间】:2013-01-22 02:17:55
【问题描述】:

好的,默认情况下,XNA PC 游戏的 Game 类有一个名为 IsMouseVisible 的公共 bool 属性,该属性在设置时启用/禁用鼠标可见。我有另一个名为Configs 的类,它监视被按下的特定键。现在我要做的是设置它,以便当我按下特定键时,它将更改IsMouseVisible 的值。这是我卡住的地方,因为我不知道如何更改另一个类的值。

我知道我可以在 Configs 类中创建一个 bool 值并使其在按下键时值会发生变化,然后使其在主 Game 类更新时将IsMouseVisible 的值设置为Configs 类的值,但问题是,我可能想要创建多个不同的值(不仅仅是IsMouseVisible),这些值可以在另一个类的主Game 类中设置。

还有我的问题,我如何在另一个类的主 Game 类中设置一些东西? (无需为我希望访问的每个值创建多个更新。)

【问题讨论】:

  • 没有代码,很难分辨

标签: c# xna


【解决方案1】:

在主类的构造函数中创建对象'Configs'。执行此操作时,请为 Config 对象提供对主类的引用。现在 Configs 可以访问主类的值了。

【讨论】:

  • 这是否意味着我必须在 Configs 类中创建一个本地游戏类来获取/设置主游戏中某物的值?
  • 好的,所以在我的主游戏类中,我创建了类 Configs 并将其命名为 configs。然后在构造函数中像这样设置类配置:configs = new Config(this,this)。 (这个类是一个游戏组件,所以第一个参数是游戏,第二个参数是我的游戏参考)唯一的问题是我收到一个错误,告诉我“这个”(游戏)不能使用作为 ref or and out 因为“this”是只读的。我该如何解决这个问题?
  • 这是正确的,但在 XNA GameComponent 对象的特定上下文中,它是多余的。看我的回答。
【解决方案2】:

您需要将游戏类的引用传递给 Configs 类。在 Configs 的类构造函数中,为游戏类的实例设置一个私有成员变量。从那里你可以操纵游戏。见下文:

游戏类

public class Game1 : Game
{
    Configs configs; 

    GraphicsDeviceManager _graphics;
    SpriteBatch _spriteBatch;

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

    protected override void Initialize()
    {
        // Pass THIS game instance to the Configs class constructor.
        configs = new Configs(this);
        base.Initialize();
    }

    protected override void LoadContent()
    {
        _spriteBatch = new SpriteBatch(GraphicsDevice);
    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        base.Draw(gameTime);
    }
}

配置类

public class Configs
{
    // Reference to the main game class.
    private Game _game;

    public Configs(Game game)
    {
       // Store the game reference to a local variable.
        _game = game;
    }

    public void SetMouseVisible()
    {
        // This is a reference to you main game class that was 
        // passed to the Configs class constructor.
        _game.IsMouseVisible = true;
    }
}

这基本上是其他人一直在说的。但是,您似乎很难在没有看到一些代码的情况下理解这些概念。因此,我提供了它。

希望对您有所帮助。

【讨论】:

  • 感谢您的帮助,我能够做到这一点,而无需在课堂上创建新的游戏参考。但是假设我的游戏类中有一个对象并且游戏类切换了对象的值,我如何获取/设置该特定对象的值?
【解决方案3】:

三件事,它们都与@Patashu 的回答有关您的cmets:

首先,如果您将Game 对象传递给构造函数,则无需将其设置为 ref 类型参数,因为它是通过引用自动传递的(由于是对象)。

其次,您的GameComponent 子类需要在其默认构造函数中引用Game 对象的原因...是它已经内置了对Game 的引用。在您的 Configs 类中,调用 this.Game 这是主要的 Game 实例。

第三,如果你的构造函数已经接收到一个对象的一个​​参数,它就不需要同一个对象的同一个实例的另一个参数。

Read the documentation.很有用。

【讨论】:

  • 非常感谢,我现在能够获取 IsMouseVisible 值并设置它,我从未注意到您可以从“this”或“Game”获取/设置游戏的已实现对象值。但是我现在遇到了一个问题,如果我的游戏类中有一个对象并且游戏类切换了对象的值,我如何从另一个类获取/设置该特定对象的值?
  • 你实现的其他对象可以用同样的方式访问。但是,如果您有特定的想法,您应该发布另一个问题并包含您的代码。
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多