Что вы используете для разработки игры?Движок или графическая библиотека?В основном есть три уровня (как мне нравится думать о них): графические библиотеки, графические движки и игровые движки.
Графические библиотеки довольно низки, как вы можете получить:OpenGL или DirectX.Когда вы захотите нарисовать свою местность, вы будете рисовать в виде сетки треугольников и определять вершины этих треугольников и т. Д.
Графические движки - это один слой поверх этого,Примерами таких (по крайней мере для C ++) являются Ogre3D, Horde3D и Irrlicht.Они позаботятся о множестве команд более низкого уровня и позволят вам сосредоточиться на графике с точки зрения более высокого уровня.
Движки игры в значительной степени позаботятся обо всем, что связано с графикой,Примерами таких (опять же C ++) являются Unity и UDK.Как правило, они могут сделать большую часть игрового программирования для вас.Вы, вероятно, нарисовали бы свою местность в программе моделирования (3dsmax и т. Д.), Экспортировали бы ее в какой-то формат, а затем движок выкачал ее и точно знал, как с ней справиться.
Iпоиграл со всеми тремя, и нашел графические библиотеки наиболее интересными.Тем не менее, они, вероятно, потребуют больше времени, чтобы сделать игру.Они также включают в себя гораздо больше математики (линейная алгебра).
Что касается обнаружения столкновений с местностью.Вы должны знать о треугольниках, составляющих эту местность.Если вы используете игровой движок, вы должны иметь возможность хранить сетку для вашей местности и сетку для вашего персонажа в каком-то «Узле сцены», и он будет автоматически обрабатывать обнаружение столкновений.Однако, если вы имеете дело со всем самим, есть много популярных алгоритмов для этого:
- Bounding Box: даже если ваш персонаж имеет форму человека (или животное и т. Д.), Вы относитесь к немуотметьте их как коробку и отметьте, когда эта клетка пересекается с треугольниками меша, из которого состоит ваш ландшафт.
- Ограничивающая сфера: рассматривайте своего персонажа как сферу, потому что сферы намного легче увидеть, если они столкнулись.Вы просто проверяете «радиус сферы» с «расстоянием от центра сферы до другой сетки».Затем, если эта сфера сталкивается, вы разбиваете ее на более мелкие сферы, которые более точно представляют вашего персонажа.Оттуда вы выполняете 3 или 4 итерации, или так точно, как вы хотели бы представлять своего персонажа.Помните, что все в играх должно быть быстрым, быстрым, быстрым, поэтому вы ограничиваете рекурсии.
Отличная статья об обнаружении столкновений ограничивающей сферы
IВы написали пример программы OpenGL, которая в основном позволяет персонажу, который представлен ограничительной рамкой, обойти местность, которая требует обнаружения столкновений.Дайте мне знать, если вас больше интересует, как это работает.
Вы можете справиться с уроном от падения несколькими способами:
- Если персонаж не летит, вы можете использоватьпростой конечный автомат.Как только они выйдут в эфир, измените состояние на «В ВОЗДУХЕ», и пока игра выглядит, установите таймер и отслеживайте, как долго они находятся в воздухе.Если они слишком долго находятся в воздухе, то рассчитайте различное количество урона в зависимости от того, как долго они там находятся.
- Более точный способ - отслеживать скорость y персонажа.Это точно в реальной жизни.Если вы падаете медленно, не имеет смысла иметь урон от падения.Если вы падаете быстро, вам будет больно больше, чем быстрее вы идете.Так что придумайте какое-то уравнение, которое связывает падение_скорости с уроном.Затем, как только они упадут на землю, измените конечный автомат на «ON_GROUND» и проверьте скорость_падения (вероятно, y_velocity).