Софтверный 2D движок

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.09.2012 (Чт) 20:03

Mikle писал(а):Вот мануал с примерами: download/file.php?id=9763
Выбранное вложение больше не существует.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 06.09.2012 (Чт) 20:34

Странно, у меня скачивается.
Прикрепил к посту заново.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 21.01.2017 (Сб) 5:57

Mikle, не могу найти файл SR2D.TXT. Выложи отдельно плиз. Скачал 3.2 версию.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 21.01.2017 (Сб) 10:01

Я не писал ReadMe для новых версий. Вот для версии 2.0, в целом близко. Основные различия - отказ от работы с TGA в пользу BMP, JPG, PNG, поменян синтаксис некоторых методов, например, вместо PaintToHDC теперь PaintToDevice, вместо BlockDraw теперь TileDraw, расширены функции маски, например, добавлены коллизии MaskInterSector, добавлены новые возможности - вращение, масштабирование.
Вхождение осталось таким же простым, это я всегда считал главным для этого проекта. Будут вопросы - спрашивай.
Старая версия ReadMe:
Вложения
SR2D_VB6.zip
(4.76 Кб) Скачиваний: 46

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 21.01.2017 (Сб) 10:28

Спс, Mikle, вопросы конечно будут))) К примеру как сделать чистый проект - только показ фпс и главный цикл? Где скачать простые примеры - нарисовать один спрайт, как нарисовать спрайт с прозрачностью и тп. ЧТобы на основе простых исходников можно было разобраться и понять что и как)))
Ссори, майкл, прочитал файл описания, там немало примеров, но насчет чистого проекта хотелось бы услышать ответ)))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 21.01.2017 (Сб) 10:38

А кстати, чтобы сделать буферизацию ты используешь обычный спрайт sprBack (BackBuffer) и рисуешь в него, а только после всех операций выводишь на форму, правильно?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 21.01.2017 (Сб) 11:27

Don Leno писал(а):ты используешь обычный спрайт sprBack (BackBuffer) и рисуешь в него, а только после всех операций выводишь на форму, правильно?

Да, так никогда не будет мерцаний, да и скорость так выше.
Вот несколько примеров на SR2D3.2, в том числе пустой проект и простой спрайт. Другие примеры чуть сложнее.
https://yadi.sk/d/BKkbxAeT3A7ePX

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 21.01.2017 (Сб) 11:39

Mikle, спс пойду пробовать))))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 25.01.2017 (Ср) 17:25

Mikle, пишу тебе вопрос сюда, потому что он именно по твоему движку:
У меня есть изображение с красным, белым, черным. Можно ли с помощью твоего Апи сделать прозрачным красный и белый цвет на картинке? Если да, то просьба - примерчик))))

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 25.01.2017 (Ср) 17:55

Код: Выделить всё
Spr.AddColorKey ARGB(0, 255, 0, 0) ' делаем прозрачным красный цвет
Spr.AddColorKey ARGB(0, 255, 255, 255) ' делаем прозрачным белый цвет, красный остался прозрачным

Только нужно не забывать, что нужно указывать явно оператор OpAlphaTest при использовании Spr:
Код: Выделить всё
SprBack.Draw Spr, x, y, OpAlphaTest

Либо сделать OpAlphaTest для Spr оператором по умолчанию:
Код: Выделить всё
Spr.Init , , OpAlphaTest

Тогда в дальнейшем OpAlphaTest можно для Spr не указывать, просто писать:
Код: Выделить всё
SprBack.Draw Spr, x, y

Когда загружаешь спрайт из файла с использованием при загрузке ColorKey, OpAlphaTest назначается оператором по умолчанию автоматически.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 25.01.2017 (Ср) 18:02

Mikle, ты прям во-время. Вот написал и ждал, как знал что ты ответишь)))) СПС снова спасаешь меня)))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 25.01.2017 (Ср) 18:06

Еще небольшой вопрос по чистому проекту (Empty):
В коде цикл указан с DoEvents в загрузки формы
Код: Выделить всё
  While DoEvents
    Render
    FPS = FPS + 1
  Wend

Могу ли я его перенести в модуль и вставить вместо While...Wend - Do...Loop
Или лучше оставить как есть?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 25.01.2017 (Ср) 19:11

Можно перенести куда угодно, но перед началом цикла нужно отобразить форму, а DoEvents должен быть в цикле в любом случае, иначе управление перестанет работать. Такой вариант, это код модуля:
Код: Выделить всё
Option Explicit

Dim SprBack As New SR2D_Sprite
Public Running As Boolean

Sub Main()
  frmTest.Show
  SprBack.Init frmTest.ScaleWidth, frmTest.ScaleHeight
  Running = True
  Do While Running
    DoEvents
    'здесь опрос управления, физика и т. п.
    Render
  Loop
  Unload frmTest
End Sub

Private Sub Render()
  SprBack.ClearBuffer ARGB(0, 255 * Rnd, 255 * Rnd, 255 * Rnd)
  SprBack.PaintToDevice frmTest.hDC
