Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Спрайты для игроделов Добавлено: 10.10.05 07:44  

Автор вопроса:  CyRax  | Web-сайт: basicproduction.nm.ru | ICQ: 204447456 
http://www.reinerstileset.4players.de:1059/englisch.htm

Ответить

  Ответы Всего ответов: 34  

Номер ответа: 1
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 11.10.05 05:40
DaSharm,
 Главное не что рисуешь, а что показываешь. Можно создать кусок памяти размером с экран и все спрайты копировать в эту память. Когда всё скопировано можно уже и показывать. Наверное DirectX так и делает. Битмап грузишь в массив RGBQUAD и при необходимости копируешь в виртуальный экран. Это всё теория конечно, до практики руки не доходили пока. Во всяком случае спрайты уже есть :)

Ответить

Номер ответа: 5
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #5
Добавлено: 11.10.05 05:43
Вообще то я надеялся что кто нибудь тоже спрайтами поделится. Не стесняйтесь, выкладывайте. Родина вас не забудет ;)

Ответить

Номер ответа: 6
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #6 Добавлено: 11.10.05 16:23
Битмап грузишь в массив RGBQUAD и при необходимости копируешь в виртуальный экран.

Ну вот я так и делаю, безо всякого DirectX'а. А спрайтами поделиться увы не могу... Сам ничего не рисовал. Да это ж прошлый век - спрайты...

Ответить

Номер ответа: 7
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 12.10.05 06:03
Можно создать кусок памяти размером с экран и все спрайты копировать в эту память. Когда всё скопировано можно уже и показывать.

 Дурацкая идея вообще то. Для DirectX кстати это нормально, но покадровое отображение скажем картинки 800 на 600 через BitBlt это нечто торомознутое.

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 12.10.05 06:57
Страшный Сон,
 Ты что до сих пор на VB5 программируешь? И чем обусловлен твой выбор?

Ответить

Номер ответа: 10
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #10
Добавлено: 12.10.05 07:26
Да это ж прошлый век - спрайты...

 Это потому что твой код под них никак не подстроишь ;) Проще сказать что спрайты не нужны.
Спрайты отображать немного сложнее, но всё же достаточно просто. Грузишь в память через LoadImage и отображаешь на устройство через BitBlt. Не знаю правда нужно ли создавать маску прозрачности вручную или в BitBlt это заложено. Нужно смотреть примеры.

Ответить

Номер ответа: 11
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #11
Добавлено: 12.10.05 11:16

спасибо

Ответить

Номер ответа: 12
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #12 Добавлено: 12.10.05 15:03
Ты что до сих пор на VB5 программируешь?

С чего ты это взял? :-/ На VB6 я пишу... Я хотел сказать, что я примерно так делаю...
И никаких проблем с битами - сколько надо, столько и ставлю.

Так и моя технология позволяет ставить любые биты. На самом деле код
If bmp.bmBitsPixel <> 24 Then
    MsgBox " 24-bit bitmaps only", vbCritical
    Exit Sub
End If
- чистая формальность, его можно убрать нафиг. :) Хочу - 256 цветов использую, хочу - 16 миллионов... при этом размерность массива по горизонтали утраивается. Главное преимущество - делаю с картинкой все, что захочу, недостаток - все алгоритмы для этого пишешь сам. И отображение линии, и окружности, и полигона, и деформации всякие. А на это много времени уходит. Зато скорость при хорошей оптимизации будет гораздо выше, чем с BitBlt.

Ответить

Номер ответа: 13
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #13
Добавлено: 12.10.05 19:52

нужно привязать картинку на форме к байтовому массиву


Я не совсем понял тему. зачем?

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 13.10.05 05:01
Страшный Сон,
 А ты вглядывался в объявление VarPtrArray? ;)

Ответить

Номер ответа: 15
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 13.10.05 06:40
Опять поправляюсь
Можно создать кусок памяти размером с экран и все спрайты копировать в эту память. Когда всё скопировано можно уже и показывать.

 Дурацкая идея вообще то. Для DirectX кстати это нормально, но покадровое отображение скажем картинки 800 на 600 через BitBlt это нечто торомознутое.

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

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам