Войти
Вело-изобретателиФорумMXEngine - движок для VB6

MXEngine & dx_vb

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 325 26 Следующая »
#0
20:16, 14 мая 2011

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

logo | MXEngine & dx_vb

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 ; ShaderCompiler v2.3

+ Скриншоты

Предложения и идеи приветствуются...


#1
23:25, 14 мая 2011

Сейчас разрабатываю классы 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 Все классы точились под двиг!!! В дальнейшем сделаю независимую версию...

#2
10:22, 15 мая 2011

Для версии, заточенной под конкретный двиг, выглядит логично. Я бы поменял это:
>CopyToSurface
>ByRef pTexture As Direct3DTexture9 - текстура
>pStage As Long - номер сурфейса
Передавал бы не текстуру, а сам сурфейс, второй параметр, соответственно, не нужен. Ведь переменную под сурфейс можно не создавать, если не нужно, передавать так:
CopyToSurface tex1.GetSurfaceLevel(0)
Зато представь ситуацию, когда ты получаешь от какого-то объекта сурфейс, куда нужно что-то вставить, а твой метод этого не позволяет, не имея доступа ко всей текстуре.
И параметры типов Long, Single лучше объявлять ByVal. Во-первых - нет опасности случайно испортить значение, во-вторых - нет проблем с приведением типа, когда, например, вместо Long передаёшь Byte.

#3
11:03, 15 мая 2011

Mikle
Я в самом начале и хотел так сделать... Но было нужно узнать высоту и ширину сурфейса...
Как ты переделал SetData, функция больше не вылетает и не зависает, если я рисую рект больше чем текстура, а раньше нужно было делать проверку и заменять размеры из

Texture.GetLevelDesc(Stage)

Как думаешь не будет ли глюков на других пк при передаче ректа, который больше текстуры?
Если нет, то сделаю простую передачу сурфейса...

#4
11:16, 15 мая 2011

max255
> не будет ли глюков на других пк при передаче ректа, который больше текстуры?
Не должно быть, локается не больше, чем размер сурфейса, но зачем передавать такой рект?
А прямое получение дескриптора из сурфейса я добавлю.

#5
11:26, 15 мая 2011

Mikle
> но зачем передавать такой рект
В одной из функчий рект считается из размера строки, а строку можно написать и больше сурфейса....

#6
11:34, 15 мая 2011

Лишняя проверка размера ректа не замедлит, а даже может ускорить - не будет куча информации гнаться "в пустоту".

#7
11:45, 15 мая 2011

Mikle
Тогда буду ждать:
>прямое получение дескриптора из сурфейса я добавлю

А сейчас займусь выводом текста квадами, ТЕ BitMap Text

#8
14:25, 15 мая 2011

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

Получилось четыре условия...

#9
18:23, 16 мая 2011

Mikle
Посоветуй как лучше реализовать BitMap Text
1)Интегрировать в класс Sprite и загружать текстуру текста и ini файл(ширина символов) с диска (генерация программой Bitmap Font Builder)
2)Создать отдельный класс,в котором будет генерироваться текстура шрифта из обьекта MXFont, добавить методов для печати
3)Интегрировать в класс Sprite и загружать текстуру текста и ini файл(ширина символов) с диска (генерация собственным генератором шрфта)

#10
1:54, 24 мая 2011

Вот первые эксперименты над BitMap текстом
Изображение удалено

#11
10:40, 24 мая 2011

max255
А почему буквы "мажутся"? Может битмап изначально имеет размер, не кратный двойке, а потом масштабируется?

#12
15:28, 24 мая 2011

Mikle
Эт я пытался прикрутить тень, тем более скрин зажат сильно... Вот демко и сырой код класса,плюс последние версии MXText и MXFont MXFontMap

#13
16:41, 24 мая 2011

Нормально, а можно тень приблизить? Лучше будет.

#14
17:00, 24 мая 2011

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

А вот если грузить из файла... Можно файл обработать как надо и пользоваться...
Позже сделаю загрузку из файла.

Страницы: 1 2 325 26 Следующая »
Вело-изобретателиФорумMXEngine - движок для VB6

Тема в архиве.