-6

我正在使用 .NET Framework 2.0 来编写 2d 平台游戏。我正在使用 SFML .NET,因为它是跨平台的,受 MONO 支持,并且具有成熟的 API。我的问题是,虽然我的程序可以正确编译并正常运行,但在关闭它时出现错误。

“0x5ed0530e”处的指令引用了“0x0000051c”处的内存。无法“读取”内存

经过仔细调试,我注意到在我初始化 SFML String2d 类之后出现了问题。

怎么了; 为什么关闭程序时会出现这个错误?即使没有任何问题,是否仍然可以停止接收错误,以便我的程序的用户不会对此感到恼火?

使用系统;使用 SFML.Graphics;使用 SFML.Window;

namespace ProGUI
{
    class TextBox : Sprite
    {
        private String2D Text;
        public TextBox(RenderWindow App)
        {
            Image = new Image(App.Width, App.Height / 4, new Color(0, 0, 0));
            Position = new Vector2(0, App.Height - App.Height / 4);
        }

        public void SetText(string text)
        {
            Text = new String2D(text);
            Text.Font = new Font("Greyscale_Basic_Bold.ttf");
            Text.Position = new Vector2(Position.X + 5, Position.Y + 5);
            Text.Size = 12;
        }

        public string GetText()
        {
            return Text.Text;
        }

        public void Render(RenderWindow App)
        {
            App.Draw(this);
            App.Draw(Text);
        }

        public void MainLoop(RenderWindow App, Color clr)
        {
            while (App.IsOpened())
            {
                App.Clear(clr);

                App.DispatchEvents();

                App.Draw(this);
                App.Draw(Text);

                App.Display();
            }
        }
    }
}

如您所见,没有不可靠的代码。绝对干净和简单。

4

5 回答 5

8

SFML String2d 类是否实现 IDisposable?您是否正确处理所有实例?

当它们处于无效状态时,终结器线程可能正在处理它们。

于 2011-06-28T16:59:16.060 回答
3

你最好在 SFML 论坛上问这个问题。一个快速的谷歌出现了这个线程,这表明 String2D 类型存在问题。

于 2011-06-28T17:45:54.267 回答
3

此代码将无限递归:

    public void Render(RenderWindow App)
    {
        App.Draw(this);
        App.Draw(Text);
    }

既然App.Draw,叫上了Sprite x,就会叫x.Render(App)。所以App.Draw(this)会在内部调用this.Render(App).

于 2011-06-28T18:17:35.233 回答
1

编译应用程序后,从 Visual Studio 命令行尝试“EditBin.exe /NXCOMPAT:NO C:\AppName.exe”。

于 2011-06-28T17:01:16.170 回答
1

您会发现String2d该类:

  • 有一个错误

或(更有可能,鉴于您的问题的描述)

  • 在应用程序生命周期的错误时间点被调用。

例如,此时是否已Text初始化属性的容器?是否有多个线程同时访问该Text属性(在您的情况下,我正在考虑某种游戏循环)?

对我来说,由于这发生在您的应用程序关闭时,我希望在运行时释放表单/窗口之后SetText,在关闭期间调用此方法。如果您将代码设置在表单的事件中,您会得到类似的结果。this.TextClosed

于 2011-06-28T17:05:45.283 回答