Так что я некоторое время возился с простой разработкой игр и только что нашел интересную идею игры на squidi.net/three/entry.php?id=85. Я использую SFML 2.1 с C ++, и у меня есть мозаичная карта в VertexArray, которая отображает уровень. Вот что у меня есть, и вы можете увидеть мой простой набор плиток: ССЫЛКА НА САЙТ. Я довольно потерян с точки зрения того, как справляться со столкновениями между подводной лодкой (которой нет в системе движения на основе сетки) и стенами. Проблема заключается в том, что, скажем, подпункт приближается к тайлу 2 (проверьте изображение набора тайлов) снизу, если я проверю столкновение между подпунктом и целым тайлом, то субабонент остановится еще до того, как достигнет фактической стены в изображении. Вот изображение, чтобы помочь объяснить это: ССЫЛКА НА САЙТ.
Извините за предыдущую путаницу, и я надеюсь, что это не так плохо, как раньше.
Любая помощь с благодарностью.
Спасибо,
Карел
Изменить: переписал вопрос, чтобы попытаться сделать его более понятным.
Я предупрежу вас, что простое столкновение на основе сетки ужасно разрушается, если рассматриваемый объект движется быстрее, чем разрешение ваших плиток столкновения. Представьте, что ваши поля столкновений имеют размер 8×8 пикселей. Теперь, что происходит, когда подводная лодка движется, скажем, 16 пикселей на тик? Вы можете видеть, что он может перепрыгивать через стены столкновений одинарной толщины, если вы не очень осторожны в том, как вы проверяете столкновение — проверяя каждую плитку, на которую попадает подводная лодка во время движения, вместо непосредственного обновления положения по скорости. Это даже хуже, чем это — изображение, которое вы перемещаете только на 2 пикселя в секунду и просто обрезаете край плитки, но заканчиваете на другой стороне — снова столкновение на основе плитки, без кода, который отслеживает каждый блок, к которому вы прикасаетесь при движении , не удастся.
Более общий способ — использовать линейное или векторное столкновение. По сути, вместо карты мозаики используйте список векторов, которые представляют края стены. Чтобы проверить столкновение в 2D, вы можете проверить знак perpdot (произведение перпендикулярной точки) вашей начальной точки по отношению к вектору столкновения и знак по отношению к конечной точке вашего движения по отношению к вектору столкновения. Если они разные, вы пересекли черту и произошло столкновение. Если любой из них равен 0, вы находитесь на линии столкновения. Обязательно проверьте конечную точку линии, которая включает еще несколько точечных продуктов.
Дополнительным преимуществом этого метода является то, что он действительно легко «скользит» вашего персонажа по стенам при столкновении, вместо того, чтобы просто отодвигать его назад в предыдущую позицию, что вызывает залипание стен и вибрацию. Кроме того, это действительно очень быстро, просто несколько умножений и вычитаний. Он также легко масштабируется до кода стиля SIMD.
Увидеть этот вопрос для немного больше информации.
Ваша подводная лодка меньше, чем плитка, поэтому подводная лодка будет покрывать не более 4 плиток в любой момент времени.
Вы можете передать каждой функции, как далеко саб находится от центра этой плитки.
Вот самое простое:
bool collided_with_tile_0( int x_offset, int y_offset )
{
return false; // Nothing to collide with
}
Это тоже довольно просто:
bool collided_with_tile_1( int x_offset, int y_offset )
{
return std::abs( y_offset ) < SUB_SIZE; // Collision if y_offset is close to 0
}
Удачи!