End Sub

В свойствах проекта запускаемой указываем Sub Main(). В форме не забываем предусмотреть завершение работы, запихнуть Running = False в Form_QueryUnload или, к примеру, в Form_KeyDown на нажатие соответствующей клавиши.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 25.01.2017 (Ср) 19:15

Mikle, поправь если что не так:
AddColorKey - ты создаешь битовый массив картинки, где 0 - пиксель который является альфа-каналом, а 1 - отображаемый. Так?
Если да, то как ты это делаешь? Есть ли у тя в движке спец. Апи для загрузки такого массива? Или же ты юзаешь все тот же GetDIBits? Подскажи пжлста)))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 25.01.2017 (Ср) 19:24

как в спрайт загрузить картинку без прозрачности? OpPaint верно, при методе Draw?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 25.01.2017 (Ср) 22:18

В SR2D все спрайты, это 32-битные ARGB массивы. AddColorKey прописывает в альфаканал нули. Никаких других массивов у спрайта нет.
Никакого API для этого не используется, метод AddColorKey вызывает из SR2D.dll функцию SAddColorKey.
При методе Draw с оператором OpPaint содержимое спрайта источника 1 в 1 копируется на спрайт приёмник, с оператором OpAlphaTest идёт попиксельная проверка, если альфа > 127, то пиксель копируется, иначе пропускается. При других операторах получаются другие различные эффекты наложения. Если оператор не прописывать, то используется оператор по умолчанию для данного спрайта, изначально он OpPaint, при загрузке из файла или из другого спрайта с использованием ColorKey он становится OpAlphaTest, его можно всегда сменить с помощью Init.
Загрузка картинки без прозрачности - это LoadFromFile без указания ColorKey, но если сама картинка содержит информацию о прозрачности, например это PNG с альфаканалом, то без альфаканала не загрузить, но он никак не мешает задействовать OpPaint, то есть игнорировать альфаканал. При желании можно у загруженной картинки затереть сам альфаканал значением 255 (или любым другим) с помощью MulAddS2X либо MoveByte.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 26.01.2017 (Чт) 22:03

Mikle, а как мне бы этот массив спрайта получить и что в нем храниться (цвета и альфа канал, раз написал ARGB??) можешь про них поподробнее. Мне нужно считывать данные из массива и делать кое-какие вычисления. то есть к примеру у меня черный цвет на рисунке присутствует, я хочу найти все точки в массиве и поработать с ними, либо найти где находится самая верхняя черная точка на рисунке, эт так вкратце для чего и как))) Как собственно выглядит сам массив, что из себя он представляет (хочется понять как это все работает, заодно и пойму как спрайты работают;) )

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 26.01.2017 (Чт) 22:20

Это массив cBuf() из класса SR2D_Sprite, он не двухмерный, а одномерный, размер задаётся в методе Init:
Код: Выделить всё
ReDim cBuf(meWidth * meHeight - 1) As Long

Размеры спрайта хранятся в переменных meWidth и meHeight спрайта.
При желании можешь сделать массив Public и читать из внешних модулей его данные.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 27.01.2017 (Пт) 15:56

Майкл спс тебе за прекрасный движок и за подробные объяснения))) Отдельная благодарность за массив)))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 29.01.2017 (Вс) 13:24

Код: Выделить всё
    LoadFromFile App.Path & "\My.bmp", , , , OpPaint

Разбираюсь с синтаксисом, жаль нет подсветки как в Вб, отпиши если правильно))) Нужно ли параметры в скобки заключать?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 29.01.2017 (Вс) 13:33

И еще: Твоя Апи CopyMemory из SR2D идентична CopyMemory из Kernel32? Например, я могу смело взять строчку кода, в которой используется эта Апи(из kernel) и заменить на Апи из твоего движка - не будет артефактов? Просто зачем мне использовать Апи из kernel, если она в твоем движке есть ;)

И вопрос по работе с Font: Как отобразить мне текст с определенным шрифтом и определенным размером в спрайт, что то вроде
Код: Выделить всё
DrawText "Times New Roman", 8 ' 8 пунктов?

А то в твоем примере Font функция SpriteCreateText меня не очень устраивает, с использованием PictureBox...

Как отобразить текст в созданом контексте CreateCompitableDC? С определенным шрифтом и размером?
Последний раз редактировалось Don Leno 29.01.2017 (Вс) 13:55, всего редактировалось 1 раз.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 29.01.2017 (Вс) 13:53

Код: Выделить всё
    TxHwnd = GetDC(frmMain.rtbTx.hWnd)
    sprTx.Draw TxHwnd, 0, 0, OpPaint

пытаюсь скопировать содержимое из Текстового поля, а оно выдает ошибку, что не так???
пробовал через LoadFromIPicture но не помогает:
Код: Выделить всё
    sprTx.LoadFromIPicture TxHwnd, frmMain.hDC, 0, 0, OpPaint

