Государственное бюджетное
образовательное учреждение среднего
профессионального образования (ССУЗ)
«Челябинский колледж информационно-промышленных
технологий и художественных промыслов»
ПЦК «Информационных технологий»
КУРСОВАЯ
РАБОТА
по междисциплинарному
курсу прикладное программирование
Тема: Создание игрового приложения
«Samolet» в среде разработки Lazarus
Выполнил:
Студент группы
320
Мирошкин Андрей
Сергеевич
«____»_______________2014_г.
Проверил:
Исакова Виктория
Викторовна
«____»_______________2014__г.
Работа защищена
«____»_______________2014__г.
с оценкой ___________________
Челябинск 2014г.
Оглавление
Введение
Lazarus — бесплатная среда разработки
программного обеспечения с открытым
исходным кодом для компилятора Free Pascal
(часто используется сокращение FPC— свободно
распространяемый компилятор языка программирования
Pascal) на языке Object Pascal. Интегрированная
среда разработки предоставляет возможность
кроссплатформенной разработки приложений
в Delphi-подобном окружении. На данный момент
является единственным инструментом быстрой
разработки приложений (RAD), позволяющим
Delphi-программистам создавать приложения
с графическим интерфейсом для Linux (и других
не-Windows) систем.
Структура проекта Lazarus
Любой проект в Lazarus – это
совокупность файлов, из которых создается
единый выполняемый файл. В простейшем
случае список файлов проекта имеет вид:
- файл описания проекта (.lpi);
- файл проекта (.lpr);
- файл ресурсов (.lrs);
- модуль формы (.lfm);
- программный модуль (.pas);
После компиляции программы
из всех файлов проекта создается единый
выполняемый файл, имя этого файла совпадает
с именем проекта.
Программный модуль, или просто
модуль, – это отдельно компилируемая
программная единица, которая представляет
собой набор типов данных, констант, переменных,
процедур и функций. Любой модуль имеет
следующую структуру:
unit имя_модуля; //Заголовок
модуля
Interface //Раздел описаний
Implementation //Раздел реализаций
end. //Конец модуля
Заголовок модуля – это зарезервированное
слово unit, за которым следует имя модуля
и точка с запятой.
В разделе описаний, который
открывается служебным словом interface, описывают
программные элементы – типы, классы,
процедуры и функции:
interface
uses список_модулей;
type список_типов;
const список_констант;
var список_переменных;
procedure имя_процедуры;
…
function имя_функции;
…
Раздел implementation содержит
программный код, реализующий механизм
работы описанных программных элементов
(тексты процедур обработки событий, процедуры
и функции, созданные программистом). Процедуры
и функции в Lazarus также построены по модульному
принципу.
Целью данной курсовой
работы является разработать
в программе Lazarus приложение:
Для реализации приложения
необходимо решить следующие задачи:
Составить блок-схему приложения
Разработать приложение
Требования к приложению:
В приложение может играть только
1 пользователь. Приложение требует наличие
устройств ввода/вывода.Управление производится
стрелками и клавишей пробел, клавиша
пробел отвечает за выстрел.
Минимальные системные требования
к игре:небольшой размер игры,поддержка
почти на всех операционных системах,
дополнительное программное обеспечение
не требуется.
Описание
Разработка игрового приложения
Samoletik для ПК, с удобным пользовательским
интерфейсом. В игре выполняются следующие
функции: самолет движется по определенной
траектории и уничтожает летящих ему навстречу
объекты –самолеты , за каждый сбитый
самолет даются определенные очки, также
если попадают в самолет игрока , то шкала
здоровья убавляется,если у игрока заканчивается
здоровье, выводится сообщение "ты проиграл
", также существует несколько уровней
игры , если игрок набрал определенное
количество очков, то он автоматически
переходит на 2 уровень(level2).
Методы и процедуры, использованные
в программе
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Shape2: TShape;
Timer1: TTimer;
Timer2: TTimer;
Timer3: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key:
Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Draw;
procedure NewGame;
procedure GameOver;
procedure Sound(sound0 : String);
procedure Exploding(x0,y0 : Integer; bitmap0 :
array of TBitmap; frames0 : Integer);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
Создаем форму, переменные
и массивы:
var
Form1: TForm1;
Player : TPlayer;
Ground : array [1..3] of TGround;
Bullet : array [1..100] of TBullet;
EnBullet : array [1..100] of TEnBullet;
Sky : array [1..2] of TSky;
Explode : array [1..100] of TExplode;
Enemy0 : array [1..100] of TEnemy;
Enemy1 : array [1..100] of TBigEnemy;
Boat : array [1..100] of TBoat;
Level_Up : array [1..4] of TLevel_Up;
PPic, GPic, ExPic, BExPic, EnPic0, EnPic1, EnPic2, EnPic3,
BEnPic0 , BEnPic1: array of TBitmap;
BPic, SPic, EnBPic0, EnBPic1, LPic : TBitmap;
MovL, MovR, Firing : Boolean;
Shoot : Boolean;
Interval : Integer;
Health : Integer; // Player's health
Score : Integer;
Level : Integer;
TImage - отображает графическое изображение
на форме. Воспринимает форматы BMP, ICO, WMF.
Если картинку подключить во время дизайна
программы, то она прикомпилируется к
EXE файлу.
Этот компонент доступен из
модуля EXTCTRLS, и находится на странице Палитры
компонентов Additional.
Этот компонент служит надстройкой
над классом TPicture и замыкает всю иерархию
графических объектов VCL. Он предназначен
для показа на форме изображения: битовой
карты (TBitmap), метафайла (TMetafile), значка (TIcon).
Свойство (Pb) property Picture: TPicture;
служит контейнером для графического
объекта одного из перечисленных классов.
В качестве канвы используется
канва объекта Picture. Graphic — только если
поле Graphic ссылается на объект класса TBitmap:
(Pb) property Canvas: TCanvas;
Если это не так, то попытка
обращения к свойству вызовет исключительную
ситуацию EInvalidOperation, так как рисовать на
метафайле или значке нельзя.
Следующие три свойства определяют,
как именно Tpicture располагается в рабочей
области компонента:
(Pb) property AutoSize: Boolean;
— означает, что размеры компонента
настраиваются по размерам содержащегося
в нем графического объекта. Устанавливать
его в True нужно перед загрузкой изображения
из файла или буфера обмена;
(Pb) property Stretch: Boolean;
— если это свойство установлено
в True, то изображение "натягивается"
на рабочую область, при необходимости
уменьшая или увеличивая свои размеры.
Если оно установлено в False, то играет роль
следующее свойство;
(Pb) property Center: Boolean;
— если это свойство установлено
в True, изображение центрируется в пределах
рабочей области. В противном случае —
располагается в ее верхнем левом углу.
Код программы:
Модуль
формы:
Main.lfm:
object Form1: TForm1
Left = 526
Height = 650
Top = 237
Width = 600
BorderStyle = bsDialog
Caption = 'Form1'
ClientHeight = 650
ClientWidth = 600
Color = clInactiveCaption
OnCreate = FormCreate
OnKeyDown = FormKeyDown
OnKeyUp = FormKeyUp
OnPaint = FormPaint
Position = poDesktopCenter
LCLVersion = '1.0.6.0'
object Image1: TImage
Left = 0
Height = 600
Top = 50
Width = 600
Align = alCustom
end
object Label1: TLabel
Left = 8
Height = 20
Top = 14
Width = 53
Caption = 'Health'
Font.Height = -16
ParentColor = False
ParentFont = False
end
object Shape2: TShape
Left = 64
Height = 19
Top = 16
Width = 100
Brush.Color = clRed
Pen.Style = psClear
end
object Label2: TLabel
Left = 528
Height = 20
Top = 14
Width = 53
Caption = 'Level: '
Font.Height = -16
ParentColor = False
ParentFont = False
end
object Timer1: TTimer
Interval = 25
OnTimer = Timer1Timer
left = 360
top = 16
end
object Timer2: TTimer
Interval = 2000
OnTimer = Timer2Timer
left = 392
top = 16
end
object Timer3: TTimer
Interval = 15000
OnTimer = Timer3Timer
left = 424
top = 16
end
end
Модуль
Game:
Game:
unit game;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Graphics;
type
{ TBase }
TBase = class (TObject)
private
x : Integer;
y : Integer;
public
function getX : Integer;
function getY : Integer;
end;
{ TAnimate }
TAnimate = class (TBase)
private
bitmap : array [0..100]
of TBitmap;
frame : Integer;
maxframe : Integer;
public
Constructor Create(x0,y0
: Integer; bitmap0 : array of TBitmap;
maxframe0
: Integer);
function getBitmap
: TBitmap;
procedure nextFrame;
end;
{ TStatic }
TStatic = class (TBase)
private
bitmap : TBitmap;
public
Constructor Create(x0,y0
: Integer; bitmap0 : TBitmap);
function getBitmap : TBitmap;
end;
{ TPlayer }
TPlayer = class (TAnimate)
private
speed : Integer;
public
Constructor Create(x0,y0
: Integer; bitmap0 : array of TBitmap; maxframe0 : Integer);
procedure moveLeft;
procedure moveRight;
procedure move;
end;
{ TGround }
TGround = class (TAnimate)
private
speed : Integer;
public
Constructor Create(x0,y0
: Integer; bitmap0 : array of TBitmap; maxframe0 : Integer);
procedure move;
procedure resp;
end;
{ TBullet }
TBullet = class (TStatic)
private
speed_H : Integer;
public
Constructor Create(x0,y0
: Integer; bitmap0 : TBitmap; speed_H0 : Integer);
procedure move;
//function getBitmap
: TBitmap; end;
{ TEnBullet }
TEnBullet = class (TBullet)
private
hor : Integer;
damage : Integer;
public
Constructor Create(x0,y0
: Integer; bitmap0 : TBitmap; hor0, damage0 : Integer);
procedure move;
function getDamage
: Integer;
end;
{ TSky }
TSky = class (TStatic)
public
procedure move;
end;
{ TExplode }
TExplode = class (TAnimate)
procedure nextFrame;
function getFrame : Integer;
function getMaxFrame : Integer;
end;
{ TEnemy }
TEnemy = class (TAnimate)
private
speed : Integer;
shoot1 : Integer;
public
procedure move;
procedure setSpeed(speed0
: Integer);
procedure resetShoot;
function getShoot
: Integer;
end;
{ TBigEnemy }
TBigEnemy = class (TEnemy)
private
health : Integer;
public
Constructor Create(x0,y0
: Integer; bitmap0 : array of TBitmap; maxframe0 : Integer);
procedure setHealth(health0
: Integer);
function getHealth
: Integer; end;
TBoat = class (TBigEnemy)
end;
{ TLevel_Up }
TLevel_Up = class (TStatic)
public
procedure move;
end;
function EnShooting(x1, y1, x2, y2: Integer):
Integer;
function RoundEx(r : real) : integer;
implementation
{ TStatic }
constructor TStatic.Create(x0, y0: Integer; bitmap0:
TBitmap);
begin
x := x0;
y := y0;
bitmap := bitmap0;
end;
function TStatic.getBitmap: TBitmap;
begin
Result := bitmap;
end;
{ TAnimate }
constructor TAnimate.Create(x0, y0: Integer; bitmap0:
array of TBitmap;
maxframe0: Integer);
begin
x := x0;
y := y0;
bitmap := bitmap0;
maxframe := maxframe0;
//SetLength(bitmap,maxframe);
frame := 0;
end;
function TAnimate.getBitmap: TBitmap;
begin
Result := bitmap[frame];
end;
procedure TAnimate.nextFrame;
begin
if frame < maxframe then frame := frame
+ 1
else frame := 0;
end;
{ TBigEnemy }
constructor TBigEnemy.Create(x0, y0: Integer; bitmap0:
array of TBitmap;
maxframe0: Integer);
begin
inherited;
health := 40;
end;
procedure TBigEnemy.setHealth(health0: Integer);
begin
health := health0;
end;
function TBigEnemy.getHealth: Integer;
begin
Result := health;
end;
{ TLevel_Up }
procedure TLevel_Up.move;
begin
y := y + 5; end;
{ TEnBullet }
constructor TEnBullet.Create(x0, y0: Integer; bitmap0:
TBitmap; hor0,
damage0: Integer);
begin
x := x0;
y := y0;
bitmap := bitmap0;
hor := hor0;
damage := damage0;
end;
procedure TEnBullet.move;
begin
y := y + 5;
x := x + hor;
end;
function TEnBullet.getDamage: Integer;
begin
Result := damage;
end;
function RoundEx(r : real) : integer;
var f : real;
begin
f := Frac(r);
If f = 0.5 then f := r + 0.1;
If f = -0.5 then f := r - 0.1;
Result := round(f);
end;
function EnShooting(x1, y1, x2, y2: Integer): Integer;
var x0,y0 : Integer;
begin
y0 := y1 + 5;
{
x0 := Round(((x1-x2)*y0 + (x2*y1 - x1*y2))/(y1
- y2));}
x0 := Round((x2*y1-x1*y2+x1*y0-x2*y0)/(y1-y2));
if x0 > x1 then
Result := x0 - x1
else
Result := -(x1 - x0);
end;
{ TEnemy }
procedure TEnemy.move;
begin
y := y + speed;
if shoot1 < 200 then shoot1 := shoot1 +
1