Страница: 1 |
Страница: 1 |
Вопрос: Столкновение с объектами (VB 6.0)
Добавлено: 18.01.13 14:17
Автор вопроса: 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
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #1
Добавлено: 18.01.13 18:09
Не стоит писать игры с графикой на лейблах)) Проверка позиций вряд ли отнимает много ресурсов. Хотя опять же наверняка было бы всё быстрее, если бы объекты описывались в cls классе. Тогда не надо было бы обращаться к свойствам лейблов столько раз. Ну и рисовать самостоятельно всё, желательно только изменяющуюся часть изображения.
Это так.. мысли. Никогда игр не писал. Ну если только чуть-чуть, и то стыдно)
Номер ответа: 2
Автор ответа:
Max
Вопросов: 1
Ответов: 1
Профиль | | #2
Добавлено: 18.01.13 19:00
Код этот для примера, в двигле же лейблы я не использую
Как показала практика - ресурсы кушает предостаточно. Если учесть, что минимальный размер карты - 10000х10000 пикселей, то объектов на ней будет ну очень много.
Про классы не понял. Что значит "объекты описывались в cls классе"?
Номер ответа: 3
Автор ответа:
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и летней давности. А ведь еще можно оптимизации разные сделать.