В твоем движке не расчитано на использование из текстового поля???? Придется обращаться к BltBit?
Код: Выделить всё
    BitBlt tDc, 0, 0, pixTW, pixTH, TxHwnd, 0, 0, SRCCOPY 
    sprTx.LoadFromIPicture tDc, frmMain.hdc, , , , OpPaint

Что то у меня ничего не выходит (((((

Как я понимаю, твои методы воспринимают только IPicture из свойств объектов Image или Picture, а с hdc никак??? Может тогда напрямую CBuf присвоить массив через GetDIBits? Но вот как это сделать CBuf()=Ar()? Иль лучше CopyMemory задействовать?
Последний раз редактировалось Don Leno 29.01.2017 (Вс) 14:50, всего редактировалось 2 раз(а).

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 29.01.2017 (Вс) 14:43

Нашел кое-что:
Код: Выделить всё
Dim Spr as SR2D_Sprite
Spr.DataPTR (x,y)

What is it?! И с чем это есть? Я лишь понял что оно имеет отношение к массиву CBuf, но что она берет из него????

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 29.01.2017 (Вс) 15:39

DataPTR - это указатель на пиксель массива с указанными координатами.
Про остальное позже отвечу.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 30.01.2017 (Пн) 10:21

LoadFromFile App.Path & "\My.bmp", , , , OpPaint

Это неверно, ты вместо ColorKey подставляешь оператор. Просто не указывай ничего:
Код: Выделить всё
Spr.LoadFromFile App.Path & "\My.bmp"

Тогда будет использоваться оператор по умолчанию, для картинок без прозрачности это и так OpPaint
А ColorKey задаётся либо напрямую, типа &H5080FF, либо функцией ARGB().

Don Leno писал(а):Твоя Апи CopyMemory из SR2D идентична CopyMemory из Kernel32?

Да, только быстрее, особенно на маленьких объёмах.

Don Leno писал(а):Нужно ли параметры в скобки заключать?

Нет, если только это не функция, а Sub.

Don Leno писал(а):Как отобразить текст в созданом контексте CreateCompitableDC?

Например с помощью TextOut Lib "gdi32".

Don Leno писал(а):Как отобразить мне текст с определенным шрифтом и определенным размером в спрайт

Прямого метода нет, не устраивает через PictureBox - делай через CreateCompitableDC, печатай туда через тот же TextOut, далее с помощью GetDIBits переноси в буфер cBuf() так же, как это сделано в LoadFromIPicture().

Don Leno писал(а):В твоем движке не расчитано на использование из текстового поля?

В смысле из TextBox? Нет, у него нет свойства Picture
Тебя не устраивает PictureBox, при этом ты пытаешься работать с TextBox, нелогично, если уж использовать VB6 компоненты, то PictureBox наиболее подходит для создания спрайтов с текстом.

DataPTR я сделал специально для того, чтобы не делать cBuf Public, в том же GetDIBits вместо cBuf(0) можно вписать ByVal Spr.DataPTR(0, 0).

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 30.01.2017 (Пн) 22:28

Mikle, как содержательно и по сути))))
Дело в том что я пытаюсь модифицировать текстовое поле, но вот думаю, может стоит написать свое не используя ВБшные варианты. Но у меня проблема с переносом слов - как реализовать понятия не имею. Спс за TextOut и DataPtr)))
Если что буду дальше писать вопросы сюда, но пока теперь есть чем заняться)))))

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 31.01.2017 (Вт) 23:13

Mikle, вот снова прочитал твои ответы и появился вопрос:
Ты в будущем не планируешь добавлять метод к спрайтам для работы с DC? По моему было бы неплохо, брать картинку как с формы, пиктуребокса, даже текстбокса, из созданного DC (со всех где есть hDC)! Что-то вроде
Код: Выделить всё
Sprite.LoadFromDC

PS полагаю в версии 3.3? А то мне теперь придется ее написать)))

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3814
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Софтверный 2D движок

Сообщение Mikle » 01.02.2017 (Ср) 9:52

Don Leno писал(а):из созданного DC (со всех где есть hDC)!

У текстбокса нет hDC, а если ты создашь CompitableDC для текстбокса, это не значит, что там появится изображение этого текстбокса.
Для видимого, не перекрытого ничем текстбокса можно, конечно, вычислить регион и сделать скриншот, как это делается тут:
viewtopic.php?t=24556
Но это явно костыль, и функциональность неполная.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 311
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Софтверный 2D движок

Сообщение Don Leno » 01.02.2017 (Ср) 16:04

Не знаю Mikle, я беру его через GetDC и через BltBit только так берет свободно)))) Да, конечно он должен быть видимый. А интересно с невидимого можно как нить это сделать?! А LoadFromDc я предложил в основном для того чтобы можно было в спрайт с созданных DC брать ;) - это так мало ли кому пригодится))))

The trick
Постоялец
Постоялец
 
Сообщения: 510
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Софтверный 2D движок

Сообщение The trick » 01.02.2017 (Ср) 17:46

UA6527P

Пред.След.

Вернуться в Кирпичный завод

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron