【问题标题】:XNA SpriteBatch instantiation issueXNA SpriteBatch 实例化问题
【发布时间】:2010-12-26 16:38:38
【问题描述】:

我一直在 XNA 中练习某些技术,最近遇到了一个让我很困惑的问题。我一直在我的一些 Windows 游戏项目中使用这种技术,但现在突然出现了一个问题,我想我忽略了一些东西......

所以我创建了一个新的 Windows 游戏项目并将 XNA 游戏组件添加到项目中,将组件添加到 Game1.cs 文件中。在 Componant 中创建并实例化一个 SpriteBatch 变量,然后尝试绘制一个简单的纹理来测试 spriteBatch。

这是我得到的运行时错误的图片:http://twitpic.com/3jp8t1 ...以及这两个文件的完整来源:pastebin.com/rFRkGKXJ

【问题讨论】:

    标签: xna


    【解决方案1】:

    在我的脑海中(您可以使用 Reflector 仔细检查我),XNA 初始化期间的调用顺序是这样的:

    • Initialize() 在你的游戏课中
    • LoadContent() 在您的游戏组件中(从 Game.Initialize 调用)
    • LoadContent() 在你的游戏类中(从 Game.Initialize 调用)
    • 更新和绘制调用

    (顺便说一下,这不是完整的列表。)

    所以我猜想,通过在游戏的LoadContent 函数中添加游戏组件,游戏组件中的LoadContent 不会被调用,因此它的SpriteBatch 不会被创建。您可以通过在游戏组件的 LoadContent 函数中添加断点来检查这一点。

    通常您希望在游戏的Initialize 函数中创建和添加游戏组件。

    (您还应该并且可能需要调用LoadContentUnloadContent 中的相应base 函数。)

    就我个人而言,我更喜欢避免使用DrawableGameComponent,而只是制作我自己的独立课程。这让我可以更直接地共享 SpriteBatch 的实例(而不是必须为每个组件创建实例),它让我可以更明确地控制调用的顺序。

    【讨论】:

    • 我经常遇到这个问题,直到我弄清楚所有 ctor-ish 函数的调用顺序。如果问题仍然存在,请在构造函数中调用 Initialize() 然后 LoadContent() 作为补丁,它应该被修复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多