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

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

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

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

Прокрутка карты (перемещение, скроллинг)

Прокрутка карты (перемещение, скроллинг)

 

 

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

 

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

 

Для начала давайте разберемся как работает прокрутка карты. Скроллинг построен на изменении координат по двум осям Х и У. При прокрутке влево-вправо изменяем координату Х, при прокрутке карты вверх-вниз изменяем координату У.

 

Допустим у нас имеется игровая карта размером 50х50. Размер игровых ячеек (клеточек) на карте 64х64 пикселей. Нужно объявить двумерный массив для игровой карты:

 

Mas:array[0..49, 0..49] of integer;

 

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

 

Image:array[0..4] of TBitmap;

 

На следующем этапе заполняем карту данными. Данные будут представлять из себя номера земельных покрытий и их картинок. Поскольку карта двумерная, то первый номер означает координату Х ячейки, а вторая цифра – координату У ячейки. Случайным образом заполняем карту номерами от нуля до четырех:

 

Randomize;

For i:=0 to 49 do

For j:=0 to 49 do

Map[I,j]:=random(5);

 

Исходя из начальных данных мы рисуем  игровую карту по таймеру следующим образом:

 

For i:=0 to 49 do

For j:=0 to 49 do

Form1.Canvas.Draw(i*64, j*64, Image[ Map[I,j] ]);

 

Все, что нужно для добавления скроллинга (прокрутки) карты это объявить две переменные, а также изменять эти переменные для перемещения по карте. Назовем переменные, ответственные за смещение по осям координат так:

 

Mx,My:integer;

 

Изначально присваиваем этим переменным нулевые значения:

 

Mx:=0;

My:=0;

 

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

 

For i:=0 to 49 do

For j:=0 to 9 do

Form1.Canvas.Draw(i*64-Mx, J*64-My, Image[ Map[I,j] ]);

 

Изменяя смещение и карта будет перемещаться. Теперь рассмотрим несколько вариантов как изменять смещение и как создать сам процесс прокрутки карты.

 

Первый вариант заключается в добавлении двух компонентов ScrollBox. Первый мы делаем вертикальным (для оси Х), а второй горизонтальным (для оси У). Минимальные значения делаем равные нулю. Максимальные значения делаем равными:

 

ScrollBar1.Min:=0;

ScrollBar1.Min:=0;

ScrollBar1.Max:=64*Ширина Карты – Ширина окна прорисовки – 64;

ScrollBar2.Max:=64*высота Карты – Высота окна прорисовки – 64;

 

Дважды кликнув по горизонтальному ScrollBox пишем:

 

Mx:=ScrollBar1.Position;

 

Дважды кликнув по вертикальному ScrollBox пишем:

 

My:=ScrollBar2.Position;

 

Теперь можно запустить программу и испытать готовую прокрутку нашей карты.

 

Для второго варианта прокрутки я предлагаю использовать клики мышкой по краям карты. С какого краю карты мы кликнем, в ту сторону карта и передвинется. Предлагаю использовать края карты в 15 пикселей.

 

Для начала обьявялем две переменные KlikX, KlikY, которые отображают координаты точки, в которой мы кликнем на карте. Вь событии формы или компонента Image прописываем код, который записывает координаты клика:

 

KlikX:=Mouse.CursorPos.X - Form1.Left;

KlikY:=Mouse.CursorPos.Y - Form1.Top;

 

Затем пишем проверку кликнули мы на краю карты или нет? А также в какую сторону нужно сместить карту, например на 8 пикселей:

 

If KlikX<=15 then Mx:=Mx-8;

If KlikX>=Form1.Width-15 then Mx:=Mx+8;

If KlikY<=15 then My:=My-8;

If KlikY>=Form1.Height-15 then My:=My+8;

 

Далее следим чтобы значения не выходили за рамки размера карты:

 

If Mx<0 then Mx:=0;

If My,0 then My:=0;

If Mx>64*Ширина карты - размер окна-64 then Mx:= 64*Ширина карты - размер окна-64;

If My>64*Высота карты - размер окна-64 then My:= 64*Высота карты - размер окна-64;

 

Третий вид прокрутки карты – это автоматическая проктука карты при перемещении игрового персонажа. Чтобы это организовать нужно привязть смещение карты к перемещению персонажа. Условимся, что скорость, с которой может перемещаться персонаж записан в переменной Speed. Тогда при каждом перемещении персонажа изменям смещение следующим образом:

 

Если сдвинулись влево:

 

Mx:= Mx – Speed;

 

Если вправо:

 

Mx:= Mx + Speed;

 

Если вверх:

 

My:= My – Speed;

 

Если вниз:

 

My:= My + Speed;

 

При этом прорисовка карты остается прежней. Можно придумать огромное количество вариантов прорисовки карты и организации скроллинга карты. Поэтому оставляю эти варианты на Вашу фантазию. На этом у меня все. Если будут вопросы задавайте на нашем форуме. Всем удачи в создании игр на Делфи.

 

 

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

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

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