Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 09.01.2025, 06:54
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Игровые алгоритмы

Как перемещаться в тайловом мире? Перемещение по клеточной карте.

Как перемещаться в тайловом мире? Перемещение по клеточной карте.

 

 

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

 

Поскольку тайловые карты поделены на клеточки, то при перемещении по такой карте, нужно лишь проверять можно стать на нужную клеточку или нет. На что ориентироваться при проверке? Каждая клеточка содержит номера типов земель и номера объектов, а значит на них и будем ориентироваться. Но перед проверкой необходимо определиться с проходимыми и непроходимыми типами земель и бъектами.

 

Например, у нас есть 4 возможных типов земель и вода, как стандартный (начальный) тип местности:

 

0 – вода

1 – песок

2 – глина

3 – земля

4 – трава

 

Мы должны определить какие типы земель у нас будут непроходимыми. Я предлагаю непроходимой местностью зделать только воду. Также у нас присутсвует, к примеру, 5 игровых люъектов:

 

0 – нет объектов

1 – дерево

2 – камень

3 – здание

4 – бочка

5 – двери

 

Также советую упорядочить объекты и типы местности. Типы местности упорядочить по высоте над другими типами, а объекты нужно упорядочить сначала непроходимые, а затем проходимые или наоборот. Если у нас будет 100 объектов и 50 из них непроходимые, то в случае неупорядочивания объектов у нас получится хаос и прийдется писать длинный ход проверки типа:

 

If (Objects[I,j]<>2) and (Objects[I,j]<>4) and (Objects[I,j]<>8) and (Objects[I,j]<>9) and (Objects[I,j]<>21) and (Objects[I,j]<>25) and (Objects[I,j]<>26) and (Objects[I,j]<>29) and (Objects[I,j]<>31) and (Objects[I,j]<>39) and (Objects[I,j]<>42) and (Objects[I,j]<>43)

… then

Player.X:=Player.X+Player.Speed;

 

То есть в таком случае мы просто обязаны перечислять каждый непроходимый участок, а это может быть очень и очень долго и неудобно. А вот в случае упорядочивания объектов, мы должны лишь знать о первом и последнем проходимом и непроходимом объектах. Это выглядит так:

 

If (Objects[I,j]>50) then Player.X:=Player.X+Player.Speed;

 

Не правда ли второй вариант более короткий и удобный. А все от упорядочивания.

 

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

 

Как будет проходить проверка при перемещении персонажа? Допустим клеточки у нас на карте размером 64х64. Тогда при перемещении персонажа мы можем учитывать:

 

 - координаты средней точки картинки персонажа. Где будет средняя точка, в той клетке и будет числится ваш персонаж.

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

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

 

Я рассмотрю вариант третий. Он универсальный и его можно подганять под свои потребности. При перемещении персонажа:

 

Вверх – будем учитывать координаты верхнего левого и верхнего правого угла картинки

Вниз – будем учитывать координаты нижнего левого и нижнего правого угла картинки

Влево – будем учитывать координаты верхнего левого и нижнего левого угла картинки

Вправо – будем учитывать координаты верхнего правого и нижнего правого угла картинки

 

Для диагоналей:

 

Вверх-влево – координаты верхнего левого угла

Вверх-вправо – координаты верхнего правого угла

Вниз-влево – координаты нижнего левого угла

Вниз-вправо – координыт нижнего правого угла.

 

Также нужно разобраться как рассчитывать будем координаты углов картинки размера 64х64 пикселя (точки). Все расчеты будем проводить относительно левого верхнего угла:

 

Верхний левый угол – [Player.X, Player.Y]

Верхний правый угол – [Player.X+64, Player.Y]

Нижний левый угол – [Player.X, Player.Y+64]

Нижний правый угол – [Player.X+64, Player.Y+64]

 

Где Player.X – координата по оси х персонажа, а Player.Y – координата по оси У персонажа.

 

Теперь еще раз более подробно посмотрим на проверку при перемещении персонажа. Теперь мы будем проверять при движении вверх на проходимость местности (земли) и объектов:

 

If (map[Player.X, Player.Y- Player.Speed]>0)

and (map[Player.X+64, Player.Y- Player.Speed]>0)

And (Objects[Player.X, Player.Y- Player.Speed]=0)

and (Objects[Player.X+64, Player.Y- Player.Speed]=0) then

Player.У:=Player.У - Player.Speed;

 

Как видно из кода персонаж перемещается на цифру скорости своей (на сколько клеточек его шаг). Аналогично делаем проверку и для других сторон: придвижении вниз мы вместо минуса ставим плюс и другие углы на проверку (нижние), при движении влево проверяем другие углы и смещаем персонажа по оси Х, а не У оставляя минус, при движении вправо также другие углы и смещаем вправо благодаря плюсу. При движении по диагоналям все проще в 2 раза, так как проверяется лишь один угол. Для примера рассмотрим передвижение по диагонали вврех-влево:

 

If (map[Player.X- Player.Speed, Player.Y- Player.Speed]>0)

And (Objects[Player.X- Player.Speed, Player.Y- Player.Speed]=0) then

Begin

Player.У:=Player.У - Player.Speed;

Player.Х:=Player.Х - Player.Speed;

End;

 

При движении по диагонали мы смещаем одновременно по двум осям координат. На этом думаю пора заканчивать. Мы рассмотрели основные особенности передвижения по тайловому миру. Любая карта построенная на клеточках может использовать данные алгоритмы передвижения по карте. Главное, чтобы Вы понимали смысл алгоритмов, тогда Вы все сможете придумать сами, рисуя на бумажке. Всем пока и удачи в создании игр!

 

Источник: delgame.at.ua

Категория: Игровые алгоритмы | Добавил: Armageddets (29.08.2013) | Автор: Как перемещаться в тайловом мире? П
Просмотров: 1688 | Теги: движение по тайлам, Как перемещаться в тайловом мире, Перемещение по клеточной карте, заставляем двигаться персонажа или, движение по клеточной карте | Рейтинг: 5.0/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Где Вам удобнее оставлять коментарии и задавать вопроссы?
Всего ответов: 24
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 2
    Гостей: 2
    Пользователей: 0