Создать игру, создание игр, конструктора игр, игровые движки, разработка игр, сделать игру
Приветствую Вас Гость · Вход · Регистрация  ·  Новые сообщения · Участники · Правила · Поиск · RSS
Страница 1 из 11
Форум разработчиков игр » Программирование » Delphi, Pascal, ObjectPascal » Создание 2d стрелялки "Замочить птичку" шаг за шагом. (Для тех кто помнит Паскаль со школы.)
Создание 2d стрелялки "Замочить птичку" шаг за шагом.
Арахис Дата: Понедельник, 10.10.2011, 16:40 | Сообщение # 1
Просмотр профиля: Арахис

Сообщений: [99]
Внимание!!! То что выделено жирным шрифтом это программный код. Все остальное это только комментарии.
Описание: на экране некоторое время летает птичка и тучки. Вам надо стрелять в птичку. За каждое попадание вы получаете очки. Ваша цель установить новый рекорд по очкам. Короче игра на уровне тетриса как раз для ознакомления с Дэлфой. Моя цель приучить вас к Дэлфе - может вам понравится.
Вы пока скачайте эти картинки для создания игры а я программу подготовил теперь осталось придумать как вам код объяснить.
Тут можно скачать программу, исходник и картинки для ее создания(ИСПРАВЛЕНАЯ):http://www.fayloobmennik.net/1063236


Сообщение отредактировал: Арахис - Среда, 12.10.2011, 19:16
g2_ Дата: Понедельник, 10.10.2011, 16:49 | Сообщение # 2
( ga2mer )


Сообщений: [195]
facepalm
Арахис, вы с интернетом на вы?
Арахис Дата: Понедельник, 10.10.2011, 16:53 | Сообщение # 3
Просмотр профиля: Арахис

Сообщений: [99]
Месяц назад у меня появился. Да ладно тебе скажи как.

Сообщение отредактировал: Арахис - Понедельник, 10.10.2011, 17:02
Filinshein Дата: Понедельник, 10.10.2011, 17:14 | Сообщение # 4
Просмотр профиля: Filinshein

Сообщений: [2126]
Арахис, Во-первых залей на хостинг
PaintKiller Дата: Понедельник, 10.10.2011, 19:37 | Сообщение # 5
Просмотр профиля: PaintKiller

Сообщений: [1739]
happy
Filinshein Дата: Понедельник, 10.10.2011, 20:14 | Сообщение # 6
Просмотр профиля: Filinshein

Сообщений: [2126]
PaintKiller, Да ладно тебе ржать сразу biggrin Ну не знал человек, не знал biggrin
Хоббитс Дата: Понедельник, 10.10.2011, 21:48 | Сообщение # 7
Просмотр профиля: Хоббитс

Сообщений: [984]
народ чё вы так сразу все мы когда то чего то не знали
Арахис Дата: Среда, 12.10.2011, 17:30 | Сообщение # 8
Просмотр профиля: Арахис

Сообщений: [99]
Извините что мать меня интернет программистом не родила. tongue :p tongue

