forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Модули для BlitzMax (http://forum.boolean.name/forumdisplay.php?f=105)
-   -   Xors2D module (http://forum.boolean.name/showthread.php?t=19150)

Черный крыс 08.05.2014 03:42

Xors2D module
 
Вложений: 1
Доброго!

Вобсчем презентую свой модуль для работы с 2-д графикой на БМаксе. По сути является более простой и продвинутой заменой стандартного Max2D.

итак поехали...


Код:

Type TImage Abstract
    Method Width:Int() Abstract
       
    Method Height:Int() Abstract
       
    Method SetHandle(x:Float, y:Float) Abstract
       
    Method PositionTexture(u:Float = 0.0, v:Float = 0.0) Abstract
       
    Method ScaleTexture(u:Float = 1.0, v:Float = 1.0) Abstract
       
    Method RotateTexture(angle:Float) Abstract
End Type


Думаю тут все ясно... это стандартный класс картинки. Текстуру картинки можно прокручивать/скейлить/ротэйтить.


Код:

Type TFont Extends TImage Abstract
    Method SetCharRect(char:Byte, x:Int, y:Int, w:Int, h:Int) Abstract
       
    Method SetCharKerning(kerning:Float) Abstract
       
    Method SetLineKerning(kerning:Float) Abstract
End Type


А вот тут интереснее... Это класс графического шрифта. Он расширен от картинки, поэтому имеет все свойства предка (например, шрифт можно отрисовать как простую картинку). Реагирует на все трансформации глобальной матрицы, можно установить индивидуально каждому глифу ширину/высоту/позицию на текстуре по обеим осям/отступы между буквами/строками.


Код:

Type TFontLoader Abstract
    Rem
      bbdoc: Функция загрузки графического шрифта
      about:
      Если загрузка шрифта прошла успешно, функция должна вернуть True.
    End Rem
    Method Load:Byte(font:TFont, stream:TStream) Abstract
End Type


Загрузчик шрифтов. При запуске программы в системе автоматом устанавливается дефолтный моноширинный шрифт и загрузчик шрифтов HGE.


Код:

Type TEmitter Extends TImage Abstract
    Method SetImage(image:TImage) Abstract
       
    Method Copy:TEmitter() Abstract

    Method SetIndepend(enable:Int = True) Abstract
       
    Method SetEmission(emission:Int) Abstract ' parts/sec
       
    Method SetLifeTime(time:Float, spread:Float = 0.0) Abstract
       
    Method SetG(grav:Float, spread:Float = 0.0) Abstract
    Method SetW(wind:Float, spread:Float = 0.0) Abstract
       
    Method SetLSpeed(speed:Float, spread:Float = 0.0) Abstract
    Method SetRSpeed(speed:Float, spread:Float = 0.0) Abstract
    Method SetTSpeed(speed:Float, spread:Float = 0.0) Abstract
       
    Method SetLAccel(accel:Float, spread:Float = 0.0) Abstract
    Method SetRAccel(accel:Float, spread:Float = 0.0) Abstract
    Method SetTAccel(accel:Float, spread:Float = 0.0) Abstract
       
    Method SetEndSize(size:Float, spread:Float = 0.0) Abstract
    Method SetEndColor(r:Float, g:Float, b:Float, a:Float, spread:Float = 0.0) Abstract
       
    Method Count:Int() Abstract
End Type


Это класс для работы с системой частиц. Пока не рекомендуется к использованию. Так как работа над ним еще не закончена.

--------------------------------------------------------------------------

Также из модуля выпилены многие ненужные возможности из Max2D.

* Оставлены только 2 бленда - альфа и лайт. Остальные выпилены в виду бестолковости.
* AutiMidHandle и AutoImageFlags - это теперь глобальные переменные.
* Оставлено 2 флага - FILTEREDIMAGE и MIPMAPPEDIMAGE
* Выпилина кривая работа с трансформациями. Теперь все происходит на основе стека.

то есть вместо функций SetRotation/Scale мы работаем с матрицей напрямую

Translate(x, y) - перенос
Scale(x, y) - отмасштабировать
Rotate(angle) - повернуть

Есть возможность оперировать с историей изменений мартицы.

PushMatrix() - сохранить
PopMatrix() - восстановить
LoadMatrix() - сбросить текущую матрицу в идентичность

Соответственно, изменился интерфейс отрисовки. Теперь он выглядит так : DrawImage(image:TImage, frame:Int = 0)

Что бы отрисовать картинку на курсоре мыши :

Код:

LoadMatrix()
Translate(MouseX(), MouseY())
DrawImage(image)


Для кого то может показаться геммороем, но такой способ отрисовки более грамотен чем тот, который был предложен мистером Сибли. Многие вещи будут реализовываться гораздо проще именно стеково-матричным способом.

В этом модуле отсутствует Max2D коллизия в виду ее тормознутости. Зато присутствует быстрый Image-mouse picking

Модуль полностью задокументирован на русском языке, поэтому особых сложностей вызвать не должен.

Работа над модулем продолжается...

Randomize 08.05.2014 03:49

Ответ: Xors2D module
 
FBO/FrameBuffer будет?

Черный крыс 08.05.2014 03:56

Ответ: Xors2D module
 
Цитата:

Сообщение от Randomize (Сообщение 280214)
FBO/FrameBuffer будет?

Планируется. Пока не знаю как его максимально органично внедрить...

Randomize 08.05.2014 05:31

Ответ: Xors2D module
 
Как на счёт
Image.Load(url:Object)
Image.Draw()?

Черный крыс 08.05.2014 07:25

Ответ: Xors2D module
 
Цитата:

Сообщение от Randomize (Сообщение 280218)
Как на счёт
Image.Load(url:Object)
Image.Draw()?

хммм.....

предлагаешь, что бы картинка могла сама себя загрузить и отрисовать? Мне это обстоятельство немного рвет шаблон, так как всегда считал, что подобным должен заниматься графический драйвер...

А вообще не плохо бы на основе обсуждений составить наиболее эргономичный\удобный\интуитивный интерфейс 2Д движка.

moka 09.05.2014 00:28

Ответ: Xors2D module
 
Image.draw - это OOP подход, и очень удобный имхо, т.к. реализация отрисовки будет именно в реализации класса картинки.

Samodelkin 09.05.2014 00:35

Ответ: Xors2D module
 
Если у объекта много индивидуальных настроек отрисовки то удобней чтобы он сам себя рисовал.
Если все объекты рисуются одинаково, а общие настроки в рендере, то тогда удобней рендером рисовать.
В любом случае структура интерфейса - условность, внутри то можно сделать так как более нативно для железа/гапи.

moka 09.05.2014 00:37

Ответ: Xors2D module
 
Гапи не определяет, а вот пользователь - однозначно определяет.
Если в угоду Гапи делать убого неудобный интерфейс, то пользователи не заинтересуются.

Проще иметь отдельные классы и вся работа с ними, строго в данном классе, так проще запоминать, также автодополнение, и документация более структурирована.

Samodelkin 09.05.2014 02:33

Ответ: Xors2D module
 
Я говорю то что нужно разделить - интерфейс делать в угоду пользователю, а внутренность в угоду железа/гапи - чтоб производительность была.

Черный крыс 09.05.2014 06:06

Ответ: Xors2D module
 
ok.

Тогда у меня получается вот такой предварительный класс...

Код:


Type TImage

    Method Create:TImage(width%, height%, flags% = -1)

    Method Load:TImage(url:Object, flags% = -1)

    Method GetSize(x% Var, y% Var)

    Method SetHandle(x#, y#)

    Method GetHandle(x# Var, y# Var)

    Method PositionTexture(x#, y#)

    Method RotateTexture(angle#)

    Method ScaleTexture(x#, y#)

    Method Draw()

End Type

Только получается несколько загвосток...

* Этот класс только для одинарного изображения ( анимированные картинки - отдельный класс? )
* Здесь только один метод Draw(). А ведь есть же еще DrawImageRect() ? DrawSubImageRect() ? TileImage ? Получается для них надо заводить дополнительные методы, тем самым засоряя класс ?

Dzirt 09.05.2014 15:49

Ответ: Xors2D module
 
Создай класс BaseImage к примеру, в котором будет основной функционал(общий для всех више перечисленых типов) и наследуй его.

moka 09.05.2014 18:48

Ответ: Xors2D module
 
GetSize принимает X и Y?
Если в движке есть 2D векторы, пусть он такой возвращает, либо делай: getWidth, getHeight.

А accessor'ы есть? Лучше конечно так:
Код:

width = image.width
image.width = 120 - ошибка (read-only).


Черный крыс 10.05.2014 05:35

Ответ: Xors2D module
 
Целочисленных векторов нет.

В БМаксе у классов нет свойств, инкапсуляции и перегрузки.

Кирпи4 10.05.2014 12:25

Ответ: Xors2D module
 
Цитата:

Сообщение от Diablo1909 (Сообщение 280330)
Целочисленных векторов нет.

В БМаксе у классов нет свойств, инкапсуляции и перегрузки.

Перегрузка есть и прекрасно себя чувствует, если ты наследуешь какой-либо класс

Черный крыс 10.05.2014 12:29

Ответ: Xors2D module
 
Цитата:

Сообщение от Кирпи4 (Сообщение 280342)
Перегрузка есть и прекрасно себя чувствует, если ты наследуешь какой-либо класс

Ты путаешь перегрузку с замещением.


Часовой пояс GMT +4, время: 23:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot