Четверг, 23 ноября 2017, 23:20

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [306]
Статьи об общих понятиях связанных с созданием игр.
Программирование [69]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [123]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [11]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [10]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [4]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [70]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [56]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Игры какого жанра вы предпочитаете делать?
Всего ответов: 14209
Главная » Статьи » Создание игр

Создание платформера на Pascal
Сейчас среди начинающих игроделов царит мнение, что для написания типичной 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

  //Рисование экрана
  Draw();

  //Гравитация для игрока
  Gravity();

  OnKeyPress:=KeyPress; //Обработка нажатий…
  OnKeyDown:=KeyDown; //… клавиш
   
  sleep(30); //Ждем примерно полсекунды, чтобы игра…
//… работала с нормальной скоростью
   
end;//конец цикла.
   
end. //конец программы


8. Заключение.
Итого у нас получился незамысловатый платформер с точкой в главной роли. Мы можем передвигаться по горизонтали и прыгать:



В общем, не хотелось бы разбавлять концовку этого урока всякой мутью, поскольку «ненужную воду» зачастую просто не читают, поэтому отделаюсь тем, что попрошу вас оставлять комментарии. Спасибо за внимание! Надеюсь, я вам помог!
Категория: Создание игр | Добавил: ErrantBug (21 ноября 2012)
Просмотров: 30563 | Комментарии: 17 | Рейтинг: 4.7/21 |
Теги: Object Pascal, паскаль, платформер, разработка, pascal, pascalabc, Программирование, игры, PascalABC.NET, 2d
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Создание платформера на Pascal», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 171 2 »
+0-
17 SteelFlame   (27 июля 2017 02:08)
SteelFlameОбъясните каждую букву, я понимаю это как - В массиве x считается целое от 8 и прибовлятся 1
- Вопрос: как это может равняться 0?(у меня выходит всегда 1 как я бы не считал ). | (s[(x div 8)+1,(y div 8)]=0) |.

+0-
15 SteelFlame   (17 июля 2017 23:26)
SteelFlameЛистинг 2 - что за в масиве 200 на 200? blink

+0-
16 Vuvk   (18 июля 2017 20:34)
VuvkПо идее должен быть массив 640/8 на 480/8, т.е. 80х60. Остальные элементы излишни.
В листинге проверяется свободна ли ячейка в массиве, чтобы туда двигаться

+1-
14 kantabrina   (09 апреля 2013 16:36)
kantabrinaУ меня он не ходт? sad

+4-
13 Demix   (01 января 2013 14:24)
DemixДля разнообразия - пойдет

+3-
12 WhoAmI   (31 декабря 2012 21:36)
WhoAmIПиши серию уроков!!! Плз!!! Я просто умоляю... Статья класс!! Респект!!! respect respect

+4-
11 UserName   (09 декабря 2012 16:17)
Хороший урок

+7-
10 JSent   (26 ноября 2012 20:34)
JSentПиши серию уроков book

+2-
6 OlegDSX   (25 ноября 2012 20:05)
OlegDSXЯ попробовал скопипастить это в PacalABC, все нарисовалось, ошибок нет, но персонаж не управляемый, не двигается, не прыгает, просто на месте стоит.

+3-
8 ErrantBug   (26 ноября 2012 07:15)
ErrantBugВозможно, у тебя просто включен Капс-Лок. А так все вполне нормально работает.

+5-
9 OlegDSX   (26 ноября 2012 16:02)
OlegDSXДело было в раскладке клавиатуры happy

+9-
4 vicu2010   (24 ноября 2012 13:29)
vicu2010Всегда мечтал сделать игру на единственном понятном языке - паскаль!!! Жаль времени нет выполнять урок, но тыщу плюсов тебе...

+8-
3 ErrantBug   (23 ноября 2012 19:04)
ErrantBugХотел написать понятную новичкам статью, а получил статус поехавшего дебила... Надо же было так.

+6-
5 TimKruz   (24 ноября 2012 23:04)
TimKruzТак говорят те, кто дальше своих конструкторов ничего не видят. Ну или сишники, которых от Pascal выворачивает...

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

Quote
//(ВНИМАНИЕ! Данные манипуляции не делают стены осязаемыми, а всего лишь…
//… создают их графический образ.

Ясно же, что мы просто рисуем прямоугольник, а не создаём готовый игровой объект, типа как в GM/SC.

Вот здесь перемести комментарии на строчку ниже:
Quote
//Рисуем белый прямоугольник…
setbrushcolor(clwhite); //… размером 640 на 480
fillrectangle(0,0,640,480);


P.S. У каждого, конечно, свой стиль и привычки, но для языков с паскалеобразным синтаксисом begin по-хорошему должен начинаться с новой строки.
Ну и не нужно ставить так много многоточий в комментариях, они там лишние...

+3-
7 ErrantBug   (25 ноября 2012 20:11)
ErrantBugНу вот! Хоть один стоящий комментарий smile

Quote
Новичкам может быть непонятно.
Я старался написать статью именно на людей, знающих Pascal на базовом уровне, поэтому думаю кто-то да поймет happy

1-10 11-12
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • J.U.R.P.E.
  • Game Hammer 2
  • Greenfoot
  • Yake
  • Vizard
  • eXgine
  • PointJS
  • Zombie Engine
  • BlitzMax
  • Smile Game Builder
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    GameDev, Уроки OpenGL, Программирование, Создать Minecraft
    Все права сохранены. GcUp.ru © 2008-2017 Рейтинг