Добавлено (11.10.2011, 01:04)
---------------------------------------------
Ну что поехали.
Шаг 1. Оформление формы.
Запустите Дэлфи. Перед вами серая форма. Не пугайтесь точек. В програме(в экзэшке) они не видны. Вообще то птичка должна летать в синем небе поэтому измените цвет формы на синий. Для этого выберите форму( клацните по ней один раз). Слева в Инспекторе Объектов(Object Inspector) вы увидите ее свойства в виде списка параметров. Окно инспектора разделено на два столба. Левый столб - название параметра(свойства объекта), правый - поле для его редактирования или выбора возможных значений. Найдите параметр "color" и клацните на поле справо от него. Выберите синий цвет. Учтите что на выбор даются несколько разных синих цветов. Посмотрите какой синий цвет на картинках с птичкой или тучками и попытайтесь выбрать похожый. Дальше, давайте сделаем так что бы в заголовке формы было не "form1" а название игры "Замочить птичку". Найдите параметр "caption", клацните на поле справо от него ну а дальше вы поймете.
Шаг 2. Размещение обьектов на форме
Киньте на форму обьект "mainmenu" в любое место. Для этого подведите курсор к какому то обьекту на панели "standart". Тогда под курсором высветится его название таким образом вы найдете наш обьект. Если вы не нашли обьект на панели "standart" значит он на другой панели. Клайните один раз по обьекту. Наведите курсор в нужное место и клацните левой кнопкой опять.Что бы удалить обьект выделите его и нажмите "delite". Киньте пять обьектов "image"(рисунок). image1 по высоте разместите по середине. Остальные image киньте в верху на немножко разной высоте. Киньте прямо на середину формы "panel"(панель). Киньте прямо на эту панель "combobox"(выпадающий список) и "button"(кнопка).
Киньте в низ формы еще один "panel"(панель). На эту панель киньте "label" 6 штук. Теперь вам их надо переименовать. Делается это также как и с формой. Переименуйте: label1 на Время:, label2 на 0, label3 на Очки:, label4 на 0, label5 на рекорд, label6 на 0. Названия будут написаны мелким шрифтом поэтому рекомендую его выделить. Делается так: выбираете нужнай вам label, ищете параметр "Font", клацаете на поле справа от него, тогда появится троеточие, клацаете на троеточие а дальше вы поймете.
Теперь надо загрузить в каждый image картинку для этого выберите его, найдите параметр "picture", клацните справа отнего на троеточие а там уже поймете.В остальные четыре image загрузите рисунки тучек. После того как вы загрузили изображение найдите параметр "proportional" и поменяйте его значение с "false"(неправда) на"true"(правда). После этого ростяните и ли стяните каждую картинку до нужных размеров.
Когда на форме появили панели вы увидели что по середине каждой из них написано ихнее название которое нам мешает. Как его убрать? Выберите панель, найдите параметр "caption" а там поймете. На кнопке которая находится на panel1 написано ее название а на нужно что бы было"Ок". Переименуйте ее спомощью параметра "caption".
Сделайте panel2 зеленого цвета с помощью параметра color.
Шаг 3. Меню.
Выберите ваш Mainmenu1(ОсновноеМеню1). Найдите параметр "items"(изделия). Клацните на поле справа от него, появится треточие. Клацните на троеточие. Справа вы увидете какой вид будет иметь ваша менюшка и там же можете переключатся между ее кнопками. Напротив "caption" напишите "Меню". Переключитесь на правое поле какогото другого параметра и вы увидете изменения. Теперь нажмите кнопку влево и вы увидите что снизу появилась еще одна кнопка. Нажмите на нее и напротив "caption" наришите "Выход". Переключитесь на правое поле другого парамтра и вы увидете изменения. Аналогично сделайте ниже кнопки "Новая игра" и "Параметры".
Клацните два раза на "Выход". После этого вы переключитесь в окно редактирования текста и перед вами будет функция:
procedure TForm1.N2Click(Sender: TObject);
begin

end;

Что же она означает? Это функция виполнения действий по нажатию вашей кнопки "Выход" которая в програме имеет имя N2.(Слово которое вы написали на обьекте это не имя обьекта это просто слово!!! Вот такая особенность Дэлфи). Тоесть все те события которые вы написали в середине этой функции начнут выполнятся только после нажатия этой кнопки. Все что вы написали поза этой функцией не ждет когда же вы на нее нажмете.
Нам надо что бы после нажатия "Выход" программа выключалась. Это можно сделать несколькими способами. Я рекомендую написать halt;. Теперь нажмите F9 и Дэлфи создаст програму(экзэшку). Посмотрите что ваша кнопка работает.
Когда запускается програма на до что бы перед вами был просто синий экран, надо что бы рисунков и панелей не было видно. Для этого перейдите на форму(F12) клацните два раза поней и перед вами появится окно редактированея кода с таким текстом:
procedure TForm1.FormCreate(Sender: TObject);
begin

end;

