【问题标题】:Player class with my C# XNA game我的 C# XNA 游戏的玩家类
【发布时间】:2010-10-08 19:43:11
【问题描述】:

我通常会在 XNA 论坛上寻求帮助,但现在他们已经关闭了,所以我来到了这里。

我正在制作一个新的 XNA 游戏,我想要一个玩家类。目前我有一个名为Dots 的主要游戏类。这代表了主要游戏。这就是我的Player 类目前的布局方式:

namespace Dots
{
    class Player : Microsoft.Xna.Framework.Game
    {
        Texture2D PlayerTexture;
        Vector2 PlayerPosition;

        public Player()
        {
            Content.RootDirectory = "Content";
            PlayerTexture = Content.Load<Texture2D>("Player");
            PlayerPosition = Vector2.Zero;
        }

        public void Update()
        {

        }

        public void Draw(SpriteBatch SpriteBatch)
        {

        }
    }
}

但是我遇到了一个我无法解决的错误。错误是:

加载“播放器”时出错。图形设备 未找到组件。

将它扔到这一行:PlayerTexture = Content.Load&lt;Texture2D&gt;("Player");。

我在主游戏类中看到这一行:Graphics = new GraphicsDeviceManager(this);,但我不知道如何处理它。我应该将它传递给我的Player 班级,还是什么?

感谢任何帮助,谢谢。

【问题讨论】:

  • 不熟悉 XNA,但this post 暗示您不应该在构造函数中加载内容。
  • 精氨酸。那么我不知道如何正确地做我想做的事。我将不得不等到 XNA 论坛再次开放,然后看看他们推荐的做法。
  • 为什么不在这里问呢? XNA 程序员是……嗯,程序员……这就是 StackOverflow 的用途。
  • 抱歉,我不是说我必须等到他们的论坛上线。但在那儿问可能会更好,因为他们的帮助论坛毕竟是专门针对 XNA 框架的。

标签: c# class xna


【解决方案1】:

首先,您似乎缺乏对类(和命名空间)如何工作的理解。我建议(正如我在对您的其他问题的评论中所做的那样)首先开发一个不需要课程的简单游戏。

现在谈谈你代码中的问题:

首先,为了加载内容,图形设备需要已经初始化。在Microsoft.Xna.Framework.Game 中调用LoadContent 之前,它不会被初始化。这是explained in the documentation:

此方法由 Initialize 调用。此外,在需要重新加载游戏内容时调用它,例如发生 DeviceReset 事件时。在调用 LoadContent 之前,您不应访问 GraphicsDevice。

所以移动你的加载代码:

protected override void LoadContent()
{
    PlayerTexture = Content.Load<Texture2D>("Player");
    PlayerPosition = Vector2.Zero;
    base.LoadContent();
}

注意它是一个覆盖(一个受保护的方法)。我真的不想在这里解释这意味着什么,但我建议你找出来。

此外,您会发现 Draw 和 Update 应该被类似地覆盖,因为它们将从 XNA 中调用。

现在,重要的一点是:如果您从 XNA Game 类继承您的游戏类,我刚才告诉您的内容适用。将其称为“播放器”是在表明对类的工作方式存在误解。

如果您正在制作“玩家”课程,请查看your other question 的答案中告诉您的内容。

您可能还会发现this recent question 值得一读。

【讨论】:

    【解决方案2】:

    更新:这个答案对于旧版本的 XNA 显然是正确的。请参阅 Andrew Russell's answer 了解当前正在使用的内容。

    尝试覆盖 LoadGraphicsContent 方法以加载您的内容。如this tutorial所示。

        protected override void LoadGraphicsContent(bool loadAllContent)
        {
            if (loadAllContent)
            {
                spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
                // TODO: Load any ResourceManagementMode.Automatic content
                t2dMap = content.Load<Texture2D>(@"content\textures\map_display");
                t2dColorKey = content.Load<Texture2D>(@"content\textures\map_colorkey");
            }
            // TODO: Load any ResourceManagementMode.Manual content
        }
    

    【讨论】:

    • LoadGraphicsContent 已经过时了很长时间了。
    • @Andrew Russell:谢谢,安德鲁。即使我不熟悉 XNA,我也试图帮助 OP。我会在这里留下这个答案,以防其他人偶然发现它。连同您对此问题的评论和回答,应该有助于引导人们在未来朝着正确的方向前进。
    【解决方案3】:

    最近在 XNA 中,您现在可以右键单击某些选项并让 Intellisense 为您修复它。因此,通过在声明时右键单击 Texture2D 和 Rectangle,您应该能够选择“Resolve”,它会要求您选择“using”其他一些库,以便它可以编译。看看能不能解决你的问题。但是,一般来说,尤其是在课程中,我使用它并且效果很好。

    【讨论】:

      【解决方案4】:

      一份对我有用的清单:

      • 尝试将字体放在内容项目的根文件夹中
      • 确保Build Action 设置为Compile
      • 验证.spritefont 文件的内容(将此问题作为参考)
      • 确保您处于LoadContent 或生命周期的更晚阶段

      【讨论】:

        【解决方案5】:

        认为我曾经遇到过类似的错误。

        在解决方案资源管理器中右键单击解决方案。

        转到属性。

        如果游戏配置文件是“Hi Def”.. 更改为“Reach”。

        重新编译并运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          • 1970-01-01
          相关资源
          最近更新 更多