Перейти к содержанию

Гексы/клетки.


Рекомендуемые сообщения

Опубликовано
Рассмотрим человека. Пусть это будет точка, тогда он имеет следующие координаты: 1) номер тайла 2) непрперывные координаты точки на тайле. Теперь рассмотрим длинного монстра. Пусть это будет несколько точек, тогда он будет иметь следующие координаты: 1) номер тайла (номера тайлов) 2) непрерывные координаты точек на тайле (на тайлах).Подсчет расстояния между объектами происходит нахождением расстояния между точками. Для этого достаточно только циклически перебрать соседние тайлы. Повороты монстра вокруг оси тоже можно алгоритмически описать. Я думаю, это хороший универсальный метод
Так и не уловил :( Можно как-то схемой/картинкой?

Представь сетку из квадратов как в аркануме. Теперь мысленно эту сетку убери, чтобы ее не осталось. Теперь введи непрерывные координаты для точки, на плоскости это будут икс и игрек. Пусть объект имеет эти координаты. Но тогда появляется вопрос, как объект будет ориентироваться относительно других объектов. Другими словами, как определить достаточно расстояния, чтобы один человечек ударил другого, или как сделать, чтобы один не наступил на то место, где стоит другой. Очевидно нужно вычислить расстояние между этими двумя человечками, т.е. между двумя разными точками. Но тогда тебе надо перебрать всех человечков на карте и посчитать все расстояния между ними, это хлопотно, занимает время и совсем не нужно. Теперь верни квадратную сетку, но пусть она будет чуть побольше чем в аркануме. Теперь тебе достаточно указать два типа координат 1) номер тайла (квадрата), на котором стоит человечек 2) его координату как точку на тайле - чтобы не перебирать всех человечков на карте. Ты знаешь, на каком тайле стоит человечек и знаешь соседние тайлы. Теперь достаточно только перебрать все соседние тайлы, чтобы определить человечков по соседству, параллельно вычисляешь расстояния между ними. Таким образом получаешь ориентационную картину местности - или другими словами, можно уже ударить или еще подойти поближе.

 

Человечка ты представил в виде точки. Тогда монстра можно представить в виде нескольник точек. Собственно и все. Так ты сохраняешь непрерывное пространство, но при этом пользуешься всеми преимуществами дискретного пространства.

No comments

Опубликовано

Военный Пацифист, я, в принципе, понял, о чём ты. Но проблема из #14 для этого случая остаётся. Например, когда в углу соседнего по вершине тайла находится враг, нужно подойти к углу и ударить его, то расстояние выйдет визуально больше. И ещё одно - в твоём варианте в одном тайле может находится более одного объекта?

Перманентная ностальгия

Опубликовано

Военный Пацифист, я, в принципе, понял, о чём ты. Но проблема из #14 для этого случая остаётся. Например, когда в углу соседнего по вершине тайла находится враг, нужно подойти к углу и ударить его, то расстояние выйдет визуально больше. И ещё одно - в твоём варианте в одном тайле может находится более одного объекта?

Да, на одном тайле может быть несколько объектов. Размер тайла - ну на вскидку 4 или 9 тайлов из #14. А проблемы там никакой нет, т.к. расстояние непривязано к тайлам. Здесь тайл - просто вспомогательный бокс для быстрой ориентации.

No comments

Опубликовано

Военный Пацифист, то есть, люди представляют из себя точки на плоскости и нижняя часть их арта может находиться на двух тайлах одновременно?.. В таком случае нужно ещё присвоить пару параметров арту - например, его "длина" и "ширина". И в результате получить что-то вроде формулы для соприкосновения двух объектов: d^2=(<длина_1>+<длина_2>)^2+(<ширина_1>+<ширина_2>)^2 (d - расстояние между привязанными "точками"), при чём длина и ширина - в изометрии. Но приписывать их придётся каждому арту в отдельности.

Перманентная ностальгия

Опубликовано

Военный Пацифист, то есть, люди представляют из себя точки на плоскости и нижняя часть их арта может находиться на двух тайлах одновременно?.. В таком случае нужно ещё присвоить пару параметров арту - например, его "длина" и "ширина". И в результате получить что-то вроде формулы для соприкосновения двух объектов: d^2=(<длина_1>+<длина_2>)^2+(<ширина_1>+<ширина_2>)^2 (d - расстояние между привязанными "точками"), при чём длина и ширина - в изометрии. Но приписывать их придётся каждому арту в отдельности.

Нижняя часть арта - это ноги? :)

 

Неважно, главное, что точка лежит на одном тайле. В первом приближении можно считать, что объект (если человек) - просто цилиндр. Если монстр (например, миниатюрное лохнеское чудовище), то расставляешь точки: 1) голова 2) шея 3) туловище 4) хвост (все точки горизонтальны). Если требуется больше реалистичности - то да - объект - прямоугольник с шириной и длиной, но и вычисления посложнее.

No comments

Опубликовано

Ну там не совсем прямоугольник, и я ступил) Надо не так считать... Сейчас...

