Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

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

Автор вопроса:  CyRax  | Web-сайт: basicproduction.nm.ru | ICQ: 204447456 

Ответить

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

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



Вопросов: 46
Ответов: 848
 Профиль | | #16 Добавлено: 13.10.05 17:15
А ты вглядывался в объявление VarPtrArray? ;)

Вглядывался. Но уже после того, как написал свой пост... :) Исправляюсь: msvbvm60.dll. Хотя разницы в работе никакой нет.

Ответить

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



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #17
Добавлено: 13.10.05 22:26

Подождите, я не допер как в данном случае поставить глубину 8 бит.
GetObjectAPI Me.Picture, Len(bmp), bmp

If bmp.bmBitsPixel <> 24 Then
    MsgBox " 24-bit bitmaps only", vbCritical
    Exit Sub
End If


Тут же берется текущий битмап (хз какая там у него глубина) и просто проверяется, равна ли глубина 24-м битам. Если нет, то прога откажется работать.
Или я что-то не так понял...

Ответить

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



Вопросов: 46
Ответов: 848
 Профиль | | #18 Добавлено: 14.10.05 02:14
Ну да. Если сделать так:

If bmp.bmBitsPixel <> 8 Then
    MsgBox " 8-bit bitmaps only", vbCritical
    Exit Sub
End If

То будет работать только 8-битный битмап.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #19
Добавлено: 15.10.05 08:35
Глянул я тут несколько примеров прозрачности через BitBlt. Вобщем без маски прозрачность не возможна. Во всех примерах каждому рисунку сопутствует чёрно-белый рисунок-маска. Те спрайты, на которые я кинул ссылку, идут без маски (DirectX наверное её сам создаёт). Тут два варианта: посоздавать для каждой картинки маску (ч/б рисунки практически ничего не весят) или создавать обесвеченную копию при загрузке спрайта. Маска такая: белый фон и внутри чёрная клякса (по контуру рисунка).
Рисование осуществляется примерно так:
Public Function DoBitBlt(ByRef Destination As PictureBox, ByVal DestinationX As Long, ByVal DestinationY As Long, ByVal DestinationWidth As Long, ByVal DestinationHeight As Long, ByRef Sprite As PictureBox, ByVal SpriteX As Long, ByVal SpriteY As Long, ByVal SpriteWidth As Long, ByVal SpriteHeight As Long, ByRef Mask As PictureBox, ByVal MaskX As Long, ByVal MaskY As Long, ByVal MaskWidth As Long, ByVal MaskHeight As Long) As Long

If DestinationWidth = SpriteWidth And DestinationHeight = SpriteHeight Then
    
    ;DoBitBlt = BitBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Mask.hdc, MaskX, MaskY, dwRop.SRCAND)
    ;DoBitBlt = BitBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Sprite.hdc, SpriteX, SpriteY, dwRop.SRCPAINT)

ElseIf DestinationWidth <> SpriteWidth Or DestinationHeight <> SpriteHeight Then
    
    ;DoBitBlt = StretchBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Mask.hdc, MaskX, MaskY, MaskWidth, MaskHeight, dwRop.SRCAND)
    ;DoBitBlt = StretchBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Sprite.hdc, SpriteX, SpriteY, SpriteWidth, SpriteHeight, dwRop.SRCPAINT)

Else
    ;DoBitBlt = 0
End If

Ответить

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



Вопросов: 46
Ответов: 848
 Профиль | | #20 Добавлено: 15.10.05 08:39
белый фон и внутри чёрная клякса

Раньше я так и делал. Еще до освоения метода отображения через массив. А еще раньше двигал по форме элементы управления Image, и они у меня мерцали. :)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #21
Добавлено: 15.10.05 08:40
Сначала происходит добавление ч/б маски флагом SRCAND к основной картинке экрана, а затем на неё накладывается спрайт флагом SRCPAINT.

Ответить

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



Вопросов: 46
Ответов: 848
 Профиль | | #22 Добавлено: 15.10.05 08:41
:) Ну я про то и говорю.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #23
Добавлено: 15.10.05 08:51
Раньше я так и делал. Еще до освоения метода отображения через массив.

 Ну а для спрайтов через массив пример есть? If'ами в цикле или как?

А еще раньше двигал по форме элементы управления Image, и они у меня мерцали. :)

 Я думаю все такое когда то делали :)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #24
Добавлено: 15.10.05 08:55
Ну я про то и говорю.

 Ну вообще то это для всех уточнение что конкретно нужно делать. Если ты понял - молодец. :)

Ответить

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



Вопросов: 46
Ответов: 848
 Профиль | | #25 Добавлено: 15.10.05 08:59
Ну а для спрайтов через массив пример есть?

Если масштабировать не надо, а альфа-канал задан одним битом, это элементарно делается:


For Y = 0 To 127
  For X = 0 To 127
    If sAlpha(X, Y) Then pict(DX + X, DY + Y) = sSprite(X, Y)
  Next X
Next Y

Должно работать очень быстро. А если вообще без альфа-канала, то так:

For Y = 0 To 127
  CopyMemory pict(DX, DY + Y), sSprite(0, Y), 128
Next Y

Если делать с 8-битным альфа-каналом и растягиванием с билинейной фильтрацией, будет уже немного сложнее.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #26
Добавлено: 18.10.05 06:17
Страница с сылками на сайты со спрайтами
http://www.gamedev.net/community/forums/topic.asp?topic_id=272386

Ответить

Номер ответа: 27
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #27
Добавлено: 18.10.05 15:39
А чё
CopyMemory b, a, 4 (long)

работает быстрее чем a=b?

Я на массивах длинной в 40 000 000 * 4 байта проверял - даёт выигрыш в 1.5 раз по сравнению с циклом, но в цикле же ещё типа надо на всякие счётчики, на провеку условий время тратить было, так что это неточно получилось

Ответить

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



ICQ: 780477 

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

http://www.vbexplorer.com/VBExplorer/gdi.asp

интересно

Ответить

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



Вопросов: 46
Ответов: 848
 Профиль | | #29 Добавлено: 18.10.05 20:31
работает быстрее чем a=b?

CopyMemory b, a, 4 переносит только размерность динамического массива, а не элементы.

http://www.vbexplorer.com/VBExplorer/gdi.asp

Ну и зачем все это нужно? Через массив-то отображать лучше, пусть не так удобно в плане программирования...

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #30
Добавлено: 18.10.05 20:48
для общего развития!

Ответить

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

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



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