Это функция выполнения действий сразу послетого как запускается программа тоесть создается форма. Теперь будем писать в середине ее. Начнем с image1. Кого вам нужно сделать не видимым? Нужно - image1. Тогда так и напишите: image1.(Точка это не опечатка ее поставьте обязательно!!!)
Дальше, у большинства обьектов есть параметр Visible(видимость) который имеет только два значения: false(неправда) и true(правда). Напишите: Visible:=false;. В итоге у вас должна выйти такая строчка: image1.Visible:=false;. Теперь нажмите F9 и вы увидите что птичку не видно.
Напишите аналогичные строчки для image2,image3,image4,image5,panel1, panel2. Внимание те обьекты которые размещены на панели автоматически становятся не видимыми вместе с ней! Дэлфи упростил написания кода. Наберите только часть кода, нажмите ctrl+пробел и перед вами появится список где можно выбрать нужное слово. Если его там нет тогда добавте еще букву.
По нажатию "Новая игра" все обьекты должны появится. Что вам делать? Скопируйте строчки с помощью которых вы сделали обьекты не видимыми. Переключитесь на форму(клавиша F12). Нажмите на mainmenu, нажмите на троеточие справа от items, нажмите два раза на "Новая игра" и перед вами появится:
procedure TForm1.N3Click(Sender: TObject);
begin

end;

Ставите в эту функцию код, удалите строчку Panel1.Visible:=false;, поменяйте значение false на true. Почему мы удалили ту строчку? Да потому что на этой панели будут высвечиватся параметры(точнее уровни) поэтому она будет доступна только после нажатие кнопки "Параметры". Вот это мы сейчас и сделаем. Перейдите на форму(F12), два раза клацните по mainmenu1, два раза по "Параметры". Откроется окно с:
procedure TForm1.N4Click(Sender: TObject);
begin

end;

Напишите в этой функии строчку: Panel1.Visible:=true;. Прекрасно теперь остало сделать так что бы эту панель закрывать. Думаю вы уже сами догадались как это сделать. И так panel1 будет закрыватся при нажатии на кнопку ""Ок". Тогда надо выбрать эту кнопку, два раза клацнуть по ней. Перед вами появится функция выполнения действий после нажатия этой кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin

end;

В середину этой функции вставте строчку(вы уже догадались какую): panel1.Visible:=false. Запустите вашу прогу( кнопка F9) и порадуйтесь.

Добавлено (11.10.2011, 13:18)
---------------------------------------------
Шаг 4. Время и псевдо время
Дальнейшие действия происходят в функции procedure TForm1.N3Click(Sender: TObject); (Функция выполнения действий после нажатия на "Новая игра")
И так наша птица летает в пространстве и во времени. Когда пройдет определенное время тогда игра закончится. Поэтому у нас сначала будет цикл по времени если точнее по псевдо времени. Давйте введем глобальную величину(тоесть пишите ее возле var который стоит перед всеми функциями) не целелого типа(real)(потому что число будет дробовое) которое будет называтся shot от слова шетчик. smile У вас должна выйти так:
var shot:real;
Form1: TForm1;
.
Пусть наш шетчик уменшается от 2000 тысяч до нуля. Пока он уменшится пройдет некоторое время поэтому он имеет некоторое отношение к времени. Но межде 2000 и 1999 не проходит одна секунда поэтому это число не секунды поэтому это псевдо время. Пишите такой цыкл после строчек где вы обьекты сделали видимыми:
shot:=2000;
while shot>=0 do
begin
shot:=shot-1;
end;

Теперь нам надо виводить псевдо время на экран на Label2. Значит над сторчкой где вы уменьшаете время пишите:Label2.. Думаю ввспоминая переименования формы и кнопки и панелей вы догадуетесь какое дальше слово. Правильно:Caption:=. Теперь казалось бы нам надо просто написать shot но нет не все так просто. Все то что отображается на обьектах формы должно существовать в строчном формате(string). Поэтому мы дальше пишем функцыю которая переводит велечину из формата real в string. Короче у вас должно выйти такое:Label2.Caption:=floattostr(shot);. Так как отобаражаемое число на форме изменяется то изображение всей формы должно перерисовыватся для этого служит команда: Application.ProcessMessages;. Напишите ее после: shot:=shot-1; Теперь запустите прогу и вы увидите как число уменьшается но слишком бысто. Что бы умедленить работу програмы используем команду sleep()(спать) где в дужках пишем величину задершки. Значит под Application.... напишите: sleep(50);. Запустите прогу и увидите что все в порядке. Ну как же тогда сделать из псевдо времени настоящее время. А так. Допустим вам нужно 3 минуты это 180 секунд. Тогда вместо x:=2000; напишите x:=180;. Запустите игру и секундомер и посмотрите за сколько настоящих секунд наш shot дойдет до нуля. Поделите это время на 180 и вместо +1 напишите +это число. У меня секундомера нет поэтоуму я так не заморачивался.

