Страница: 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
       
    
       
  
 
    
 
Вглядывался. Но уже после того, как написал свой пост... 
 Исправляюсь: 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
       
    
       
  
для общего развития!