Разве мы не можем инициализировать шрифт во второй раз в VB.NET? - PullRequest
0 голосов
/ 08 ноября 2019

Я делаю 2D игру в VB.NET . Я использую только один объект шрифта для рисования строк в форме. Этот шрифт нужен только в Игровом меню . Поэтому я избавляюсь от шрифта, когда он не нужен, и инициализирую его снова, когда это необходимо.

font_1 = New Font ("Autobus Bold", 15.0)

Когда я используюэтот шрифт (font_1) для рисования строки в форме, я получаю эту ошибку.

Произошло необработанное исключение типа 'System.ArgumentException' в System.Drawing.dll

Дополнительная информация: параметр недействителен.

Когда я просматриваю шрифт, он показывает,

{Имя = Ссылка на элемент без общего доступа требует ссылки на объект,Размер = 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) - кисть. ГБ - Графический объект. ГБ успешно рисует фоновое изображение, прежде чем он рисует строку. Это происходит только тогда, когда отображается Игровое меню Ваша поддержка очень ценится.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Проблема была с кистью (textBrush: массив кисти). Когда я пропускаю каждый элемент в массиве и заново инициализируюсь, похоже, что с ними что-то случилось (как будто они больше не являются кистями. Снова просмотрите ошибку. Она говорит: «Параметр недействителен»). Поэтому я просто перенаправляю массив в 0.

Redim textBrush (0)

Это очищает предыдущие элементы. Затем я заново создаю массив, при необходимости снова инициализирую каждый из них.

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

Этот массив используется для изменения цвета текста при нажатии клавиш вверх и вниз. Я видел много людей, упоминавших об этой ошибке на форумахРазмер = 15.0}

Я не знаю, как это имя, но оно не влияет на программу. Это всегда так в любом шрифте.

0 голосов
/ 08 ноября 2019

После того как вы закончили рисовать свои вещи, вам нужно расположить все объекты вокруг Graphics, не только шрифт, но и все (лучше с помощью методов закрытия, таких как код ниже)

Если вам нужно новое графическое представлениеможет создать это в тот момент, когда это необходимо, без использования глобального объекта (при работе с графикой).

     Using gB As Graphics = Me.CreateGraphics

        Using textBrush As Brush = Brushes.Black

            Using font_1 As Font = New Font("Courier New", 15)

                gB.DrawString("Start", font_1, textBrush, 400, 98)

                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()
                'gB.DrawOtherthings()

            End Using

        End Using

    End Using
...