Добавлено (11.10.2011, 13:39)
---------------------------------------------
Шаг 5. Полет птицы
Добавляем глобальную величину х типа(формата) integer(целое число). х - будет горизонтальной координатой птички. Птичка то движется не только во времени но и еще по форме. Движется она с левого края формы который имеет горизонтальную координату 0 до правого который у меня имеет горизонтальную координату 800. Только птичка дошла до правого края(х=800) тогда она телепортируется( smile ) обратно на левый край(x:=0) и снова движется слево на право. Горизонтальная координата в Дэлфи называется "Left" а вертикальная "top". Птичка должна двигатся не только слева на право а еще вниз и вверх поэтому я выбрал движение по синусоиде. Короче у вас должно выйти так:
shot:=2000;
while shot>0 do
begin
x:=0;
while (x<=800) and (shot>=0) do
begin
Image1.Left:=x;
Image1.top:=round(200+100*sin(0.02*x));
Label2.Caption:=floattostr(shot);
shot:=shot-1;
x:=x+10;
Application.ProcessMessages;
sleep(50);
end;
end;

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

Добавлено (11.10.2011, 14:09)
---------------------------------------------
Шаг 6. Полет тучек или полет декораций
Запустите прогу(F9) и скажите что вы перед собой видите. Вы видите как нещясная птичка снова и снова пролетает над тем же самым участком неба. Тоесть она летает по кругу. Это не красиво. Надо сделать так что бы игроку казалось что птичка летит все дальше и дальше. Для этого надо что бы тучки двигались на встречу птице(тоесть справа на лево) с меньшей скоростью.
Как это сделать? Ну во первых и дураку ясно что тучки тоже летят во времени. Значит то что мы напишем будет в середине цикла по псевдо времени. Вы скажите если это движение значит мы должны написать цикл. И тут вы ошиблись. Если написать наш цикл после первого цикла тогда сначало выполнится первый цикл а уж потом второй. Тоесть сначало птичка пролетит от правого края до левого а уж только потом тучка сдвинется с места. Если перед тогда наоборот. А если внутри вложеного(внутреннего) цыкла тогда вообще полный бред начнется. Короче надо без цикла.
Во первых надо ввести величины x2,x3,x4,x5 формата integer. Они будут горизонтальними координатами соответствующих image тоесть тучек. Код будем писать внутри внутренего(вложеного) цыкла тоесть вот тут:
while (x<=800) and (shot>=0) do
begin

<=
end;
Что бы придумать код нам нужно понять что мы хотим от тучки. А хотим мы вот что. Возьмем первую тучку(image2) с координатой x2. Если тучка не зашла за левий край который имеет координату 0 (if Image2.Left>=0) тогда(then) двигаем тучку справа на лево на один пиксель(begin x2:=x2-1; Image2.Left:=x2; end). В противном случае телепортируем тучку назад на првый край который имеет координату 800
(else begin x2:=800; Image2.Left:=x2; end;). В итоге у вас должновыйти такое:
if Image2.Left>=0 then
begin
x2:=x2-1;
Image2.Left:=x2;
end
else
begin
x2:=800;
Image2.Left:=x2;
end;
Пишите под этим внизу аналогичную вещь для: image3 и x3, image4 и x4, image5 и x5.
Ой чуть не забыл если вы так сделаете тогда они собьются в одну кучу и будут лететь в месте. Перед полетом их надо по раставлять на форме в разних местах с помощью кода. Короче надо для иксов тучек после строки shot:=2000; но перед циклом присвоить начальные значения. Например:
x2:=88;
x3:=272;
x4:=464;
x5:=648;

