Страница: 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-сайт:  
 Профиль |  | #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
 Хочу - 256 цветов использую, хочу - 16 миллионов... при этом размерность массива по горизонтали утраивается. Главное преимущество - делаю с картинкой все, что захочу, недостаток - все алгоритмы для этого пишешь сам. И отображение линии, и окружности, и полигона, и деформации всякие. А на это много времени уходит. Зато скорость при хорошей оптимизации будет гораздо выше, чем с BitBlt.
		
	  
			 
	
		 
    
       
    
Номер ответа: 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 это нечто торомознутое.
 Вообщем то мысль была правильная, только нужно показывать не весь экран, а изменившуюся его часть. Только там где спрайт накладывается на фон или пересекается с другим спрайтом.