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

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

Модератор: Brickgroup

AWPStar
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 29.07.2010 (Чт) 2:32

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

Сообщение AWPStar » 04.02.2017 (Сб) 23:46

Привет.
4ю версию планируешь в обозримом будущем?

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

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

Сообщение Mikle » 05.02.2017 (Вс) 9:17

AWPStar писал(а):4ю версию планируешь в обозримом будущем?

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

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

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

Сообщение Teranas » 05.02.2017 (Вс) 9:35

Да и третья шикарная, для нееё хелпик детальный только нужен и будет вообще улётная уштука
С уважением, Андрей.

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

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

Сообщение Don Leno » 05.02.2017 (Вс) 11:06

Trick, ты всегда лаконично информативно))))

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

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

Сообщение Don Leno » 05.02.2017 (Вс) 11:28

Mikle, вопрос по GetDIBits:


Код: Выделить всё
    int GetDIBits(
      HDC hdc,           // дескриптор DC
      HBITMAP hbmp,      // дескриптор рисунка
      UINT uStartScan,   // первая устанавливаемая строка развертки
      UINT cScanLines,   // число копируемых строк развертки
      LPVOID lpvBits,    // массив для битов рисунка
      LPBITMAPINFO lpbi, // буфер данных рисунка
      UINT uUsage        // индексы RGB или палитры
    );

Она извлекает данные из рисунка в массив, но извлекает из дескриптора рисунка или из дескриптора контекста?? И что для чего нужно?? Как вообще она работает???

Ах, чуть не забыл, как из контекста вытащить в рисунок IPicture?

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

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

Сообщение The trick » 05.02.2017 (Вс) 11:33

Don Leno писал(а):Она извлекает данные из рисунка в массив, но извлекает из дескриптора рисунка или из дескриптора контекста?? И что для чего нужно?? Как вообще она работает??? Ах, чуть не забыл, как из контекста вытащить в рисунок IPicture?

Из рисунка.
Можешь кстати посмотреть вот тут проект 3D форма, там как раз образ окна в текстуру копируется.
UA6527P

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

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

Сообщение Don Leno » 05.02.2017 (Вс) 12:06

Trick, не вижу в упор (смотрел сабу таймера и WndProcHandler_WndProc)!?? нашел лишь:
Код: Выделить всё
                ' // Create the bitmap with the contents of window
                tmpDC = CreateCompatibleDC(Me.hdc)
                oldBmp = SelectObject(tmpDC, bmpShadow)
                PrintWindow hWnd, tmpDC, 0
                SelectObject tmpDC, oldBmp
                DeleteDC tmpDC
                ' // Move data from the bitmap to the texture
                texture.LockRect 0, rect, ByVal 0&, 0
                           
                lpDat = lpBmpData

Но не понимаю я (((
Создается DC в него выбирается созданная DIBка( bmpShadow) и далее фиксируется область текстуры (texture.LockRect), но вот далее не понимаю как происходит копирование?? И где здесь вообще IPicture?? Вроде бы надо Dc To IPicture..

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

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

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

Trick, спс за исходник Лупы с ним поработал и нашел то что надо.
Теперь кину код, но это лишь набросок и он глючит и не работает, просьба пните в верном направлении)))
Код: Выделить всё
Public Sub LoadFromDC(ByVal hDC As Long)
Dim cDc As Long, cBmp As Long, nBmp As Long

    cDc = CreateCompatibleDC(frmMain.hDC)
    cBmp = CreateCompatibleBitmap(frmMain.hDC, meWidth, meHeight)
    nBmp = SelectObject(cDc, cBmp)

    BitBlt cDc, 0, 0, meWidth, meHeight, hDC, 0, 0, vbSrcCopy

    GetDIBits cDc, cBmp, 0, meHeight, cBuf(0), bi32BitInfo, 0

    SelectObject tDc, nBmp
    DeleteDC tDc
    DeleteObject cBmp
End Sub

Суть в том, чтобы написать небольшую сабу для себя чтобы можно было грузить графику из DC в спрайты SR2D

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

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

Сообщение Mikle » 05.02.2017 (Вс) 19:22

Don Leno писал(а):просьба пните в верном направлении

Сначала понять бы твою конечную цель. Хочешь загружать спрайт с элементов, типа текстбокса? Тогда это будет, скорее, LoadFromWindow, а не LoadFromDC, передавать туда hWnd окна.
Если так - The trick верно говорит, PrintWindow. Если на заморачиваться с созданием битмапа с помощью API, а воспользоваться невидимой PictureBox, то это можно вообще одной строкой делать, типа того:
Код: Выделить всё
PrintWindow Text1.hWnd, Pic1.hDC

А потом из Pic1 в спрайт с помощью LoadFromIPicture.

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

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

Сообщение Don Leno » 12.02.2017 (Вс) 20:03

