Если нажата ЛКМ и мы находимся в нужной части экрана



 if (mb=1) and (x<100) then

Begin

c:=f.GetPixel(x,y); // считывание цвета этой точки

SetPenColor(c); // установка цвета в обводку рисуемой фигуры (линии или кружка)

end;                    

end;

 

// главная часть программы

Begin

SetWindowSize(458,343); // создаём окно 458х343

 

// обработка нажатий мыши

OnMouseDown := MouseDown;

OnMouseMove := MouseMove;

OnMouseUp := MouseUp;

 

// загружаем задний фон и рисуем его

f:=Picture.Create('background.png');

f.Draw(0,0);

 

end.

Игра Doodle jump

Предварительно посмотрим тип данных "запись" (record) - он нам тут пригодится. В него можно объединять данные с разными типами данных. Если ты изучал объектно-ориентированные языки, то там были классы. Или структуры- так вот, это как раз и есть структура.

Например, я создам структуру, которая будет хранить имя человека и его возраст:

type human = record

 name : string;

 age : integer;

end;

Структуру я назвал "человек" - это наш новый тип данных. И я могу создавать уже переменную с таким типом, например:

var p : human;

И присваивать значения так:

p.age := 25;

p.name := 'Петя';

Это нужно чтобы было удобнее работать с разносортными типами данных- в массив их не засунешь, но зато можно сделать такую вот вещь как структура- только в pascalABC это называется запись (record). Можно сделать даже массив таких записей.

...

Теперь сам код игры:

uses graphABC;

 

// тип данных- точка (хранит координаты)

type point = record

 x,y:integer;

end;

 

// поле объявления переменных

Var

pers, plat, bg: Picture; // картинки для персонажа, платформы и заднего фона (background)

i,h,x,y,Left,Right:integer; // вспомогательные переменные

dx,dy:real; // изменение координат или скорость

mass: array [1..10] of point; // массив точек для вывода платформ

 

// клавиша клавиатуры нажата

procedure KeyDown(Key:integer);

Begin

 if key=vk_Left then Left:=1; // если нажата левая клавиша то в переменную Left заложить 1

 if key=vk_Right then Right:=1; // если правая

end;

 

// клавиша клавиатуры отпущена (чтобы персонаж перестал двигаться)

procedure KeyUp(Key:integer);

Begin

 if key=vk_Left then Left:=0;

 if key=vk_Right then Right:=0;

end;

 

 

Begin

SetWindowSize(400,533); // создание окна

LockDrawing; // для избегания мигания при анимации

OnKeyDown := KeyDown; // ожидание нажатия клавиши ВНИЗ

OnKeyUp := KeyUp; // ВВЕРХ

 

x:=100; y:=100; h:=200; // начальные значения

 

// загрузка картинок из файлов

bg :=Picture.Create('background.bmp');

plat:=Picture.Create('platform.bmp');

pers:=Picture.Create('pers.bmp');

pers.Transparent:=true; // сделать картинку персонажа прозрачной

 

// для проставления 10 платформ в случайных местах экрана

for i:=1 to 10 do begin

 mass[i].x:=random(400);

 mass[i].y:=random(533);

end;

 

// бесконечный цикл (главный цикл игры)

while True do

Begin

 if Left=1 then x:=x-1; // если была нажата левая, то уменьшаем координату х

 if Right=1 then x:=x+1;

 

 dy:=dy+0.1; // свободное падение

 y:=y+round(dy);

 if y>500 then dy:=-7; // если достигли пола, дать скорость вверх- будет будто прыжок

 

 

// если достигли некой высоты

 if y<h then

for i:=1 to 10 do begin

y:=h; // останавливаем персонажа на этой высоте

 

// платформы опускаем

mass[i].y:=mass[i].y-round(dy);

 

 // если платформа уехала вниз за экран

if (mass[i].y>533) then begin

  mass[i].y:=0; 

  mass[i].x:=random(400); 

  end;

end;

 

// обработка столкновения с платформами

 for i:=1 to 10 do

if (x+50>mass[i].x) and (x+20<mass[i].x+68) and (y+60>mass[i].y)

and (y+60<mass[i].y+14) and (dy>0) then dy:=-7;

 

 bg.Draw(0,0); // отрисовка фона

 

// отрисовка платформ

 pers.Draw(x,y);

 for i:=1 to 10 do

