Страница: 1 | 
		
		 
			   
			 
			 
			 
			 Страница: 1 | 
 
			
 
  
		
     
  
    
Вопрос: Столкновение с объектами (VB 6.0)
     
    
Добавлено: 18.01.13 14:17
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     Max
 Max
      
       
  
Доброго дня, форумчане! 
 
    
 Сейчас занимаюсь разработкой движка для игры (2d-шутер с видом сверху). И, естественно, необходимо реализовать столкновения игрока с объектами (непроходимые стены, к примеру). То, до чего додумался: 
 На форме - лейбл Player, лейбл Object(0), лейбл Player размещён под Object(0)
Private Sub Form_Load() 
 Me.ScaleMode = 3 
 End Sub 
 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
 If KeyCode = vbKeyW And CollisionUp <> True Then 
     player.Top = player.Top - 1 
 End If 
 End Sub 
 Private Function CollisionUp() As Boolean 
 Dim i As Integer 
 For i = 0 To object.UBound 
     If player.Left + player.Width > object(i).Left And player.Left < object(i).Left + object(i).Width And player.Top = object(i).Top + object(i).Height Then 
         CollisionUp = True 
     End If 
 Next i 
 End Function
Как видно, это только для движения вверх. Всё работает, конечно, но если делать проверку для всех четырёх направлений, да и ещё если элементов Object больше 30, то всё это неминуемо тормозит (ведь при каждом нажатии кнопки, идёт проверка столкновения игрока со ВСЕМИ объектами на карте). 
 Какие варианты реализации коллизий можно ещё придумать? Поделитесь идеями, пожалуйста
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 3
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа: Winand
 Winand



Вопросов: 87
Ответов: 2795
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  18.01.13 18:09
       
    
       
  
Не стоит писать игры с графикой на лейблах)) Проверка позиций вряд ли отнимает много ресурсов. Хотя опять же наверняка было бы всё быстрее, если бы объекты описывались в cls классе. Тогда не надо было бы обращаться к свойствам лейблов столько раз. Ну и рисовать самостоятельно всё, желательно только изменяющуюся часть изображения.
 
    
Это так.. мысли. Никогда игр не писал. Ну если только чуть-чуть, и то стыдно)
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа: Max
 Max

Вопросов: 1
Ответов: 1
      
 Профиль |  | #2
       
Добавлено:  18.01.13 19:00
       
    
       
  
Код этот для примера, в двигле же лейблы я не использую 
     
Как показала практика - ресурсы кушает предостаточно. Если учесть, что минимальный размер карты - 10000х10000 пикселей, то объектов на ней будет ну очень много. 
Про классы не понял. Что значит "объекты описывались в cls классе"?
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: AWP
 AWP

ICQ: 345685652 
Вопросов: 96
Ответов: 1212
      
 Web-сайт:  
 Профиль |  | #3
      
Добавлено:  18.01.13 22:52
       
    
       
  
ООП.
 
    
Создаешь класс, в нем прописываешь все свойста.
А в игре создаешь массив из этих объектов:
dim gameobjects() as new ClassName 
а обращаешься к ним как:
gameobjects(0).X=0
gameobjects(0).Y=20
и т.д.
А графику можно рисовать, к примеру, вот этой штукой, которую написал Mikle
http://bit.pirit.info/forum/viewtopic.php?t=12553
p.s.
Тупая проверка 100 объектов со 100 объектов это всего лишь 10000 операций на ось. Это просто копейки для процов. даже 10и летней давности. А ведь еще можно оптимизации разные сделать.