Mikle, я использую RichTextBox лишь для того чтобы не заморачиваться с написанием своего текстового поля (+ртф поддержка у него). А лишние скрытые объекты мне не нужны...(на апи бы хотелось сделать))) ) Можно ли использовать вместо PictureBox к примеру StdPicture?? Опишите в теории пжлста!
Кстати, Mikle, я использовал в спрайте прозрачность белого и потом рисовал в буфер (с параметром OpAlphaTest), так представь мое удивление когда он напрочь отказался отобразить содержимое спрайта в буфере :D
Потом методом перебора наткнулся на OpMin (который как раз работает!!!), но в описании к SR2D его к сожалению нет!
Поэтому есть просьба, может все таки с выходом новой версии ты хотя бы сделаешь новый файл описания))))
А на счет LoadFromWindow ты явно прав! :D Я все таки дописал эту сабу, так пока наброском и осталась, но результат явно виден))) (см исходник)
Спс за апи PrintWindow, но суть что нужно выдернуть изображение в массив CBuf() для Mikle as SR2D_Sprite)))
PS Вот операторы которых нет в описании: OpMin, OpMax, OpBlend, OpMul, OpMul2X
И за оптимизацию сабы LoadFromDC не пинайте - это пока набросок кода)))
Вложения
Копия Clean.rar
(18.34 Кб) Скачиваний: 263

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

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

Сообщение Mikle » 13.02.2017 (Пн) 11:11

Don Leno писал(а):за оптимизацию сабы LoadFromDC не пинайте - это пока набросок кода

У тебя там путаница в терминах, ты используешь hDC, а называешь его hWnd.
OpMul, OpMul2X - это то же самое, что во второй версии называлось OpMod, OpMod2X. Я переименовал, когда писал порт для vb.net, там это более структурировано, есть Enum Op, его поля пишутся через точку, типа Op.Add, Op.AlphaTest. А слово Mod зарезервировано VB.
OpMin, OpMax - покомпонентно сравниваются источник и приёмник, в приёмник попадает меньшее (или большее).
OpBlend - линейная интерполяция источника и приёмника, регулируется свойством источника BlendFactor.
BlendFactor - это цвет, его можно задавать, как ARGB(x, x, x, x), меняя x от 0 до 255, делаем постепенное появление изображения, можно работать покомпонентно, в разной степени регулировать прозрачность R G и B.

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

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

Сообщение Don Leno » 13.02.2017 (Пн) 16:02

Mikle, спс я в готовом коде переименую и сабу и hwnd))) А по самой сабе добавить/изменить ничего не подскажешь? Может оптимизировать как-нить?

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

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

Сообщение Mikle » 14.02.2017 (Вт) 11:22

Don Leno писал(а):А по самой сабе добавить/изменить ничего не подскажешь? Может оптимизировать как-нить?

Могу, конечно.
Как-то так:
Код: Выделить всё
Public Sub LoadFromWindow(ByVal hWnd As Long)
  Dim cDC As Long, hDC As Long, Bmp As Long
  Dim R As RECTL

  hDC = GetDC(hWnd)
  GetWindowRect hWnd, R
  Init R.Right - R.Left, R.Bottom - R.Top
  cDC = CreateCompatibleDC(hDC)
  Bmp = CreateCompatibleBitmap(hDC, meWidth, meHeight)
  SelectObject cDC, Bmp

  BitBlt cDC, 0, 0, meWidth, meHeight, hDC, 0, 0, vbSrcCopy
  GetDIBits cDC, Bmp, 0, meHeight, cBuf(0), bi32BitInfo, 0
  DeleteObject Bmp
  DeleteDC cDC
End Sub

Остаётся добавить параметры Optional ByVal Trans As SR2D_Transform = TrNone, Optional ByVal W As Long = 0, Optional ByVal H As Long = 0, Optional ByVal cKey As Long = -1 по аналогии с тем, как это сделано в LoadFromIPicture и других процедурах загрузки.

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

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

Сообщение Don Leno » 16.02.2017 (Чт) 0:42

Mikle! Благодарю за помощь! Теперь она гораздо лучше смотриться)))

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

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

Сообщение Don Leno » 16.02.2017 (Чт) 7:45

Mikle, а как сделать альфа каналом все цвета кроме одного?

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

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

Сообщение Mikle » 16.02.2017 (Чт) 10:14

Don Leno писал(а):как сделать альфа каналом все цвета кроме одного?

Смотри пример, кликом по форме делаем все цвета в SprTree, кроме ARGB(0, 255, 0, 255), прозрачными:
Вложения
Test.zip
(55.61 Кб) Скачиваний: 285

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

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

Сообщение Don Leno » 16.02.2017 (Чт) 10:31

Mikle, спс за пример)))

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

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

Сообщение Jack Ferre » 07.03.2018 (Ср) 14:20

Mikle
Отличная работа!


Решил попробовать. Нашел некоторые недочёты.

Метод SR2D_Sprite::DrawRotate с включеным AA рисует чёрные(тёмные) пиксели на границе прозрачных и непрозрачных пикселей:
scr_aa_1.png
scr_aa_1.png (4.52 Кб) Просмотров: 5825

При параметре Angle равном нулю должно получиться оригинальное изображение, а оно размыто. Будто сдвинуто на (0.5, 0.5).
scr_aa_2.png
scr_aa_2.png (2.07 Кб) Просмотров: 5825

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

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

Сообщение Mikle » 12.03.2018 (Пн) 10:38

Первый недочёт оставлен сознательно ради быстродействия - если важны края, то можно поворачивать на чёрном фоне. DrawRotate, это не Draw, его правильнее назвать методом получения повёрнутого изображения, а не наложения изображений с поворотом.
Вот второй недочёт есть, и, кажется, я уже нашёл причину в исходнике DLL.
На будущее я вообще хотел сделать координаты центров типа Single, чтобы при желании можно было и сдвинуть на долю пикселя. Или чтобы вращать изображение с нечётным размером точно вокруг центра.

Пред.

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

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

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

    TopList