Страница: 1 | 2 | 3 |
Вопрос: Спрайты для игроделов
Добавлено: 10.10.05 07:44
Автор вопроса: CyRax | Web-сайт:
Ответы
Всего ответов: 34
Номер ответа: 16
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #16
Добавлено: 13.10.05 17:15
Вглядывался. Но уже после того, как написал свой пост... Исправляюсь: msvbvm60.dll. Хотя разницы в работе никакой нет.
Номер ответа: 17
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #17
Добавлено: 13.10.05 22:26
Подождите, я не допер как в данном случае поставить глубину 8 бит.
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-сайт:
Профиль | | #19
Добавлено: 15.10.05 08:35
Глянул я тут несколько примеров прозрачности через BitBlt. Вобщем без маски прозрачность не возможна. Во всех примерах каждому рисунку сопутствует чёрно-белый рисунок-маска. Те спрайты, на которые я кинул ссылку, идут без маски (DirectX наверное её сам создаёт). Тут два варианта: посоздавать для каждой картинки маску (ч/б рисунки практически ничего не весят) или создавать обесвеченную копию при загрузке спрайта. Маска такая: белый фон и внутри чёрная клякса (по контуру рисунка).
Рисование осуществляется примерно так:
If DestinationWidth = SpriteWidth And DestinationHeight = SpriteHeight Then
 oBitBlt = BitBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Mask.hdc, MaskX, MaskY, dwRop.SRCAND)
 oBitBlt = BitBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Sprite.hdc, SpriteX, SpriteY, dwRop.SRCPAINT)
ElseIf DestinationWidth <> SpriteWidth Or DestinationHeight <> SpriteHeight Then
 oBitBlt = StretchBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Mask.hdc, MaskX, MaskY, MaskWidth, MaskHeight, dwRop.SRCAND)
 oBitBlt = StretchBlt(Destination.hdc, DestinationX, DestinationY, DestinationWidth, DestinationHeight, Sprite.hdc, SpriteX, SpriteY, SpriteWidth, SpriteHeight, dwRop.SRCPAINT)
Else
 oBitBlt = 0
End If
Номер ответа: 20
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #20
Добавлено: 15.10.05 08:39
Раньше я так и делал. Еще до освоения метода отображения через массив. А еще раньше двигал по форме элементы управления Image, и они у меня мерцали.
Номер ответа: 21
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #23
Добавлено: 15.10.05 08:51
Ну а для спрайтов через массив пример есть? If'ами в цикле или как?
Я думаю все такое когда то делали
Номер ответа: 24
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #26
Добавлено: 18.10.05 06:17
Страница с сылками на сайты со спрайтами
http://www.gamedev.net/community/forums/topic.asp?topic_id=272386
Номер ответа: 27
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #27
Добавлено: 18.10.05 15:39
А чё
работает быстрее чем a=b?
Я на массивах длинной в 40 000 000 * 4 байта проверял - даёт выигрыш в 1.5 раз по сравнению с циклом, но в цикле же ещё типа надо на всякие счётчики, на провеку условий время тратить было, так что это неточно получилось
Номер ответа: 28
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #28
Добавлено: 18.10.05 17:22
http://www.vbexplorer.com/VBExplorer/gdi.asp
интересно
Номер ответа: 29
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #29
Добавлено: 18.10.05 20:31
CopyMemory b, a, 4 переносит только размерность динамического массива, а не элементы.
Ну и зачем все это нужно? Через массив-то отображать лучше, пусть не так удобно в плане программирования...
Номер ответа: 30
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #30
Добавлено: 18.10.05 20:48
для общего развития!