Я выйду прямо и скажу, что не знаю, как решить проблему, которую вы описали в вопросе (обнаружение столкновений между прямоугольниками в форме изо-плитки), но я могу рассказать вам, как другие решали ее в прошлом. :
То, как это делается в других играх, состоит в том, чтобы отделить игровой мир от мира экрана . Когда вы начинаете, обычно воображаете, что это одно и то же, но это приводит к проблемам, подобным той, которую вы описываете.
Общая идея заключается в том, что игровой мир полностью хранится в памяти, за кулисами, это просто цифры, ссылки и логика. То, что вы рисуете игровой мир в изометрии, не имеет значения. Ваш игровой мир не должен иметь концепцию изометрии или квадрата, или даже если экран рисуется как 3D. Все это делается, когда вы рисуете игровой мир на экране (он же мир экрана ). Мир игры должен храниться и поддерживаться в простейшем виде, который имеет смысл для игры, в изометрических играх вы обычно полностью игнорируете тот факт, что он iso, и вместо этого сохраняете позиции, как если бы вы использовали сетку, ориентированную по оси. В большинстве игр будут методы для преобразования координат между двумя мирами, я называю мой ScreenToWorld(x, y)
иWorldToScreen(x, y)
, Преобразование часто выполняется с помощью математической математики, но может быть достигнуто другими способами. Вы будете использовать ScreenToWorld при использовании мыши и WorldToScreen при рисовании.
Есть несколько преимуществ разделения игрового мира и экрана . Одним из преимуществ является то, что обнаружение столкновений и их перемещение происходят в игровом мире, и поэтому они обычно бывают достаточно простыми, поскольку вы не имеете дело с наклонной сеткой, перекосом координат, положением экрана и т. Д. В вашем случае , вы будете иметь дело с выровненными по оси прямоугольниками и квадратами. После обновления игрового мира вы выводите на экран представление игрового мира, ключевое слово: представление. Поначалу это может показаться нелогичным, но ваш экран - только представление о том, что происходит в игровом мире. Это делает возможными такие вещи, как выделенные серверы и терминальные клиенты.
FreeCiv на самом деле отличный пример всего этого. Вы можете видеть тот же самый мир, что и любой из: квадратная сетка север / юг, изометрический или даже шестнадцатеричный. Каждая игра, которую вы запускаете, имеет выделенный сервер, работающий в фоновом режиме, даже для однопользовательских игр, поэтому клиент также является просто портом дисплея, не более того.
Короче говоря: отделение игрового мира и логики от экранного мира упрощает игровую логику, уменьшает связь между дисплеями <-> и, в свою очередь, упрощает обнаружение столкновений между плитками "iso" и их визуализацию.