Тема: створення моделей рівномірного прямолінійного руху об’єкта, руху об’єкта на площині з перешкодами та з вибором шляху у середовищі Lazarus.
Мета: навчити створювати моделі руху об’єкта на площині з перешкодами з використанням графічних компонентів Shape в середовищі Lazarus.
Обладнання: ПК із встановленим ОС і середовищем програмування Lazarus, (дана) інструкція.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
Після завантаження середовища програмування Lazarus на екрані монітора з'являється кілька вікон.
Головне вікно
Верхню частину головного вікна поділяють на три функціональних блоки (див. малюнок знизу):
Головне меню (під рядком назви програмного вікна кнопки: Файл, Правка, Пошук і т.і.) для вказівок керування файлами, компіляцією, властивостями проекту, вікнами та вказівок налаштування середовища;
Панель інструментів (під рядком меню ліворуч), що надає швидкий доступ до основних вказівок головного меню;
Панель компонентів (під рядком меню праворуч закладки: Standard, Additional, Common Controls і т.і.), що надає доступ до сторення основних об'єктів середовища програмування (поля введення, кнопок, напису, меню тощо).
Інспектор об'єктів
У верхній частині вікна показано ієрархічну структуру об'єктів, а внизу розташовано вкладки: Властивості, Події, Улюблені.
Редактор тексту
Саме у цьому вікні вводять і редагують текст програми. Жирним шрифтом буде виділено зарезервовані слова, червоним — знаки пунктуації, синім — коментарі.
Вікно повідомлень
Вікно призначене для повідомлень щодо компілювання, компонування й налаштування проекту.
Вікно платформи
Вікно призначене для розташування об'єктів, у тому числі елементів керування.
3. Вивчення нового матеріалу
Мотивація навчання: урок присвячено створенню моделі рівномірного руху об’єкта на площині з перешкодами з використанням графічних компонентів Shape в середовищі Lazarus.
Для успішного досягнення поставленої мети потрібно знати відповіді на такі запитання.
Назвіть складові Lazarus'а, які використовують для побудови графічних зображень? Для побудови графічних зображень використовують компоненти TShape, який знаходиться на вкладці Additional.
Які графічні примітиви можна побудувати, використовуючи компонент Shape — Коло (stCircle), ромб (stDiаmond), еліпс (stElipce), прямокутник (stRectangle), заокруглений прямокутник (stRoundRect), квадрат (stSquare), трикутник (stTriangle) та інші.
Як задати колір тла, контурів об’єкта Shape? — колір тла Brush.Color, контурів — Pen.Color
Для чого використовують властивість Brush? — для задання кольору тла та стилю заповнення.
Для чого використовується властивість Pen? — для задання кольору контура фігури та стилю лінії, розміру лінії.
Як можна перемістити об'єкт Shape на формі? — об'єкт можна перемістити змінюючи координати фігури Top та Left.
Як визначають розташування об’єкта Shape на формі? — за допомогою властивостей Top та Left.
Що описують властивості Top і Left для об’єкта Shape? — допомогою властивостей Top — відстань від верхньої межі копонента до верхньої межі форми, Left — відстань від лівої межі компонента до лівої межі форми( у пікселях.)
Як програмно перевірити, що один об’єкт Shape сумістився з іншим об'єктом? За допомогою функції InterSectRect(Overlay, shape2.BoundsRect, Shape1.BoundsRect).
4. Інструктаж з ТБ
5. Закріплення вивченого матеріалу
Створити окрему теку з назвою Ваше прізвище у теці, вказаній учителем. У цю теку зберігати проект, періодично натискаючи кнопку Зберегти всі.
У середовищі Lazarus скористатися вказівкою меню Проект / Новий проект
для виклику вікна діалогу Створити новий проект. У цьому вікні вибирати пункт Застосунок.
Побачити форму — об’єкт для розташування кнопок, полів, написів, меню, смуг прокрутки тощо.
У вікні Інспектор об'єктів на вкладенні Властивості надати такі значення властивостям:
Створити окрему теку для проекту з назвою Ваше прізвище у теці, вказаній учителем. Для збереження всіх файлів скористатися кнопкою Зберегти всі на панелі інструментів.
Відкрити проект. Для цього завантажити файл project1.lpi з теки з назвою Ваше прізвище. Цей файл буде створено у результаті виконання вказівки (див. попередній абзац).
Використовуючи Панель компонентів, розташувати на формі такі об’єкти:
timer1, timer2 — натиснути кнопку TTimer яка знаходиться на вкладці System.
panel1, panel2 — натиснути на кнопку TPanel яка розміщена на вкладці Standart.
На Panel1 розмістити довільним чином 16 об’єктів Shape3, Shape4, …, Shape18. Для цього натиснути на кнопку TShape, яку розміщено на вкладці Additional. В інспекторі об'єктів властивості Shape надати значення stRectangle для всіх об'єктів Shape3, Shape4, …,-Shape18. Ці об'єкти будуть перешкодами на формі.
Також на Panel1 встановити об’єкти:
Shape1 у вигляді круга (цей об'єкт буде рівномірно переміщатись по формі) — в інспекторі об'єктів властивості Shape надати значення stCircle.
Shape2 у вигляді прямокутника, що буде означати фініш — в інспекторі об'єктів властивості Shape і вибрати значення stRectangle.
Використовуючи Інспектор об'єктів, змінити властивості об'єктів таким чином:
Властивість | Значення |
---|---|
Height | 20 |
Width | 20 |
Brush.Color | clBlue |
Top | 170 |
Left | 8 |
Властивість | Значення |
---|---|
Align | Left |
Brush.Color | clBlue |
Left | 8 |
Властивість | Значення |
---|---|
Width | 4 |
Height | 70 |
Brush.Color | clBlack |
Visible | False |
Використовуючи Інспектор об'єктів, змінити значення властивості Caption об'єктів-кнопок таким чином (невказані властивості — довільні):
Кнопки розташувати зверху форми. Розмір кнопок довільний.
Використовуючи Інспектор об'єктів, задати властивості Enabled таймерів timer1 i timer2 значення false.
Примітка. Властивості Panel1, Panel2 задамо далі програмним шляхом при створенні форми.
Надати формі такого вигляду.
У вікні Редактор тексту службовим словом implementation перед виконуваною частиною проекту описати глобальні змінні проекту.
const n=16; m=11; // кількість фігур у лабіринтах відповідно 1 і 2 var Form1: TForm1; dx: integer=3; // зміщення фігури на формі dy: integer=3; n_maze:integer; //номер лабіринту Sh :array[1..n] of TShape; // масив Shape - лабіринт 1 Shap:array[1..m] of TShape; //масив для лабіринту 2
Для того, щоб задати початкові властивості форми та компонентів Shape3-Shape18, Shape21-Shape31, створити подію для форми Form1 onCreate. Для цього потрібно в інспекторів об'єктів вибрати вкладення Події, вибрати властивість OnCreate, клацнути на її значення двічі і внести такий код у процедуру:
procedure TForm1.FormCreate(Sender: TObject): Form1.Height:=500; Form1.Width:=850; sh[1]:=Shape3; sh[2]:=Shape4; sh[3]:=Shape5; sh[4]:=Shape6; sh[5]:=Shape7; sh[6]:=Shape8; sh[7]:=Shape9; sh[8]:=Shape10; sh[9]:=Shape11; sh[10]:=Shape12; sh[11]:=Shape13; sh[12]:=Shape14; sh[13]:=Shape15; sh[14]:=Shape16; sh[15]:=Shape17; sh[16]:=Shape18; Shape3.Visible:=True; Shape4.Visible:=True; Shape5.Visible:=True; Shape6.Visible:=True; Shape7.Visible:=True; Shape8.Visible:=True; Shape9.Visible:=True; Shape10.Visible:=True; Shape11.Visible:=True; Shape12.Visible:=True; Shape13.Visible:=True; Shape14.Visible:=True; Shape15.Visible:=True; Shape16.Visible:=True; Shape17.Visible:=True; Shape18.Visible:=True; shap[1]:=Shape21; shap[2]:=Shape22; shap[3]:=Shape23; shap[4]:=Shape24; shap[5]:=Shape25; shap[6]:=Shape26; shap[7]:=Shape27; shap[8]:=Shape28; shap[9]:=Shape29; shap[10]:=Shape30; shap[11]:=Shape31; Shape21.Visible:=True; Shape22.Visible:=True; Shape23.Visible:=True; Shape24.Visible:=True; Shape25.Visible:=True; Shape26.Visible:=True; Shape27.Visible:=True; Shape28.Visible:=True; Shape29.Visible:=True; Shape30.Visible:=True; Shape31.Visible:=True;
Тут кожному елементу масиву надано значення конкретного об’єкта Shape і задано значення true властивості Visible, щоб ці об'єкти було видно на формі (на початковому етапі вони невидимі).
Створити подію для кнопки Button1.Click (Лaбіринт1). Для цього вибрати кнопку з написом Лабіринт1, клацнути по ній двічі і у код процедури
procedure TForm1.Button1Click(Sender: TObject);
вписати таке:
n_maze:=1; Panel1.Visible:=True; Panel2.Visible:=False; Panel1.Height:=450; Panel1.Width:=850; Panel1.Top:=50; Panel1.Left:=1;
В цьому коді задано видимість компонету Panel1, його розміри та координати розташування.
Створити подію для кнопки Button2.Click (Лабіринт2). Для цього вибираємо кнопку з написом Лабіринт2, клацнути по ній двічі й у код процедури
procedure TForm1.Button2Click(Sender: TObject);
вписати таке:
n_maze:=2; Panel1.Visible:=False; Panel2.Visible:=True; Panel2.Height:=450; Panel2.Width:=850; Panel2.Top:=50; Panel2.Left:=1;
Створити подію для кнопки Button3.click (Старт). Для цього вибирати кнопку з написом Старт, клацнути по ній двічі й у код процедури
procedure TForm1.Button3Click(Sender: TObject);
вписати таке:
var x,y,i:integer; begin if n_maze=1 then BEGIN //лабіринт1 Randomize; x:=Random(20); y:=Random(10); for i:=1 to 4 do begin sh[i].Left:=sh[i].left+30+x; sh[i].Top:=sh[i].Top+10+y; end; for i:=5 to 8 do begin sh[i].Left:=sh[i].left+30+x; sh[i].Top:=sh[i].Top-10+y; end; for i:=9 to 12 do begin sh[i].Left:=sh[i].left+30+x; sh[i].Top:=sh[i].Top-10+y; end; for i:=12 to 16 do
begin sh[i].Left:=sh[i].left+30+x; sh[i].Top:=sh[i].Top+10+y; end; timer1.Enabled:=true; END ELSE BEGIN // лабіринт2 Randomize; x:=Random(20); y:=Random(10); for i:=1 to 11 do begin shap[i].Left:=shap[i].left+30+x; shap[i].Top:=shap[i].Top+10+y; end; timer2.Enabled:=true; END;
В цій процедурі зроблено перевірку, який вибрано лабіринт і задано розташування перешкод випадковим чином.
Для того, щоб відбулось переміщення м'ячика (Shape1), створити події для таймера timer1. Для цього достатньо по ньому клацнути двічі й у тіло процедури
procedure TForm1.Timer1Timer(Sender: TObject);
вписати код, що задаватиме зміщення круга Shape1 і перевірятиме, чи відбулося зіткнення з перешкодою чи виходу на фініш Shape2. Для перевірки того, чи Shape1 зіткнувся з іншим об’єктом Shape використати таку функцію:
InterSectRect (Overlay, shape2.BoundsRect, Shape1.BoundsRect)
Саме за допомогою цієї функції буде перевірено, чи м'ячик (Shape1) накриває фініш (Shape2). При накладанні буде створено повідомлення про фініш, інакше буде змінено координати Shape1, що сторюватиме видимість відбивання м'ячика від перешкоди.
var c:TColor; i:integer; Overlay: TRect; begin // рух м'ячика по таймеру, перевірка перешкод with Shape1 do begin Left:=Left+dx; if InterSectRect(Overlay, Shape3.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape4.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape5.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape6.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape7.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape8.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape9.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape10.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape11.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape12.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape13.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape14.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape15.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape16.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape17.BoundsRect, Shape1.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape18.BoundsRect, Shape1.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; end; //end width if InterSectRect(Overlay, shape2.BoundsRect, Shape1.BoundsRect) then begin timer1.Enabled:=false; Showmessage('FINISH'); end; end;
Створити подію для таймеру timer2 — рух компонента Shape19 (м'ячик) для Лабіринта2. Клацаємо по компоненту timer2 двічі лівою кнопкою миші і у тіло процедури
procedure TForm1.Timer2Timer(Sender: TObject);
вписати таке:
var c:TColor; i:integer; Overlay: TRect; begin // рух м'ячика по таймеру, перевірка перешкод with Shape19 do begin Left:=Left+dy; if InterSectRect(Overlay, Shape21.BoundsRect, Shape19.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape22.BoundsRect, Shape19.BoundsRect) then begin Top:=Top-3; Left:=Left-6; end; if InterSectRect(Overlay, Shape23.BoundsRect, Shape19.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape24.BoundsRect, Shape19.BoundsRect) then begin Top:=Top-3; Left:=Left-6 end; if InterSectRect(Overlay, Shape25.BoundsRect, Shape19.BoundsRect) then begin Top:=Top+3; Left:=Left-5; end; if InterSectRect(Overlay, Shape26.BoundsRect, Shape19.BoundsRect) then begin Top:=Top-3; Left:=Left-6; end; if InterSectRect(Overlay, Shape27.BoundsRect, Shape19.BoundsRect) then begin Top:=Top+3; Left:=Left+5; end; if InterSectRect(Overlay, Shape28.BoundsRect, Shape19.BoundsRect) then begin Top:=Top+3; Left:=Left-6; end; if InterSectRect(Overlay, Shape29.BoundsRect, Shape19.BoundsRect) then begin Top:=Top-3; Left:=Left-5; end; if InterSectRect(Overlay, Shape30.BoundsRect, Shape19.BoundsRect) then begin Top:=Top-3; Left:=Left-6; end; if InterSectRect(Overlay, Shape31.BoundsRect, Shape19.BoundsRect) then begin Top:=Top+3; Left:=Left+3; end; end; //end width if InterSectRect(Overlay, shape20.BoundsRect, Shape19.BoundsRect) then begin timer2.Enabled:=false; Showmessage('FINISH'); end;
Перевірку накладання м'ячика (Shape19) на фініш буде здійснено за допомогою функції
InterSectRect(Overlay, shape20.BoundsRect, Shape19.BoundsRect).
Якщо відбудеться накладання м'ячика на фініш, то буде створено повідомлення про фініш, інакше буде змінено координати Shape19, що створюватиме видимість відбивання м'ячика від перешкоди.
Виконати проект, натиснувши кнопку Виконати. Якщо все зроблено правильно, у вікні повідомлень побачити напис: Проект успішно зібрано. Інакше виправити помилки. Наприклад, порівнявши з кодом демонстраційного розв'язання, доповнити замовлення роботи з модулями до такого:
uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, types;
Запустити створений файл exe на виконання і пересвідчитися у коректності роботи. Порівняти з роботою демонстраційного розв'язання.
Зберегти остаточну редакцію проекту: скористатися кнопкою Зберегти всі і закрити вікно програми Lazarus.
6. Підбиття підсумків уроку
Виставлення оцінок.
7. Домашнє завдання
Виробити пропозиції щодо удосконалення проекту (наприклад, розбити область на комірки без перешкод, здійснити пошук у ширину ламаної з вершинами у центрах комірок тощо). При можливості реалізувати.
Текст упорядкувала Білик Оксана Василівна, вчитель школи № 126 Дніпровського району міста Києва, під час виконання випускної роботи на курсах підвищення кваліфікації з 16.01.2017 по 20.01.2017.