Войти
ПрограммированиеФорум2D графика и изометрия

Паттерны представления карты в клеточной игре.

#0
0:17, 5 янв. 2010

Делаю изо-движок, вывод спрайтами. Колюзион осуществляется проверкой - занята/не занята клетка. Проблема со стенами которые представлены диагональю клеток.
1. При беге персонажем вдоль стены есть эффект стопорения, когда он налетает на углы клеток. (направление бега показано стрелочкой на рис. ниже)
2. Проблема проскакивания в точках (1) на рисунке ниже.
3. Разная ширина проема(например для дверей) в стенах, в вертикальном  и диагональном случае.
Для решения этих проблем приходится вводить всевозможные костыли. Может существуют обкатанные методы костылей или другие паттерны представления карты?
Фрагмент | Паттерны представления карты в клеточной игре.


#1
0:21, 5 янв. 2010

v_over
насколько я помню, проблема решается достаточно в лоб - юзать двери только либо на прямых, либо на диагональных стенках. а стенки рисовать не квадратами, а тайлами, причём диагональные участки делать в два ряда. посмотри, как сделано, например, в x-com : ufo defense.

#2
0:39, 5 янв. 2010

Suslik
Не, на экране у меня отрисовывается всё чинно и красиво. Проблема с обработкой колюзии. На счёт двойных стенок это я как то не подумал, спасибо. Но остаётся проблема с эффектом стопорения, у меня персонаж двигается не к указанной клетке( x-com : ufo defense, если мне не изменяет память), а по вектору направления. Каждый раз проверяя доступна следующая клетка или нет. Может как по другому сделать?

#3
3:45, 5 янв. 2010

Проверять ряд точек вокруг персонажа, например по углам и в центрах сторон описывающего прямоугольника, или например каждые 45 градусов описывающего круга. Если хоть одна точка попала в непроходимый блок - двигаться нельзя. Или просто находится пересечение вектора движения с ближайшей клеткой, и проверяется куда мы идём. Если упираемся в стенку - вектор сокращается до необходимой длины (до точки пересечения).

Если надо чтобы персонаж соскользнул вдоль стенки, вектор движения укладывается в плоскость стены, нормализуется и умножается на скорость. Или не умножается.

#4
8:23, 5 янв. 2010

v_over
Можешь заморочиться и сделать обработку коллизий не только с квадратными тайлами, но и треугольными. Это не сложно, можно, например, с помощью separating axis theorem (см, например, этот туториал).

Тогда с диагоналями можно будет разбираться как-то так:
Треугольные стены на тайловой карте | Паттерны представления карты в клеточной игре.

#5
8:33, 5 янв. 2010

Можно добавить к клеткам функцию коллизии. Т.е. клетка будет иметь коллизию не как квадрат, а как треугольник (стена идёт вдоль гипотинузы).
А вообще раз выбран такой бородатый метод, то и расчитывать на многое не стоит и лучше всё сводить к вертикалям и горизонталям.

#6
10:47, 5 янв. 2010

Wanderwaltz
> Можешь заморочиться и сделать обработку коллизий не только с квадратными
> тайлами, но и треугольными
вот я думаю нечто такое, только для простоты всеже тупо увеличить колличество квадратов в два раза, и заполнять выемки. получить типа логические треугольники, но физически  будут только квадраты.

#7
11:04, 5 янв. 2010

кстати, есть такая игра OTTD опен вариант проприетарной игры. транспорт тайкун который. в нем по горизонтали и вертикали поезда двигаются по одному,
а по диаганали поезда двигаются по два, т.е. не пересекая точки углов квадратов. так вот смотрел там код, логика там такая.
квадрат разбит на точки, их там вроде 12 (у тебя будет меньше ибо по одному двигаешь по диаганали), точки лежат на гранях квадрата. так вот, поезд, когда приходит его время
и он какбы уезжает с точки, проверяет возможность попадания в следующую точку проверяя несколько точек вокруг, и если ему никто не мешает, то он резервирует нужные точки.
получается следующий поезд, так же проверяет точки которые перед ним, и которые вокруг, зарезервированы они или нет. т.е. там тупо методы, где перебираются нужные точки для проверки для каждого направления.

#8
12:38, 5 янв. 2010

my.name
> тупо увеличить колличество квадратов в два раза, и заполнять выемки
Не совсем понял, что имеется в виду.

Вот еще пара ссылок, может, пригодится:
Базовые алгоритмы определения столкновений и реакции на них
Определение столкновений в сетке с тайлами и трассировка лучей

Это переводы на русский тех уроков, на которые я давал ссылку выше.

#9
12:52, 5 янв. 2010

v_over
> 1. При беге персонажем вдоль стены есть эффект стопорения, когда он налетает на
> углы клеток. (направление бега показано стрелочкой на рис. ниже)

При контакте с клеткой должна обнуляться не скорость целиком, а только та составляющая скорости, которая направлена перпендикулярно поверхности клетки. При этом будет реализовываться соскальзывание с угла.

> 2. Проблема проскакивания в точках (1) на рисунке ниже.

Если объект - не материальная точка, а имеет конечные размеры, проскакивания не будет.

> 3. Разная ширина проема(например для дверей) в стенах, в вертикальном и
> диагональном случае.

Это вообще не проблема, а особенность клатчатой структуры поля. Т.е. с этим не нужно бороться, это нужно учитывать.

#10
14:31, 5 янв. 2010

Wanderwaltz
> Не совсем понял, что имеется в виду.
имеется ввиду разбить квадраты на 4 квадрата, и искать пересечение не с целым квадратом а с его внутреними квадратами. мона даже дойти до реализации квад дерева.

#11
16:54, 5 янв. 2010

Wanderwaltz, огромное спасибо за ссылку с переводом, очень помогло.
В общем из всего выше сказанного я пришел к идеи указать для клеток типы колизий. И считать столкновения уже внутри клетки в зависимости от фигуры колизии.

ПрограммированиеФорум2D графика и изометрия

Тема в архиве.