Если нажата ЛКМ и мы находимся в нужной части экрана
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!