plat.Draw(mass[i].x,mass[i].y);

 

 redraw; // перерисовка- для избегания мигания при анимации

 sleep(2); // задержка 2 миллисекунды (чтобы был эффект анимации, т.к. компьютер делает всё быстро)

 end;

 

end.

 

Игра Арканоид

Общие принципы уже похожи с предыдущей игрой, поэтому просто вставим код и разберём его:

uses GraphABC; // подключаем графический модуль

 

// поле объявления переменных

Var

mass: array [0..11,0..11] of integer;

pic: array [0..15] of Picture;

x,y,i,j,n,Left,Right,padX:integer; // padX- координата дощечки, которая отбивает мяч

sizeX,sizeY:integer; // размеры блока кирпичика

dx,dy:real;

 

// проверка столкновения мяча и блока

function check():integer;

var i,j:integer;

Begin

check:=0;

for i:=(x div sizeX) to ((x+12) div sizeX) do

for j:=(y div sizeY) to ((y+12) div sizeY) do

if (i<11) and (j<11) then

if mass[i,j]<>0 then

   begin mass[i,j]:=0; check:=1; end;

end;

 

// процедуры нажатия клавиш

procedure KeyDown(Key:integer);

Begin

 if key=vk_Left then Left:=1;

 if key=vk_Right then Right:=1;

end;

 

procedure KeyUp(Key:integer);

Begin

 if key=vk_Left then Left:=0;

 if key=vk_Right then Right:=0;

end;

 

Begin

// значения по умолчанию

sizeX:=32; sizeY:=20;

SetWindowSize(384,450);

x:=200; y:=400;

dx:=3; dy:=2;

padX:=100;

 

LockDrawing;

OnKeyDown:=KeyDown;

OnKeyUp:=KeyUp;

 

// хранение блоков (которые мы будем сбивать мячиком)

for i:=1 to 10 do

 for j:=1 to 10 do

mass[i,j]:=1;

 

// узор из разного цвета блоков

mass[2,2]:=2;

mass[9,2]:=2;

mass[2,9]:=2;

mass[9,9]:=2;

 

// загружаем картинки

pic[0]:=Picture.Create('images/background.png');

pic[7]:=Picture.Create('images/paddle.png');

pic[6]:=Picture.Create('images/ball.png');

pic[6].Transparent:=true;

 

// отрисовка блоков

for i:=1 to 5 do

 pic[i]:=Picture.Create('images/block'+i.ToString()+'.png');

   

  

while True do

Begin

// движение мячика ( dx,dy- скорости по той или иной координате)

x:=x+round(dx);

if check=1 then dx:=-dx; // отскакивание если налетели на стенку или пол

y:=y+round(dy);

if check=1 then dy:=-dy;

 

if (x<0) or (x>390) then dx:=-dx;

if (y<0) or (y>450) then dy:=-dy;

 

if Right=1 then padX:=padX+3;

if Left=1 then padX:=padX-3;

  

if (y>425) and (x>padX) and (x<padX+80) then dy:=-(random(3)+2);

 

// отрисовка фона, мячика и дощечки

pic[0].draw(0,0); 

pic[7].draw(padX,435);

pic[6].Draw(x,y);

for i:=1 to 10 do

for j:=1 to 10 do

if mass[i,j]<>0 then pic[mass[i,j]].Draw(i*sizeX, j*sizeY);

 

Redraw;

sleep(5);

 end;  

  

end.

 

 

Модуль векторной графики

Векторная графика состоит из сплошных фигур- сколько бы мы ни увеличивали, это будут такие же фигуры, т.е. рисунок состоит из сплошных безразмерных прямых, кругов и т.д.

uses ABCObjects;

begin

// тут будет программа

end.

Теперь что мы можем в этом модуле делать, т.е. команды. Фигуры мы создаём тут как типы данных. Ниже я создам прямоугольник и круг, точнее выделю для них переменные:

Var

a : rectangleABC;

b : circleABC;

Далее на скриншоте показано как эти фигуры создавать уже- всплывает подсказка, по которой можно понять что тут за параметры.

Остаётся только запустить и фигуры будут уже нарисованы. Чтобы использовать цвета, можно подключить ещё graphabc- потому что стандартные цвета типа clRed тут не работают.

Можно например поменять ширину прямоугольника: a.Width := 250;

