Страница: 1 | 2 | 3 |
Вопрос: Спрайты для игроделов
Добавлено: 10.10.05 07:44
Автор вопроса: CyRax | Web-сайт:
http://www.reinerstileset.4players.de:1059/englisch.htm
Ответы
Всего ответов: 34
Номер ответа: 1
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #1
Добавлено: 10.10.05 16:14
хм, неплохо. Я вот тоже заинтересовался играми в последнее время. Слушай , CyRax, как удмаешь, на ВБ можно написать стратегию?Без директикса, наверное, потому, что я с директиксом не работал ещё... на BitBlt бы... Как думаешь реально? (только отвечай плиз на уровне, я ведь не вчера ВБ в руки взял )
Номер ответа: 2
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #2
Добавлено: 10.10.05 17:10
Игры на VB жанра вроде RTS я бы не советовал делать на BitBlt. Для полной свободы действий нужно привязать картинку на форме к байтовому массиву. Ну то есть... я думаю, ты понял. Примитивный графический движок такой. Я это через safearray делаю. Примерно таким макаром:
Declarations:
Option Explicit
Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long
Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByRef Destination As Any, ByVal Length As Long)
Declare Sub FillMemory Lib "kernel32.dll" Alias "RtlFillMemory" (ByRef Destination As Any, ByVal Length As Long, ByVal Fill As Byte)
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Type SAFEARRAY1D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
Bounds(0 To 0) As SAFEARRAYBOUND
End Type
Type SAFEARRAY2D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
Bounds(0 To 1) As SAFEARRAYBOUND
End Type
Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
Dim sa As SAFEARRAY2D, bmp As BITMAP, pict() As Byte
Form_Load:
Me.Picture = LoadPicture(App.Path & "\ICE24.JPG"
GetObjectAPI Me.Picture, Len(bmp), bmp
If bmp.bmBitsPixel <> 24 Then
MsgBox " 24-bit bitmaps only", vbCritical
Exit Sub
End If
With sa
.cbElements = 1
.cDims = 2
.Bounds(0).lLbound = 0
.Bounds(0).cElements = bmp.bmHeight
.Bounds(1).lLbound = 0
.Bounds(1).cElements = bmp.bmWidthBytes
.pvData = bmp.bmBits
End With
CopyMemory ByVal VarPtrArray(pict), VarPtr(sa), 4
Каждый пиксел будет занимать три элемента массива pict (по байту на канал). Можно сделать и 8-битный режим. Me.Refresh обновляет картинку на форме.
Номер ответа: 3
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #3
Добавлено: 10.10.05 17:13
Я может когда-нибудь сделаю полноценный спрайтовый движок с возможностью вращения, растягивания спрайтов, Z-буфером, прозрачностью и т. д. Буду распространять как базу для создания всяких игрушек, а также довольно серьезных прог. Но сейчас я работаю над другим проектом.
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 11.10.05 05:40
DaSharm,
Главное не что рисуешь, а что показываешь. Можно создать кусок памяти размером с экран и все спрайты копировать в эту память. Когда всё скопировано можно уже и показывать. Наверное DirectX так и делает. Битмап грузишь в массив RGBQUAD и при необходимости копируешь в виртуальный экран. Это всё теория конечно, до практики руки не доходили пока. Во всяком случае спрайты уже есть
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 11.10.05 05:43
Вообще то я надеялся что кто нибудь тоже спрайтами поделится. Не стесняйтесь, выкладывайте. Родина вас не забудет
Номер ответа: 6
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #6
Добавлено: 11.10.05 16:23
Ну вот я так и делаю, безо всякого DirectX'а. А спрайтами поделиться увы не могу... Сам ничего не рисовал. Да это ж прошлый век - спрайты...
Номер ответа: 7
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #7
Добавлено: 11.10.05 21:16
If bmp.bmBitsPixel <> 24 Then
MsgBox " 24-bit bitmaps only", vbCritical
Exit Sub
End If
Немного жестоко. То есть, если там не 24 бита, то все - привет.
Я бы использовал CreateDIBSection.
Создать, сослать массив, заселектить, удалить старый. И никаких проблем с битами - сколько надо, столько и ставлю.
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 12.10.05 06:03
Дурацкая идея вообще то. Для DirectX кстати это нормально, но покадровое отображение скажем картинки 800 на 600 через BitBlt это нечто торомознутое.
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 12.10.05 06:57
Страшный Сон,
Ты что до сих пор на VB5 программируешь? И чем обусловлен твой выбор?
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 12.10.05 07:26
Это потому что твой код под них никак не подстроишь Проще сказать что спрайты не нужны.
Спрайты отображать немного сложнее, но всё же достаточно просто. Грузишь в память через LoadImage и отображаешь на устройство через BitBlt. Не знаю правда нужно ли создавать маску прозрачности вручную или в BitBlt это заложено. Нужно смотреть примеры.
Номер ответа: 11
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #11
Добавлено: 12.10.05 11:16
спасибо
Номер ответа: 12
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #12
Добавлено: 12.10.05 15:03
С чего ты это взял? На VB6 я пишу... Я хотел сказать, что я примерно так делаю...
Так и моя технология позволяет ставить любые биты. На самом деле код
MsgBox " 24-bit bitmaps only", vbCritical
Exit Sub
End If
Номер ответа: 13
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #13
Добавлено: 12.10.05 19:52
Я не совсем понял тему. зачем?
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 13.10.05 05:01
Страшный Сон,
А ты вглядывался в объявление VarPtrArray?
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 13.10.05 06:40
Опять поправляюсь
Дурацкая идея вообще то. Для DirectX кстати это нормально, но покадровое отображение скажем картинки 800 на 600 через BitBlt это нечто торомознутое.
Вообщем то мысль была правильная, только нужно показывать не весь экран, а изменившуюся его часть. Только там где спрайт накладывается на фон или пересекается с другим спрайтом.