首页 > 解决方案 > 我们不能在 VB.NET 中第二次初始化字体吗?

问题描述

我正在VB.NET 中制作2D 游戏。我只使用一个字体对象在表单上绘制字符串。此字体仅在Game Menu中需要。因此,我在不需要时处理字体并在需要时再次初始化它。

font_1 = 新字体("Autobus Bold", 15.0)

当我使用此字体 (font_1) 在表单上绘制字符串时,出现此错误。

System.Drawing.dll 中出现“System.ArgumentException”类型的未处理异常

附加信息:参数无效。

当我查看字体时,它显示,

{Name = 对非共享成员的引用需要对象引用。大小=15.0}

首次加载游戏菜单(首次初始化font_1时)不会出现此错误。当用户玩游戏时,字体被处理掉。当用户再次进入游戏菜单时,字体在用于绘图之前再次初始化。当字体用于在窗口上绘制字符串时,会发生此错误。

看起来错误仅在字体系列中。我在几个论坛上看到了这个问题,但没有人给出解决方案。(这是我在论坛的第一个问题)

编辑:我删除了字体(font_1)。但我仍然得到同样的错误。这是绘制字符串的代码。

Private Sub mcFramesHandler_TIMER_Tick(sender As Object, e As EventArgs) Handles mcFramesHandler_TIMER.Tick

    gB.Clear(Color.Black)
    gB.DrawImage(Background_IMG, 0, 0, 640, 480)

    Select Case currentMode

        Case GameMode.OnGame
            If mcShoot_TIMER.Enabled Then gB.DrawImage(Bullet_IMG, Bullet_X, Bullet_Y, 20, 50)
            If mcEneShoot_TIMER.Enabled Then gB.DrawImage(EneBullet_IMG, EneBullet_X, EneBullet_Y, 20, 50)
            If Shooter_Lives Then gB.DrawImage(Shooter_IMG, Shooter_X, Bullet_Y_Def, 100, 105)
            If mcMoveEnemy_TIMER.Enabled Then gB.DrawImage(Enemy_IMG, Enemy_X, 10, 100, 80)
            If mcExplode_TMER.Enabled Then gB.DrawImage(Explotion_IMG, Explotion_X, Explotion_Y, 100, 80)

        Case GameMode.Begining
            gB.DrawString("Start", New Font("Autobus Bold", 15.0), textBrush(0), 110, 98) 'Error is generated in this line
            gB.DrawString("Credits", New Font("Autobus Bold", 15.0), textBrush(1), 102, 158)
            gB.DrawString("Exit", New Font("Autobus Bold", 15.0), textBrush(2), 114, 218)

    End Select

    Me.CreateGraphics.DrawImage(backbuffer, 0, 0, 640, 480)

End Sub

这里 textBrudh(0) 是一个画笔。gB 是图形对象。gB 在绘制字符串之前成功绘制了背景图像。仅当显示游戏菜单时才会发生这种情况非常感谢您的支持。

标签: vb.netfontsreferenceinitializationdrawing

解决方案


问题出在画笔上(textBrush:一组画笔)。当我对数组中的每个项目进行 dsipose 并重新初始化时,它们似乎发生了一些事情(就像它们不再是画笔一样。再次查看错误。它说“参数无效”)。所以我只是将数组重新调整为 0。

Redim textBrush (0)

这将清除以前的项目。然后我重新调整数组,在需要时再次初始化它们中的每一个。

Redim textBrush (2)
textBrush (0) = Brushes.Yellow
textBrush (1) = Brushes.Red
textBrush (2) = Brushes.Red

该数组用于在按下向上和向下键时更改文本颜色。我看到很多人在论坛中提到了这个错误

{Name = 对非共享成员的引用需要对象引用。大小=15.0}

我不知道这个名字是什么,但它不会影响程序。在任何字体中总是这样。


推荐阅读