Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > Модули для BlitzMax

Ответ
 
Опции темы
Старый 08.05.2014, 03:42   #1
Черный крыс
 
Сообщений: n/a
Xors2D module

Доброго!

Вобсчем презентую свой модуль для работы с 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

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

Работа над модулем продолжается...
Вложения
Тип файла: rar xors2d.mod.rar (2.63 Мб, 972 просмотров)

Последний раз редактировалось Черный крыс, 09.05.2014 в 06:29.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (08.05.2014)
Старый 08.05.2014, 03:49   #2
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Xors2D module

FBO/FrameBuffer будет?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Online)
 
Ответить с цитированием
Старый 08.05.2014, 03:56   #3
Черный крыс
 
Сообщений: n/a
Ответ: Xors2D module

Сообщение от Randomize Посмотреть сообщение
FBO/FrameBuffer будет?
Планируется. Пока не знаю как его максимально органично внедрить...
 
Ответить с цитированием
Старый 08.05.2014, 05:31   #4
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Xors2D module

Как на счёт
Image.Load(url:Object)
Image.Draw()?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Online)
 
Ответить с цитированием
Старый 08.05.2014, 07:25   #5
Черный крыс
 
Сообщений: n/a
Ответ: Xors2D module

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

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

А вообще не плохо бы на основе обсуждений составить наиболее эргономичный\удобный\интуитивный интерфейс 2Д движка.
 
Ответить с цитированием
Старый 09.05.2014, 00:28   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Xors2D module

Image.draw - это OOP подход, и очень удобный имхо, т.к. реализация отрисовки будет именно в реализации класса картинки.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Черный крыс (09.05.2014)
Старый 09.05.2014, 00:35   #7
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Xors2D module

Если у объекта много индивидуальных настроек отрисовки то удобней чтобы он сам себя рисовал.
Если все объекты рисуются одинаково, а общие настроки в рендере, то тогда удобней рендером рисовать.
В любом случае структура интерфейса - условность, внутри то можно сделать так как более нативно для железа/гапи.
(Offline)
 
Ответить с цитированием
Старый 09.05.2014, 00:37   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Xors2D module

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

Проще иметь отдельные классы и вся работа с ними, строго в данном классе, так проще запоминать, также автодополнение, и документация более структурирована.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Черный крыс (09.05.2014)
Старый 09.05.2014, 02:33   #9
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Xors2D module

Я говорю то что нужно разделить - интерфейс делать в угоду пользователю, а внутренность в угоду железа/гапи - чтоб производительность была.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Черный крыс (09.05.2014)
Старый 09.05.2014, 06:06   #10
Черный крыс
 
Сообщений: n/a
Ответ: 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 ? Получается для них надо заводить дополнительные методы, тем самым засоряя класс ?
 
Ответить с цитированием
Старый 09.05.2014, 15:49   #11
Dzirt
Элита
 
Аватар для Dzirt
 
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений
(для 3,833 пользователей)
Ответ: Xors2D module

Создай класс BaseImage к примеру, в котором будет основной функционал(общий для всех више перечисленых типов) и наследуй его.
(Offline)
 
Ответить с цитированием
Старый 09.05.2014, 18:48   #12
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Xors2D module

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

А accessor'ы есть? Лучше конечно так:
width = image.width
image.width = 120 - ошибка (read-only).
(Offline)
 
Ответить с цитированием
Старый 10.05.2014, 05:35   #13
Черный крыс
 
Сообщений: n/a
Ответ: Xors2D module

Целочисленных векторов нет.

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

Последний раз редактировалось Черный крыс, 10.05.2014 в 08:07.
 
Ответить с цитированием
Старый 10.05.2014, 12:25   #14
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений
(для 1,359 пользователей)
Ответ: Xors2D module

Сообщение от Diablo1909 Посмотреть сообщение
Целочисленных векторов нет.

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


(Offline)
 
Ответить с цитированием
Старый 10.05.2014, 12:29   #15
Черный крыс
 
Сообщений: n/a
Ответ: Xors2D module

Сообщение от Кирпи4 Посмотреть сообщение
Перегрузка есть и прекрасно себя чувствует, если ты наследуешь какой-либо класс
Ты путаешь перегрузку с замещением.
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com