Тема: рух об’єктів у моделюванні гри мовою Ruby.
Мета:
Обладнання: комп'ютери зі встановленими ОС, браузером, інтерпретатором мови Ruby і бібліотекою Ruby 2D, (дана) інструкція.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
Протлумачити дію вказівок мовою Ruby (деякі з використанням бібліотеки Ruby 2D)
case i when 0 i=7 when 1 i=11 when 2 i=13 end t+=2 i = Image.new("boom.png",x:11, y:22, width: 33, height: 44, z:0, color:"red") r = Rectangle.new( x:11, y:22, width: 33, height: 44, z:0, color:"#DDDDDD") t = Text.new("Claim", x:11, y:22, size: 16, font: sf, z:1, color:"black") on :mouse_down do |e| k = e.x j = e.y end on :key_down do |e| k=e.key end update do end show
і порівняти з очікуваним.
3. Інструктаж з ТБМатематична модель. Для зручності програмного втілення систему координат доцільно вибрати таким чином:
Вважати, що рух тіла є рівномірним по горизонталі і зі сталим прискоренням по вертикалі при нехтуванні опором повітря. Інакше кажучи, вважати, що координати центра ядра залежать від часу t таким чином:
x = x0 + v0x · t,
y = y0 + v0y · t + g · t2/2.
Тут:
При виконанні завдання використати конкурс ідей. Після здійснення кожного кроку створений код порівнювати з очікуваним у відповідній частині демонстраційного розв'язання (нумерація кроків — у порядку створення програми).
Вказівки до виконання завдання
Cтворити й відобразити вікно програми з такими параметрами.
require 'ruby2d' w=800 # ширина вікна програми h=450 # висота вікна програми dh=20 # висота смуги з елементами керування r0=4 # радіус зображення ядра r1=4 # радіус зображення цілі sf="/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf" # адреса використаного шрифту set title:"Гра «Постріл гармати»", # параметри вікна ігрового поля background:"#96C8FF", width: w, height: h
Адреса використаного шрифту залежить від типу й навіть версії операційної системи.
Cтворити й відобразити написи, «поля введення» й «кнопку» з написом «Fire!» так, як показано на малюнку,
Запровадити (описати) змінні, необхідні для програмного втілення гри (при спільній роботі у класі використати конкурс ідей), та надати їм початкових значень.
Розташування за межами ігрового поля зображень ядра, цілі, вибуху й заклику ввести правильні значення параметрів — чорного й червоного кругів та полум'я, напису червоного кольору на білому тлі:
"Input valid values: x in (1, 800), y in (0, 430), a in (0, 90), v in (0, 900)."
— "Введіть правильні значення: x в (1, 800), y в (0, 430), a в (0, 90), v в (0, 900)". Перевірити коректність відображення повідомлення у межах ігрового поля.
Створити обробник події натискання лівої кнопки миші ігровому полі, який :
надає значення номеру «поля введення» залежно від координат вказівника миші;
при клацанні на «полі введення» у стані введення значень параметрів імітує зміну фокусу:
з тексту попереднього активного «поля введення» прибирає останній символ (вертикальну риску);
до тексту поточного активного «поля введення» долучає вертикальну риску
Перевірити коректність виведенням значення змінюваної величини у консоль.
Створити обробник події натискання клавіші клавіатури на етапі введення чи зміни значень параметрів:
якщо натиснуто клавішу backspace, то вилучити передостанній символ з тексту «активного поля введення»;
якщо натиснуто клавішу tab, то:
вилучити вертикальну риску з кінця тексту напису поточного «активного поля введення»;
зробити «активним» наступне «поле введення»;
долучити вертикальну риску до кінця тексту напису поточного «активного поля введення»
Наочно перевірити коректність опрацювання подій натискання клавіш.
Примітка. Кроки 7‒9 втілити за допомогою вказівки галуження в циклі оновлення вікна програми
update do t+=dt end
Підготувати відображення руху ядра:
(0<x1) && (x1<800) && (0<y1) && (y1<430) && (0<a) && (a<90) && (0<v0) && (v0<900)
пересунути повідомлення всередину вікни програми;
Відобразити рух ядра й можливе зіткнення з ціллю на основі поданих вище формул залежності координат x, y від часу t з урахуванням такого:
якщо відстань між центрами ядра й цілі менша від суми їхніх радіусів — ядро влучило у ціль:
змінити координати верхнього лівого кута зображення полум'я таким чином, щоб центр зображення лежав посередині між центрами цілі та ядра;
змінити стан гри на очікування рішення щодо початку нової гри;
якщо абсциса центра ядра перевищує розмір вікна по горизонталі або його ордината менша від нуля — ядро назавжди вилетіло за межі відображуваного прямокутника — змінити стан гри на очікування рішення щодо початку нової гри.
Відобразити перемикання на нову гру зі стану очікування при клацанні на кнопці:
надати координатам лівого верхнього кута зображень ядра, цілі й полум'я значень розмірів вікно програми — перенести зображення за межі вікна програми;
Перевірити правильність роботи програми. У разі потреби внести зміни у код програми.
Повідомити вчителя про завершення роботи над проектом.
5. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.
6. Домашнє завдання
У разі потреби доробити завдання. Удосконалити проект,
запровадивши систему координат, у якій ордината зростає при переміщенні догори. Передбачити можливість врахування сили опору повітря, що дорівнює добутку значення деякої сталої γ (передбачити введення її додатного значення з нового поля введення на формі) і швидкості руху ядра, але спрямована протилежно до напрямку цієї швидкості. Використати такі співвідношення:
x = x0 + vx0 · (1 − e − γt ) · γ − 1,
y = y0 + (vy0 · (1 − e − γt ) + gt ) · γ − 1 +
(e − γt − 1) · g · γ − 2.
Ці рівняння можна отримати, розв'язавши систему диференціальних рівнянь:
x' = vx ,
y' = vy ,
(vx)' = − γ · vx ,
(vy)' = − γ · vy + g
з такими початковими значеннями:
x(0) = x0 ,
y(0) = y0 ,
vx(0) = vx0 ,
vy(0) = vy0 .
Теорію диференціальних рівнянь вивчають у вищій школі, тому виведення рівнянь тут не подано.
Текст упорядкував Олександр Рудик.