Добавлено (11.10.2011, 14:36)
---------------------------------------------
Шаг 7. Псевдо анимация.
В Дэлфи есть обьект с помощью которого можно вставить видео без звука. Но мы этим элементом не возпользуемся. Почему узнаете позже. Мы сами сделаем анимацию. Что такое анимация? Примитивно говоря это кадры которые бысто идут друг за другом. У нас есть два рисунка: птичка подняла крылышки и птичка опустила крылишки. Если их поочередно загружать в image1 то создастся эфект как будто она действительно махает крыльями. Но вот проблема как указывать програме когда загружать одну картинку а когда другую да ище и поочередно. Выход оказался гениально прост - использовать свойства чисел.
И так введите еще одну глобальную величину img формата integer. это типа от слова image. После while shot>=0 do begin но перед while (x<=800) and (shot>=0) do присвоим ей начальное значение: img:=1;. А в середине цыкла который под этой строчкой пропишем:img:=img+1;. Тоесть у нас есть величина и мы ее увиличиваем. А дальше пишем такое. Если наша величина парное число тоесть делится на два без остачи тогда мы загружаем в image1 одну картинку в противном случае - другую:
if img mod 2 =0 then
begin
Image1.Picture.LoadFromFile('C:\Users\Ñëàâà\Desktop\Íîâàÿ ïàïêà (2)\Ptichka1.bmp');
end
else
begin
Image1.Picture.LoadFromFile('C:\Users\Ñëàâà\Desktop\Íîâàÿ ïàïêà (2)\Ptichka2.bmp');
end;

А теперь запустите програму и почувствуйте себя крутым перцем.

Добавлено (11.10.2011, 15:12)
---------------------------------------------
Шаг 8. Регулировка времени или уровни сложности.
Вот вы смотрите на птичку и вам нравится как она летит. Но это субьективное мнение. Для кого то это слишком медленно а для кого то - быстро. Создадим уровни сложности: "Новичок"(летает медленно), "Любитель", "Профессионал"(Летает быстро).
Выберите ComboBox1 который на panel1. Найдите параметр items, клацните по полю справа, клацните по троеточию и перед вами появится окошко. Введите "Новичок", клацните Энтэр, "Любитель", клацните Энтэр, "Профессионал", клацните Ок. Каждая строка имеет свой номер(itemindex). Нумерация начинается с нуля. Найдите параметр itemindex и поставте значение 0. После этого в ComboBox1 по умолчанию выбрана первая строка(Новичок).
Что бы изменять скорость игры на до изменять величину которая стоит в sleep(). Введите новую величину zad формата integer. В строчке sleep(50)вместо 50 напишите zad. Выберете ComboBox1 и два раза клацните на него. Перед вами появится функцыя выполнения действий после изменение строчки. Теперь думаем если мы выбрали первую строчку тоесть номер строчки равно 0 тогда наш zad имеет одно значение. Если номер строчки равно 1 тогда наш zad имеет другое значение. А если 2 тогда третье. Короче вот так:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex=0 then
begin
zad:=50;
end;
if ComboBox1.ItemIndex=1 then
begin
zad:=40;
end;
if ComboBox1.ItemIndex=2 then
begin
zad:=30;
end;
end;

Но возникает проблема. При переключении будет быстрее двигатся не только птица а и псевдо время. Его можна замедлить уменьшывшы величину на которое оно уменьшается. Поэтому вводим новую величину shag формата real. В строчке shot:=shot-1; вместо 1 пишем shag. Мы знаем что при меньшем zad надо взять меньший shag. Но насколько меньшый? Если взять за ориентир первое значение тогда так. Во сколько раз второй zad меньшый чем первый во столько же второй shag меньшый чем первый. Короче по соотношению. Я над таким не заморачивался. Я написал цыфры от фонаря и у меня вышло вот такое:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex=0 then
begin
zad:=50;
shag:=1;
end;
if ComboBox1.ItemIndex=1 then
begin
zad:=40;
shag:=0.8;
end;
if ComboBox1.ItemIndex=2 then
begin
zad:=30;
shag:=0.5;
end;
end;

Нету добра без худа возникает вторая проблема. Если вы не выберете уровень и сразу нажмете "Новая игра" тогда то что мы написали несрабатывает. Почему? Да потому что оно будет работать только после смены строки в ComboBox1. А нам нужно что бы оно работало сразу после открытия програмы(создания формы). Ну так тогда скопируйте этот код и идите в функцию виполнения действий сразу после создания формы(два раза клацните по форме). В ставте этот код туда. И все заработает как надо.

