使用C# XNA游戏的Player类

5

我通常会在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)
        {

        }
    }
}

但是我遇到了一个错误,我不知道该如何解决。错误信息如下:

加载"Player"时出错。找不到GraphicsDevice组件。

它在这一行代码抛出的:PlayerTexture = Content.Load<Texture2D>("Player");
我在主游戏类中看到这一行代码:Graphics = new GraphicsDeviceManager(this);,但我不知道该怎么做。我应该将它传递给我的Player类吗?
非常感谢您的帮助。

不熟悉XNA,但是这篇帖子表明你不应该在构造函数中加载内容。 - Michael Todd
唉,我不知道如何正确地做我想做的事情。我得等到XNA论坛再次开放,看看他们推荐怎么做。 - Wen
为什么不在这里问呢?XNA程序员是……嗯,程序员……这就是StackOverflow的用途。 - WernerCD
抱歉,我并不是说我必须等到他们的论坛恢复。但是在那里提问可能会更好,因为他们的帮助论坛毕竟是专门针对XNA框架的。 - Wen
5个回答

6
首先,您似乎缺乏对类(和命名空间)的理解。我建议(正如我在您其他问题的评论中所做的那样)先从一个不需要类的简单游戏开始学习。
现在来谈谈您代码中的问题:
首先,为了加载内容,图形设备需要被初始化。它直到在Microsoft.Xna.Framework.Game中调用LoadContent之后才被初始化。这在文档中已经解释
“此方法由Initialize调用。此外,它在需要重新加载游戏内容时(例如发生DeviceReset事件时)也会被调用。在LoadContent被调用之前,不应访问GraphicsDevice。”
因此,请将您的加载代码移动到:
protected override void LoadContent()
{
    PlayerTexture = Content.Load<Texture2D>("Player");
    PlayerPosition = Vector2.Zero;
    base.LoadContent();
}

注意这是一个受保护方法的覆盖。我不想在这里解释这意味着什么,但建议你了解一下。
此外,你会发现Draw和Update应该被类似地覆盖,因为它们将从XNA中调用。
现在,这里是重要的部分:如果你正在从XNA Game类继承你的游戏类,我刚刚告诉你的内容适用。通过称其为“Player”,你表明了对类如何工作的误解。
如果你正在制作一个“Player”类,请看看你在其他问题的答案中得到的建议。
你可能还会发现这个最近的问题值得一读。

2

更新:本答案似乎适用于旧版本的XNA。请参阅Andrew Russell的答案,了解当前使用的内容。

尝试重写LoadGraphicsContent方法来加载您的内容。如此教程所示。

    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
1
@Andrew Russell:感谢你,Andrew。虽然我对XNA不熟悉,但我仍然尝试帮助OP。我将保留此答案,以防其他人遇到相同问题。加上你的评论和回答,这些都应该有助于引导未来的读者朝正确的方向发展。 - Michael Todd

1
最近在XNA中,您现在可以右键单击某些选项,并让Intellisense为您修复它。因此,在声明时右键单击Texture2D和Rectangle,您应该能够选择“解决”,然后它会要求您选择“使用”其他库,以便它可以编译。看看是否可以解决您的问题。但是,通常我特别是在使用类时都会使用这个方法,而且效果很好。

0

以下是我成功的检查清单:

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

-2

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

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

进入“属性”。

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

重新编译并运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接