У меня возникли проблемы с попыткой обнаружения столкновения двух изометрических плиток.
Я попытался нанести линии между каждой точкой на плитке, а затем проверить их на перехват, однако это не сработало (возможно, из-за неправильной формулы).
Поразмыслив сегодня, я верю, что думаю об этом, и должен быть более легкий путь.
Я не ищу код, просто некоторые советы о том, как лучше всего обнаружить перекрытие
xna
c#
collision-detection
Крис Крю
источник
источник
Ответы:
Я выйду прямо и скажу, что не знаю, как решить проблему, которую вы описали в вопросе (обнаружение столкновений между прямоугольниками в форме изо-плитки), но я могу рассказать вам, как другие решали ее в прошлом. :
То, как это делается в других играх, состоит в том, чтобы отделить игровой мир от мира экрана . Когда вы начинаете, обычно воображаете, что это одно и то же, но это приводит к проблемам, подобным той, которую вы описываете.
Общая идея заключается в том, что игровой мир полностью хранится в памяти, за кулисами, это просто цифры, ссылки и логика. То, что вы рисуете игровой мир в изометрии, не имеет значения. Ваш игровой мир не должен иметь концепцию изометрии или квадрата, или даже если экран рисуется как 3D. Все это делается, когда вы рисуете игровой мир на экране (он же мир экрана ). Мир игры должен храниться и поддерживаться в простейшем виде, который имеет смысл для игры, в изометрических играх вы обычно полностью игнорируете тот факт, что он iso, и вместо этого сохраняете позиции, как если бы вы использовали сетку, ориентированную по оси. В большинстве игр будут методы для преобразования координат между двумя мирами, я называю мой
ScreenToWorld(x, y)
иWorldToScreen(x, y)
, Преобразование часто выполняется с помощью математической математики, но может быть достигнуто другими способами. Вы будете использовать ScreenToWorld при использовании мыши и WorldToScreen при рисовании.Есть несколько преимуществ разделения игрового мира и экрана . Одним из преимуществ является то, что обнаружение столкновений и их перемещение происходят в игровом мире, и поэтому они обычно бывают достаточно простыми, поскольку вы не имеете дело с наклонной сеткой, перекосом координат, положением экрана и т. Д. В вашем случае , вы будете иметь дело с выровненными по оси прямоугольниками и квадратами. После обновления игрового мира вы выводите на экран представление игрового мира, ключевое слово: представление. Поначалу это может показаться нелогичным, но ваш экран - только представление о том, что происходит в игровом мире. Это делает возможными такие вещи, как выделенные серверы и терминальные клиенты.
FreeCiv на самом деле отличный пример всего этого. Вы можете видеть тот же самый мир, что и любой из: квадратная сетка север / юг, изометрический или даже шестнадцатеричный. Каждая игра, которую вы запускаете, имеет выделенный сервер, работающий в фоновом режиме, даже для однопользовательских игр, поэтому клиент также является просто портом дисплея, не более того.
Короче говоря: отделение игрового мира и логики от экранного мира упрощает игровую логику, уменьшает связь между дисплеями <-> и, в свою очередь, упрощает обнаружение столкновений между плитками "iso" и их визуализацию.
источник
Ответ Джона совершенно верен, но я попытаюсь объяснить это по-другому:
Там нет изометрического обнаружения столкновений.
Обнаружение столкновения не имеет значения, как выглядит ваша матрица проекции / трансформация Обнаружение столкновений не должно иметь значения, если вы вообще визуализируете вещи (в конце концов, объекты, находящиеся за пределами экрана, все еще могут сталкиваться, верно?)
Это более философский вопрос: действительно ли дерево, падающее в лесу, все еще сталкивается с землей, когда там никого нет?
Обычная мудрость сказала бы: да. Неважно, как вы на это смотрите. Вещи сталкиваются в мировом пространстве, а не в пространстве зрения.
источник
Вы можете попробовать выделить массив пикселей, составляющих растровое изображение каждого значения getRGB () каждого отдельного пикселя. Затем сравните значения с оператором if, поскольку границы плитки представляют собой отдельное значение цвета, отличное от того, которое представляет плитка (вода, песок, трава). Это для базовой изометрической сетки. Или вы можете иметь два слоя самой карты. Один слой содержит своего рода зеленый экран, рисующий контур каждого представителя сталкивающегося объекта, а другой слой будет самой картой.
Вы не составляете массив растровых изображений для каждого пикселя слоя карты, вместо этого вы хотите вычислить набор цветов, представляющих эффекты, которые он оказывает, когда объект сталкивается / пересекает границу значения поддерживаемого цвета. Либо вы хотите, чтобы значения уменьшались в значении, либо увеличивалась скорость, с которой движется объект. Каждый движущийся объект - это просто копия памяти, хранящаяся в другом месте.
Я хотел бы взглянуть на идеальное столкновение пикселей и понимание растровых массивов. Каждый прямоугольник представляет собой границы, содержащие реплицирующие данные, вроде запечатленной памяти, каждое событие инициируется в зависимости от того, где объект отображается в местоположении или векторе. Каждая точка на экране находится только на 2D-плоскости, глубина тени которой создает иллюзию того, что объект представляет собой 3D. Преобразование форм в перекосе дает смысл объекту под углом. Существует центральная точка, где камера представляет ее, если смотреть на все вокруг этой центральной точки, удаляясь от нее, уменьшаясь в размере или приближаясь к ней, увеличиваясь в размере.
источник