Текущее состояние проекта: Freeze

MXEngine - игровой движок на VB6. В начале разработки двиг базировался на DX8...
Теперь благодаря порту dx_vb от Mikle ведется переделка движка на DX9, за что ему отдельное спасибо.
Движок представляет собой набор классов и модулей подключаемых к проекту.
Характеристики и возможности v2.4.1a:
- Direct9 GAPI
- Поддержка вертексных и пиксельных шейдеров
- Управление: клавиатура, мышь
- Текстурный менеджер
- Буферизированная передача констант в шейдер
- Универсальная система частиц с расчетами на CPU
- Надстройка для создания VertexDeclaration
- Вывод текста в сурфейс
- Текстурный шрифт с возможностю маштабирования, поворота на произвольный угол
- Надстройка над FFP текстурированием
- Ведение лога событий
- Вывод 2D спрайтов, тайлов, с поддержкой NO_POW2 текстур и атласов
- Вывод области из спрайта
- Вывод спрайта любой формы
- Группировка и LOD текстур
Последняя версия движка: MXEngine SDK v2.4.1a
Компилятор шейдеров: Shader compiler v2.2 ; [file=78261]
Предложения и идеи приветствуются...
Сейчас разрабатываю классы MXText и MXFont
MXText - представляет собой "бэк-буффер" куда выводится текст, затем производится копирование в сурфейс текстуры
Вот его методы:
Init - инициализация, параметры:
Optional MaxX As Long = 2048 - Ширина буфера
Optional MaxY As Long = 50 - Высота буфера (ТЕ текст вышедший за рамки буфера не визуализируется)
Optional ExtX As Long = 5 - Дополнительный отступ в пикселях(от текста), только для PrintToSurface
Optional ExtY As Long = 0 - Дополнительный отступ в пикселях(от текста), только для PrintToSurface
Optional bgColor As Long = &H0 - Цвет закрашивания буфера
PrintToSurface - печать текста на сурфейс (в сурфейс выводится только область строки, все остальное не заменяется)
ByRef pTexture As Direct3DTexture9 - Текстура
pStage As Long - Номер сурфейса
ByRef pFont As MXFont - Шрифт
pX As Long - Позиция по X (относительно сурфейса)
pY As Long - Позиция по Y (относительно сурфейса)
pText As String - Текст
Optional pColor As Long = &HFFFFFF - Цвет текста
ClearBuffer - очистка бэк-буффера
Optional left As Long = 0
Optional top As Long = 0
Optional right As Long = 0
Optional bottom As Long = 0 - рект очистки
PrintToBuffer - печать текста в буффер
ByRef pFont As MXFont - обьект шрифт
pX As Long - позиция по X
pY As Long - позиция по Y
pText As String - строка
Optional pColor As Long = &HFFFFFF - цвет текста
CopyToSurface
ByRef pTexture As Direct3DTexture9 - текстура
pStage As Long - номер сурфейса
Обьект MXFont - обертка над API функцией CreateFont, плюс конструктор и деструктор...
Методы:
CreateFont
fName As String - название шрифта
fSize As Long - размер
isItalic As Boolean - курсивный
isUnderline As Boolean - подчеркнутый
isStrike As Boolean - зачеркнутый
isBold As Boolean - жирный
GetHandle - без параметров, возвращает заголовок шрифта.
Подскажите, может что лишнее... Может что то еще можно сделать, в общем какие-нибудь идеи...
Вот демко MXText Все классы точились под двиг!!! В дальнейшем сделаю независимую версию...
Для версии, заточенной под конкретный двиг, выглядит логично. Я бы поменял это:
>CopyToSurface
>ByRef pTexture As Direct3DTexture9 - текстура
>pStage As Long - номер сурфейса
Передавал бы не текстуру, а сам сурфейс, второй параметр, соответственно, не нужен. Ведь переменную под сурфейс можно не создавать, если не нужно, передавать так:
CopyToSurface tex1.GetSurfaceLevel(0)
Зато представь ситуацию, когда ты получаешь от какого-то объекта сурфейс, куда нужно что-то вставить, а твой метод этого не позволяет, не имея доступа ко всей текстуре.
И параметры типов Long, Single лучше объявлять ByVal. Во-первых - нет опасности случайно испортить значение, во-вторых - нет проблем с приведением типа, когда, например, вместо Long передаёшь Byte.
Mikle
Я в самом начале и хотел так сделать... Но было нужно узнать высоту и ширину сурфейса...
Как ты переделал SetData, функция больше не вылетает и не зависает, если я рисую рект больше чем текстура, а раньше нужно было делать проверку и заменять размеры из
Texture.GetLevelDesc(Stage)
Как думаешь не будет ли глюков на других пк при передаче ректа, который больше текстуры?
Если нет, то сделаю простую передачу сурфейса...
max255
> не будет ли глюков на других пк при передаче ректа, который больше текстуры?
Не должно быть, локается не больше, чем размер сурфейса, но зачем передавать такой рект?
А прямое получение дескриптора из сурфейса я добавлю.
Mikle
> но зачем передавать такой рект
В одной из функчий рект считается из размера строки, а строку можно написать и больше сурфейса....
Лишняя проверка размера ректа не замедлит, а даже может ускорить - не будет куча информации гнаться "в пустоту".
Mikle
Тогда буду ждать:
>прямое получение дескриптора из сурфейса я добавлю
А сейчас займусь выводом текста квадами, ТЕ BitMap Text
Mikle
> Лишняя проверка размера ректа не замедлит, а даже может ускорить - не будет
> куча информации гнаться "в пустоту".
Вот сделал проверку:
If posX < 0 Then posX = 0 End If If posX + t_string_size.X > t_surface_desc.Width Then posX = t_surface_desc.Width - t_string_size.X End If If posY < 0 Then posY = 0 End If If posY + t_string_size.Y > t_surface_desc.Height Then posY = t_surface_desc.Height - t_string_size.Y End If
Получилось четыре условия...
Mikle
Посоветуй как лучше реализовать BitMap Text
1)Интегрировать в класс Sprite и загружать текстуру текста и ini файл(ширина символов) с диска (генерация программой Bitmap Font Builder)
2)Создать отдельный класс,в котором будет генерироваться текстура шрифта из обьекта MXFont, добавить методов для печати
3)Интегрировать в класс Sprite и загружать текстуру текста и ini файл(ширина символов) с диска (генерация собственным генератором шрфта)
max255
А почему буквы "мажутся"? Может битмап изначально имеет размер, не кратный двойке, а потом масштабируется?
Mikle
Эт я пытался прикрутить тень, тем более скрин зажат сильно... Вот демко и сырой код класса,плюс последние версии MXText и MXFont MXFontMap
Нормально, а можно тень приблизить? Лучше будет.
Mikle
С моим генератором, думаю что сложновато... Что-бы увеличить символ надо менять шрифт...
For i = 0 To 15 'таблица 16х16 For j = 0 To 15 GetTextExtentPoint32 b_DC, Chr(b_char), 1, b_char_size 'получить размер символа Chr(номер символа) m_char(b_char).left = j * b_text_metric.tmMaxCharWidth 'b_text_metric - данные о шрифте m_char(b_char).top = i * b_text_metric.tmHeight 'начальная позиция символа m_char(b_char).right = j * b_text_metric.tmMaxCharWidth + b_char_size.x + ErrX + 4 m_char(b_char).bottom = i * b_text_metric.tmHeight + b_char_size.y + ErrY + 2 'конечная (Err-ошибка размера, ее задает пользователь) (+2 - это тень) SetTextColor b_DC, RGB(20, 20, 100) 'цвет тени, рисуем тень TextOut b_DC, (j * b_text_metric.tmMaxCharWidth) + 4, (i * b_text_metric.tmHeight) + 2, Chr(b_char), 1 SetTextColor b_DC, RGB(0, 0, 255) 'цвет символа, рисуем символ TextOut b_DC, j * b_text_metric.tmMaxCharWidth, i * b_text_metric.tmHeight, Chr(b_char), 1 b_char = b_char + 1 'следующий символ Next Next
А вот если грузить из файла... Можно файл обработать как надо и пользоваться...
Позже сделаю загрузку из файла.
Тема в архиве.