Так по идее: round((r1+r2)*cos(a))=x2-x1, round((r1+r2)*sin(a))=y2-y1, (x2;y2) - координаты точки объекта, к которому мы движемся, (x1;y1) - неизвестные координаты (те, в которые должна стать точка нашего персонажа). Угол a можно высчитать исходя из стартовых координат точки нашего персонажа (x0;y0): R=sqrt(sqr(x2-x0)+sqr(y2-y0)), round(R*cos(a))=x2-x0, round(R*sin(a))=y2-y0. То есть, в принципе, выходит: x2-x1=round((r1+r2)*(x2-x0)/R), y2-y1=round((r1+r2)*(y2-y0)/R). И точка персонажа (x1;y1)=( x2-round((r1+r2)*(x2-x0)/R);y2-round((r1+r2)*(y2-y0)/R) ). Результат - точка в изометрической системе координат. Ну и если персонаж и объект - в разных тайлах - достаточно взять остаток при делении на размер тайла)

Перманентная ностальгия

Опубликовано

Кстати, тогда можно совсем без тайлов. Проверять только те объекты, которые находятся на каком-то расстоянии от персонажа. Но, с такой идеей, тогда уж и бегать персонаж сможет под любым углом. То есть, это будет не совсем Арковская изометрия. Но в данном случае (с любыми углами) придётся: а) Довольствоваться приближением ±22,5 градусов (в Арке - 8 направлений бега с разницей в 45 градусов); б) Рисовать больше артов. Что один, что второй вариант кажутся мне не сильно подходящими... Хотя есть и третий вариант: сначала бежать по "иксу", потом - по "игреку", либо по той самой змейке. Но тогда приходим к изначальному вопросу избавления от змейки...

Перманентная ностальгия

Опубликовано

Кстати, тогда можно совсем без тайлов. Проверять только те объекты, которые находятся на каком-то расстоянии от персонажа.

В моей идеи вообще нет изометрии, как показывать сцену - решайте сами. Тайлы нужны, чтобы не перебирать все объекты на карте, а сразу находить соседние. В этом весь смысл предлагаемого мною метода. И бегать змейкой ненужно, тк координаты непрерывные - выбрал любую точку на карте, туда и перемещаешься - в эту точку.

No comments

Опубликовано
Человечка ты представил в виде точки.
Да?
Рассмотрим человека. Пусть это будет точка, тогда он имеет следующие координаты...
:derisive:

Мной же человек рассматривался скорее как тайл (или цилиндр с диаметром тайла)

 

Представь сетку из квадратов как в аркануме. Теперь мысленно эту сетку убери, чтобы ее не осталось. Теперь введи непрерывные координаты для точки, на плоскости это будут икс и игрек. Пусть объект имеет эти координаты. Но тогда появляется вопрос, как объект будет ориентироваться относительно других объектов. Другими словами, как определить достаточно расстояния, чтобы один человечек ударил другого, или как сделать, чтобы один не наступил на то место, где стоит другой. Очевидно нужно вычислить расстояние между этими двумя человечками, т.е. между двумя разными точками. Но тогда тебе надо перебрать всех человечков на карте и посчитать все расстояния между ними, это хлопотно, занимает время и совсем не нужно. Теперь верни квадратную сетку, но пусть она будет чуть побольше чем в аркануме. Теперь тебе достаточно указать два типа координат 1) номер тайла (квадрата), на котором стоит человечек
Одна из версий оптимизации алгоритма. Не скажу, что вижу это оптимальным, но допустим.
как сделать, чтобы один не наступил на то место, где стоит другой.

<...>2) его координату как точку на тайле - чтобы не перебирать всех человечков на карте. Ты знаешь, на каком тайле стоит человечек и знаешь соседние тайлы. Теперь достаточно только перебрать все соседние тайлы, чтобы определить человечков по соседству, параллельно вычисляешь расстояния между ними. Таким образом получаешь ориентационную картину местности - или другими словами, можно уже ударить или еще подойти поближе.

Не нашел в тексте решения обозначенной проблемы. А с учетом того, что у тебя "человек = одна точка", получаем, что два человка могут вполне стоять на расстоянии 2-3px друг от друга. (теперь мысленно нарисуй двух арканумоских человечков, центры которых отстоят друг от друга на два пикселя - смотрится ок?)

 

Допускаем, что еще вводятся какие-нибудь "радиусы непрекосновенности", но тут изометрия, а не 3D. Переводим -> радиусы (окружности) плавно превращаются в эллипсы -> получаем цельный эллипс, состоящий из точек ненаступления. Такой набор точек рассчитать и хранить куда более ресурсоемко нежели один тайл для тех же целей.

 

Глобально, предложенное решение и так напоминаниет создание для изометрической картинки (/движка) 3D математического аппарата. Что является изрядным усложнением вообще всего.

 

 

И да, за все обсуждение старательно уходим от одной из обозначенных выше задач... :ustav:

Сформулирую заново:

 

Спрайтовый персонаж при переходе от центра одного тайла до центра другого тайла (обозначим это расстояние X) совершает покадровый "шаг"(набор кадров сие изображающих). Т.к. X - константа (*), то вся анимация затачивается под то, чтобы иллюзия движения 'за шаг' совпадала именно с перемещением фигуры на расстояние X.

