Прокрутка карты (перемещение, скроллинг)
В компьютерных играх с большими игровыми картами присутствует необходимость реализации возможности прокрутки карты. Такая необходимость вызвана тем, что игровая карта гораздо больше окна, в котором карта прорисовывается. Поэтому всю карту в таком окне отобразить невозможно, а значит будет рисоваться лишь какая-то часть этой карты мира.
Зачастую игрок должен иметь возможность как вручную самому прокручивать карту, так и необходима реализация автоматической прокрутки карты при передвижении игровых персонажей. Для многих это кажется сложно или даже неподъемной задачей, но это не так. Основная сложность заключается в понимании работы скроллинга карты. Изучив данный процесс, все сложности пропадают сами собой.
Для начала давайте разберемся как работает прокрутка карты. Скроллинг построен на изменении координат по двум осям Х и У. При прокрутке влево-вправо изменяем координату Х, при прокрутке карты вверх-вниз изменяем координату У.
Допустим у нас имеется игровая карта размером 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
|