Сейчас среди начинающих игроделов царит мнение, что для написания типичной 2D аркады на PC необходимо обзавестись крутым движком или конструктором, а также нехило знать столь престижный C++, оттого найти стоящую статью по Pascal практически невозможно. Но сегодня я решил попробовать сломать застоявшиеся стереотипы, написав небольшой урок по разработке простенького платформера. Итак, усаживайтесь удобнее, курс «просвещения» начинается…
1. Что необходимо? Различных сред, использующих в качестве языка программирования Pascal, превеликое множество. Но из всей этой кучи для урока я решил использовать именно PascalABC.net. Почему? Ответ прост: во-первых данная среда программирования использует не чистый Паскаль, а его современный и более удобный потомок – Object Pascal; во-вторых Паскаль.Нет абсолютно бесплатна, а значит вам не придется парится с кряками или тратить деньги на лицензию.
2. Алгоритм. Итак, у нас есть площадь 640x480, которая по моей задумке будет делиться на клеточки размером 8x8, представляющие из себя звенья массива s. Таким образом, меняя значение клеточки, мы можем сделать ее «свободной», либо «занятой» (к примеру, использовать как стену).
В итоге мы сможем без лишних манипуляций определить, куда игрок может переместиться, а куда нет (см. рис).
3. Переменные и модули. Для полноценной работы нашей будущей игры нам понадобится подключить всего-ничего один модуль GraphABC, позволяющий отображать графические примитивы на экране.
Далее инициируем необходимые нам переменные (см. листинг 1).
Листинг 1:
Code
uses GraphABC;
var s : array [,] of integer; i,x,y,vspeed : integer; game_end : boolean;
4. Нажатия клавиш. Итак, чтобы далее вам не пришлось лазать по своей писанине, чтобы модифицировать код, создадим две отдельные процедуры, отвечающие за манипуляции с положением игрока.
Листинг 2:
Code
//Обработка нажатий клавиш procedure KeyPress(key: char); begin
if (key='d') and (s[(x div 8)+1,(y div 8)]=0) then //Если нажата клавиша D… x:=x+8; //... А также есть свободное место, то передвигаемся на… //… клеточку вперед (значение x увеличивается на 8)
if (key='a') and (s[(x div 8)-1,(y div 8)]=0) then //см. комментарий выше x:=x-8;
if (key='w') and (vspeed=0) and (s[(x div 8),(y div 8)+1]=1) then //Если есть «занятая клеточка»… vspeed:=-16; //… под ногами, то совершаем прыжок.
end;
procedure KeyDown(key: integer); begin if (key=vk_enter) then game_end:=true; //При нажатии ENTER… //значение переменной game_end равно true end;
5. Гравитация. Неотъемлемой частью платформера является какая никакая, а сила тяжести. Поэтому сейчас мы должны написать отдельную процедуру, которая в дальнейшем поможет игроку встать на ноги в буквальном смысле.
Листинг 3:
Code
//Гравитация procedure Gravity(); begin
if vspeed=0 then begin //Если скорость прыжка равна нулю… if s[(x div 8),(y div 8)+1]=0 then y+=8; //… перемещаемся на «клеточку» вниз (падаем) end;
if s[(x div 8),(y div 8)+vspeed]=0 then y+=vspeed; //Если сверху есть свободная клеточка, то… //… перемещаемся на vspeed вверх.
if vspeed<>0 then //Если скорость прыжка не равна нулю (в нашем случае: меньше нуля)… vspeed+=2; //… то помаленьку ее сбавляем.
end;
6. Рисование. Думаю тут понятно без лишних слов, но для галочки отмечу, что игра делится на «визуальную» и «невизуальную» части. «Невизуальная» отвечает за все происходящее в самой игре, а «визуальная», собственно, за отображение происходящего на экране. Так вот, данная ниже процедура отвечает за «визуальную» часть и только.
Листинг 4:
Code
procedure Draw(); begin
Redraw; LockDrawing;
//Рисуем белый прямоугольник… setbrushcolor(clwhite); //… размером 640 на 480 fillrectangle(0,0,640,480);
setbrushcolor(clblack);//Рисуем черные стены… fillrectangle(0,192,640,224);//… по координатам… //… 0 – 640 по X; 192 – 224 по Y //(ВНИМАНИЕ! Данные манипуляции не делают стены осязаемыми, а всего лишь… //… создают их графический образ.
setbrushcolor(clred); //Рисуем игрока по координатам… fillrectangle(x,y,x+8,y+8);//… x и y
end;
7. Тело программы. Вот мы и добрались, собственно, до самой программы. Тут нам необходимо заполнить массив нужными нам значениями, а также задействовать ранее написанные процедуры.
Листинг 5:
Code
Begin //начало программы
//Указания значений для переменных game_end:=false; x:=0; //Стартовая позиция игрока по X y:=0; //Стартовая позиция игрока по Y
//Создание массива s := new integer[200,200];
//Создание платформы, нарисованной в процедуре Draw for i:=0 to 79 do s[i,24] := 1;
while game_end=false do begin //Создаем цикл… //… который прервется, если game_end = false
sleep(30); //Ждем примерно полсекунды, чтобы игра… //… работала с нормальной скоростью
end;//конец цикла.
end. //конец программы
8. Заключение. Итого у нас получился незамысловатый платформер с точкой в главной роли. Мы можем передвигаться по горизонтали и прыгать:
В общем, не хотелось бы разбавлять концовку этого урока всякой мутью, поскольку «ненужную воду» зачастую просто не читают, поэтому отделаюсь тем, что попрошу вас оставлять комментарии. Спасибо за внимание! Надеюсь, я вам помог!
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Создание платформера на Pascal», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Объясните каждую букву, я понимаю это как - В массиве x считается целое от 8 и прибовлятся 1 - Вопрос: как это может равняться 0?(у меня выходит всегда 1 как я бы не считал ). | (s[(x div 8)+1,(y div 8)]=0) |.
По идее должен быть массив 640/8 на 480/8, т.е. 80х60. Остальные элементы излишни. В листинге проверяется свободна ли ячейка в массиве, чтобы туда двигаться
Так говорят те, кто дальше своих конструкторов ничего не видят. Ну или сишники, которых от Pascal выворачивает...
Подробнее смысл кода объясняй. Новичкам может быть непонятно. Вообще, с каждой новой функцией знакомить нужно (если бы новичок их сам знал, он бы без твоей статьи обошёлся бы легко) - какой аргумент что означает, а дальше можно использовать без комментариев. И объяснять, какая переменная для чего будет использоваться в программе. Но и лишних комментариев не нужно, типа этого:
Quote
//(ВНИМАНИЕ! Данные манипуляции не делают стены осязаемыми, а всего лишь… //… создают их графический образ.
Ясно же, что мы просто рисуем прямоугольник, а не создаём готовый игровой объект, типа как в GM/SC.
Вот здесь перемести комментарии на строчку ниже:
Quote
//Рисуем белый прямоугольник… setbrushcolor(clwhite); //… размером 640 на 480 fillrectangle(0,0,640,480);
P.S. У каждого, конечно, свой стиль и привычки, но для языков с паскалеобразным синтаксисом begin по-хорошему должен начинаться с новой строки. Ну и не нужно ставить так много многоточий в комментариях, они там лишние...