Добавлено (11.10.2011, 15:32)
---------------------------------------------
Шаг 9. Попадание - очки
Думаю вы уже догадались что надо ввести новую величину. Правильно. Введите ochk формата integer.
Только запускается програма(создается форма) как количество очков должно выставится на ноль. Вот и идите в эту функцыю(два раз клацните по форме) и напишите:ochk:=0;.
Теперь думаем что такое попадание? Это когда наш курсор находится на птичке(image1) и мы нажымаем на нее(ведь что бы выстрелить надо нажать на левую клавишу мышки). Тогда думаю что вы догадались второй раз: нам нужна функция выполнения действий после нажатия на image1. Для этого выберите его и нажмите два раза. Дальнейшые действия будут происходить в:
procedure TForm1.Image1Click(Sender: TObject);
begin

end;

Что мы должны сделать с очками при попадании? Увеличить их на единицу. Тогда так и напишите:ochk:=ochk+1;. Дальше выводим очки на лабле тоесть переименовуем его. Думаю вы это уже умеете делать:Label4.Caption:=;. Мы не можем дальше написать просто ochk. Потому что ochk в формате integer а записывать величину можно только в формате string. Мы должны перевести величину с одного формата в другой. В итоге у вас выйдет:Label4.Caption:=inttostr(ochk);. Все получилось.

Добавлено (11.10.2011, 15:46)
---------------------------------------------
Шаг 10. Попадание - рекорд
Значение рекорда у нас должно где то хранится. Экзешка это не записная книжка там нельзя хранить. Хранить надо в каком то файлике. Поэтому создайте через блокнот 1.txt инапишите туда "0". Файлик вложите в папку с игрой. Добавте к глобальным величинам следущие:
f: TextFile;
a: extended;

Вот вам код и обьяснения:

procedure TForm1.Image1Click(Sender: TObject);
begin
ochk:=ochk+1;
Label4.Caption:=inttostr(ochk);
AssignFile(f, '1.txt');
<= Ассоцыируем величину которая отвечяет за файл с самим файлом.
reset(f); <=Открываем файл только для чтения.
read(f, a); <= Читаем файл и то что прочитали присваеваим величине "а".
if ochk>a then
begin

CloseFile(f); <= Закрыли файл.
a:=ochk;
rewrite(f); <=Открыли для перезаписи.
write(f, a: 8: 0);[/b] <=Записуем в файл даные величины "а"
CloseFile(f);
reset(f);
read(f, a);
Label6.Caption:=floattostr(a);
CloseFile(f);
end
else CloseFile(f);
end;

end;

Добавлено (11.10.2011, 15:48)
---------------------------------------------
Все прога готова. Если вам понравилось работать в Дєлфи тогда пишите и мы с вами попробуем сделать 2d платформер "Спаси свою задницу". Удачи вам игроделы. smile

Добавлено (12.10.2011, 17:30)
---------------------------------------------
Мда, Дэлфа никому не интересна.

Сообщение отредактировал: Арахис - Вторник, 11.10.2011, 14:17
Filinshein Дата: Среда, 12.10.2011, 17:43 | Сообщение # 9
Просмотр профиля: Filinshein

Сообщений: [2126]
Я не работаю с делфинарием)))

Но статья написана хорошо, молодец.
Арахис Дата: Среда, 12.10.2011, 18:05 | Сообщение # 10
Просмотр профиля: Арахис

Сообщений: [99]
Ну спасибо. Просто захотелось как то оживить этот раздел. Но на форумчян я не жалуюсь потому что все таки этот сайт называется "Создание игр без программирования".
Форум разработчиков игр » Программирование » Delphi, Pascal, ObjectPascal » Создание 2d стрелялки "Замочить птичку" шаг за шагом. (Для тех кто помнит Паскаль со школы.)
Страница 1 из 11
Поиск:

При полном или частичном копировании материалов сайта ссылка на Make-Games.ru обязательна. Make-Games.ru © 2008 - 2016 Хостинг от uWeb
Топ Разработка игр Рейтинг@Mail.ru