Действует тут всё по принципам объектно-ориентированного программирования. Фигуры это классы (структуры), а ширина, высота и т.д. это атрибуты класса, пишутся они через точку.

Вот тут я создал ещё круг и переместил его в новые координаты:

b:= new circleABC(100,150,20);

b.MoveTo(40,70);

Внутри прямоугольника я могу написать какой-нибудь текст, а внутри круга число:

a.text := 'Привет!';

b.Number := 15;

Если фигуры пересекаются, какую-то из них можно перенести на передний план. Например, круг:

b.ToFront();

Проверить пересечение можно с помощью метода intersect(). Например, если круг пересекается с прямоугольником, я выведу что пересекаются. Если нет, то нет:

if b.Intersect(a) then write('Пересекается') else write('НЕТ');

 

________________________________________________________________________

Раздел 3. Стандартные окна ОС Windows

Как создать окно

В этом разделе на примере программы "калькулятор" мы посмотрим как создавать приложения со стандартными окнами операционной системы Windows (что в переводе тоже "окна" - интересная тавтология). Для этого при создании нового проекта в pascalABC нужно выбрать уже Windows Forms.

Файл -> Новый проект -> Приложение Windows Forms и жмём ОК

...

Открылся редактор. У него 2 вкладки: дизайнер и код. В дизайнере мы будем видеть форму, а в коде- ну понятно что- собственно сам код всего этого добра.

Вот так выглядит код:

Unit Unit1;

 

Interface

uses System, System.Drawing, System.Windows.Forms;

 

Type

Form1 = class(Form)

{$region FormDesigner}

Private

{$resource Unit1.Form1.resources}

{$include Unit1.Form1.inc}

{$endregion FormDesigner}

Public

constructor;

Begin

InitializeComponent;

end;

end;

 

Implementation

end.

 

Слева есть палитра- оттуда ты можешь легко как в конструкторе добавлять всякие кнопки и прочее- это называется "стандартные элементы управления". Там же есть контейнеры, меню и т.д.

Справа в инспекторе объектов мы можем управлять всеми этими добавляемыми элементами.

У тебя сразу же создалось 2 файла. Файл формы ты видишь перед собой. Главный же выглядит так:

uses Unit1;

 

Begin

System.Windows.Forms.Application.EnableVisualStyles();

System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

System.Windows.Forms.Application.Run(new Form1)

end.

..... ...... .....

Добавим, например, кнопку и текст. И чтобы при нажатии на эту кнопку выводился какой-то текст. Кнопка это button, текст- label.

Щёлкаем дважды по кнопке и попадаем в код этой кнопки. И то что мы там напишем, будет выполняться при нажатии этой кнопки.

Мы хотим изменить текст, тогда пишем:

label1.Text:= 'Привет!';

И запускаем программу, нажимаем на кнопку и убеждаемся что всё работает.

...

Можно изменить параметры кнопки с помощью инспектора справа, там можно видеть то что мы можем сделать.

Можно также все эти параметры прописывать в коде. Например, нажмём на label1 и посмотрим какие у неё есть параметры. Я хочу например чтобы при нажатии кнопки у меня в этой метке (label1) менялся задний фон (backcolor). Двойным нажатием ЛКМ на кнопку попадаю в код. Прописываю:

 label1.BackColor := color.Blue;

Аналогично можно изучить остальные настройки, их там очень много. Часть из них будет рассмотрено в программе "калькулятор" в следующей главе.

 

Программа калькулятор

Сначала мы в форме рисуем поля и кнопки- кнопки с цифрами, поле для ввода-вывода- выглядеть это всё будет как-то так:

Далее для каждой кнопки нужно прописать то что она делает. Например, если мы нажмём на циферные кнопки, код там будет такой:

textbox1.Text+='4'; // это для цифры 4

И для других кнопок тоже:

 

a:=StrToInt(textbox1.Text);

textbox1.Text:='';

s:='+'; // для кнопки +


 b:=StrToInt(textbox1.Text); // для кнопки =

 if s='+' then res:=a+b;

 if s='-' then res:=a-b;

 textbox1.Text:=IntToStr(res);

Это калькулятор простейший, работает он коряво, но в качестве примера сойдёт.

...

Вот такой будет код всего файла Unit1.pas

Unit Unit1;

 

Interface

uses System, System.Drawing, System.Windows.Forms;

 

Type

Form1 = class(Form)

procedure button1_Click(sender: Object; e: EventArgs);