При "свободных" координатах подразумевается возможность шага на любое расстояние. Как же тогда должен выглядеть шаг на меньшее расстояние? X/2, Х/3, X/4, X/5 и т.д.

_____________________

(*) X - на самом деле две константы: 1 - для перемещений по диагонали, 2 - для перехода на клетку с общей стороной. Но сути дела это не меняет. Т.к. анимации для "диагональных" и "прямых" заточены каждая под свое число.

(**) Навскидку не скажу точное значение X1 и X2 для арканума в пикселях - лень лезть куда либо. Померять ширину-диагональ тайла можно на картинках в этой же теме выше.

 

 

 

В моей идеи вообще нет изометрии, как показывать сцену - решайте сами. Тайлы нужны, чтобы не перебирать все объекты на карте, а сразу находить соседние. В этом весь смысл предлагаемого мною метода. И бегать змейкой ненужно, тк координаты непрерывные - выбрал любую точку на карте, туда и перемещаешься - в эту точку.

Приехали...

 

Тогда какое отношение это все имеет к обсуждению темы "гексы/клетки"? И так понятно, что ни первые, ни вторые при отсутствии изометрии (3D ок) вообще не нужны.

 

 

Похоже, тему вообще пора пилить, как минимум, на две:

- Гексы/клетки + альтернативы (не 3д). Мировой опыт и холивар

- "Большие" монстры в изометрии Арка (полезно для A:Р)

Собираем корабль для путешествия в Арканум (VormanTown-онлайн). Билеты здесь

post-72-1213126565.gifpost-72-1213126671.gif

Опубликовано

Что то не вьезжаю, в чем проблема. Изометрия - частный случай ЗD, так сказать ортогональная проекция под некоторым углом камеры, расположенной на некотором расстоянии. Под некоторым углом - означает, что реальная координата игрек умножается на косинус угла и получается экранная координата. В более сложном случае - это связь координат будет через косинусы и синусы, никаких искривленных окружностей - эллипсов - здесь не надо. Теперь убери 3D, а косинус угла оставь. Вот тебе изометрия и связь координат реальных и экранных.

 

По поводу проблемы, чтобы один человек не встал в то место, где стоит другой. Для чего должны вычисляться расстояния между точками, по-твоему? Не просто так, а для того, чтобы оценить расположение объектов относительно друг друга и установление (в виде константы) минимального расстояния между ними. Теперь точка-объект будет окружена окружностью (масло масленное, простите) - это и есть твой как бы цилиндр. Теперь умножаешь реальную координату игрек на косинус угла и окружность по волшебству (но это не волшебство!) становится эллипсом. Понимаешь, о чем я? Все вычисления проводить в реальных координатах и уже на последней стадии переводить их в изометрию, всего лишь умножая на косинус.

 

Аннимация шага - это вопрос не настолько глобальный, а уже прикладной. Можно например сделать несколько видов шагов, с разными размерами шага.

No comments

Опубликовано
Аннимация шага - это вопрос не настолько глобальный, а уже прикладной. Можно например сделать несколько видов шагов, с разными размерами шага.
Gotcha! Посчитаем фронт 'прикладного' вопроса:

 

10 кадров один шаг * 8 направлений * (16 типов оружия + 1 общий бег ) * 7 типов брони * 4 цветовых решения этой брони * 9 сочетаний раса/пол = 342'740 кадров. *

Для каждого "нового типа" нужно нарисовать столько же. Ручками, без исходных моделей, с которых разработчиками это все рендерилось автоматом.

_____________________

//* Полуогры не носят мантий и тех-доспех на них выглядит как обычный -> общая сумма будет чуть-чуь меньше.

 

 

А зачем в Аркануме субтайловая точность перемещений-то?
Была высказана идея, что избавиться от тайлов вполне можно. Я не думаю что это так. Для чего и привел ряд доводов.

Собираем корабль для путешествия в Арканум (VormanTown-онлайн). Билеты здесь

post-72-1213126565.gifpost-72-1213126671.gif

Опубликовано
Была высказана идея, что избавиться от тайлов вполне можно.

Это вопрос второго порядка малости. Главное - зачем? Получаем ли мы в этом случае какие-либо преимущества, которых я пока не вижу?

Опубликовано

У меня спрашиваешь? Аналогично.

 

Но думаю, что гипотеза появилась как одно из решений задачи "о монстрах больше одного тайла". Повторюсь, имхо, решение не айс - добавляет больше сложностей, чем решает проблем.

Собираем корабль для путешествия в Арканум (VormanTown-онлайн). Билеты здесь

post-72-1213126565.gifpost-72-1213126671.gif

Опубликовано

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

Ну я же объяснил. Если брать готовые Арканумские арты, то нужно будет либо бегать с точностью до 22,5 градусов, либо бегать змейкой. Так как в Арке направлений 8, а в твоём варианте - бесконечность (в общем-то меньше, но намного больше восьми). И тот и другой варианты - не подходят. То есть, этим способом можно решить проблему больших монстров, но добавится ряд новых.

Перманентная ностальгия

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...