procedure button2_Click(sender: Object; e: EventArgs);

procedure button3_Click(sender: Object; e: EventArgs);

procedure button10_Click(sender: Object; e: EventArgs);

procedure button4_Click(sender: Object; e: EventArgs);

procedure button5_Click(sender: Object; e: EventArgs);

procedure button6_Click(sender: Object; e: EventArgs);

procedure button7_Click(sender: Object; e: EventArgs);

procedure button8_Click(sender: Object; e: EventArgs);

procedure button9_Click(sender: Object; e: EventArgs);

procedure button15_Click(sender: Object; e: EventArgs);

procedure button12_Click(sender: Object; e: EventArgs);

procedure toolStripMenuItem2_Click(sender: Object; e: EventArgs);

procedure toolStripMenuItem3_Click(sender: Object; e: EventArgs);

procedure toolStripMenuItem8_Click(sender: Object; e: EventArgs);

procedure button14_Click(sender: Object; e: EventArgs);

procedure button11_Click(sender: Object; e: EventArgs);

procedure textBox1_TextChanged(sender: Object; e: EventArgs);

{$region FormDesigner}

Private

{$resource Unit1.Form1.resources}

button1: Button;

button2: Button;

button3: Button;

button4: Button;

button5: Button;

button6: Button;

button7: Button;

button8: Button;

button9: Button;

button10: Button;

button11: Button;

button12: Button;

button14: Button;

textBox1: TextBox;

menuStrip1: MenuStrip;

toolStripMenuItem1: ToolStripMenuItem;

toolStripMenuItem2: ToolStripMenuItem;

toolStripMenuItem3: ToolStripMenuItem;

toolStripMenuItem5: ToolStripMenuItem;

toolStripMenuItem6: ToolStripMenuItem;

toolStripMenuItem7: ToolStripSeparator;

toolStripMenuItem8: ToolStripMenuItem;

toolStripMenuItem9: ToolStripMenuItem;

toolStripMenuItem10: ToolStripMenuItem;

button15: Button;

{$include Unit1.Form1.inc}

{$endregion FormDesigner}

Public

constructor;

Begin

InitializeComponent;

end;

end;

 

Implementation

var a,b,res:integer; s:string;

 

 

procedure Form1.button1_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='1';

end;

 

procedure Form1.button2_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='2';

end;

 

procedure Form1.button3_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='3';

end;

 

procedure Form1.button10_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='0';

end;

 

procedure Form1.button4_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='4';

end;

 

procedure Form1.button5_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='5';

end;

 

procedure Form1.button6_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='6';

end;

 

procedure Form1.button7_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='7';

end;

 

procedure Form1.button8_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='8';

end;

 

procedure Form1.button9_Click(sender: Object; e: EventArgs);

Begin

textbox1.Text+='9';

end;

 

 

procedure Form1.button15_Click(sender: Object; e: EventArgs);

Begin

a:=StrToInt(textbox1.Text);

textbox1.Text:='';

s:='+';

end;

 

 

procedure Form1.button12_Click(sender: Object; e: EventArgs);

Begin

b:=StrToInt(textbox1.Text);

if s='+' then res:=a+b;

if s='-' then res:=a-b;

textbox1.Text:=IntToStr(res);

end;

 

 

procedure Form1.toolStripMenuItem2_Click(sender: Object; e: EventArgs);

Begin

end;

 

procedure Form1.toolStripMenuItem3_Click(sender: Object; e: EventArgs);

Begin

end;

 

procedure Form1.toolStripMenuItem8_Click(sender: Object; e: EventArgs);

Begin

form1.ActiveForm.Close();

end;

 

procedure Form1.button14_Click(sender: Object; e: EventArgs);

Begin

a:=StrToInt(textbox1.Text);

textbox1.Text:='';

s:='-';

end;

 

procedure Form1.button11_Click(sender: Object; e: EventArgs);

Begin

end;

 

procedure Form1.textBox1_TextChanged(sender: Object; e: EventArgs);

Begin

end;

 

end.

 

В параметрах поля ввода-вывода (TextBox) указываем RightToLeft как Yes (справа в инспекторе) - чтобы писалось справа налево.

После слова implementation создаются вручную вспомогательные переменные, которые используются при обработке сложения и вычитания.

 

________________________________________________________________________

Конец.


Дата добавления: 2018-09-23; просмотров: 247; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!