Тема: створення комп’ютерної гри з двома об’єктами, управління одним з яких здійснює людина, а управління іншими здійснюється автоматично за допомогою комп’ютера мовою програмування Java.
Мета: сформувати предметні компетенції щодо технологій імітації руху та моделювання гри.
Учень повинен пояснювати: призначення та спосіб дії програмного таймера.
Учень повинен вміти:
Обладнання: комп’ютери зі встановленими ОС, JDK (Java Developer Kit, комплект розробника Java) та середовищем програмування мовою Java. Наприклад, Eclipse чи Netbeans, для яких подано опис створення програми.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності й готовності учнів до уроку.
2. Актуалізація опорних знань
Яким чином створюють графічні примітиви у програмі мовою Java? Відповідь порівняти з раніше розглянутим прикладом.
boolean b=true; Timer timer; … timer = new Timer(); timer.schedule( new Step(), 0, 100); … class Step extends TimerTask { @Override public void run() { if (b) { … } else { timer.cancel();} } }
Яким чином створюють здійснюють анімацію без мерехтіння екрану у програмі мовою Java? Відповідь порівняти з раніше розглянутим прикладом.
3. Інструктаж з ТБ
4. Вироблення практичних умінь і навичок
Для створення програмного втілення гри Пінг-Понг візьмемо за основу:
Завдання.
Описати порядок створення складових гри Пінг-Понг з відбиванням м'яча від бокових меж ігрового поля і двох ракеток, керування однією з яких здійснює людина, а керування іншою здійснює комп’ютерна програма.
Cтворити й налагодити програму для такої гри.
Код програми записати у файл Ваше_прізвище у теку, вказану вчителем.
Порядок створення складових гри Пінг-Понг
(бажано отримати як результат конкурсу ідей)
Вказівки щодо створення програми
Вилучити з коду зайве: вилучити вказівки, що стосуються відображення вмісту файлів background.jpg (лісовий пейзаж) і plane.png (літак). Перевірити правильність роботи коду:
і після появи вікна спостерігати рух червоного круга на темнозеленому тлі.
Задати значення змінних головного класу.
public int i=0, // стан гри il=0, // кількість очок на рахунку програми ir=0, // кількість очок на рахунку гравця w=780, // ширина вікна програми та ігрового поля h=500, // висота ігрового поля c=24, // висота рядка заголовку вікна програми a=10, // ширини прямокутника — зображення ракетки b=100, // висота прямокутника — зображення ракетки, d=20, // діаметр круга — зображення м'яча, d_=8, // приріст ординати ракетки на одне оновлення екрану (3), dx=0, // приріст поточної величини приросту абсциси круга за 1 такт оновлення екрану dy=0, // приріст поточної величини приросту ординати круга за 1 такт оновлення екрану dx_=9, // верхня межа приросту абсциси круга за 1 такт оновлення екрану dy_=4, // верхня межа приросту ординати круга за 1 такт оновлення екрану x =(w-d)/2, // поточна абсциса ЛВК квадрата, що містить зображення м'яча y =(h-a)/2+c, // поточна ордината ЛВК квадрата, що містить зображення м'яча yl=(h-b)/2+c, // ордината верхнього краю прямокутника-ракетки ліворуч, керованого програмою yr=(h-b)/2+c; // ордината верхнього краю прямокутника-ракетки праворуч, керованого людиною public boolean up = false, // потрібно рухати жовтий прямокутник догори down = false; // потрібно рухати червоний прямокутник догори Font f = new Font("Serif",Font.BOLD, 24); // шрифт для виведення рагунку Timer timer;і змінити у коді конструктора:
Відобразити поточний стан гри у коді перевизначення методу paint:
Створити обробники подій, породжених клавіатурою, вставивши наприкінці коду класа Graphtest такі вказівки переозначення обробників подій:
@Override public void keyPressed (KeyEvent e) { if (e.getKeyCode()==KeyEvent.VK_UP) {up=true; down=false;} if (e.getKeyCode()==KeyEvent.VK_DOWN) {up=false; down=true; } } @Override public void keyTyped (KeyEvent e){} @Override public void keyReleased(KeyEvent e){up=false; down=false; }
Для успішної компіляції потрібно ще:
вставити у довільне місце коду конструктора класу Graphtest встановлення прослуховування подій, породжених клавіатурою:
this.addKeyListener((KeyListener) this);
і оголосити його використання у класі Graphtest, розширивши його заголовок до такого:
public class Graphtest extends JFrame implements KeyListener
Після здійснених змін перевірити коректність компіляції коду і у разі потреби внести зміни у код.
У завданні для таймера описати зміну стану гри за 1 крок.
Якщо номер стану гри 0 (вкидання м'яча у напрямку ліворуч), розташувати білий круг у центрі поля, надати йому сталої горизонтальної швидкості ліворуч, випадкової вертикальної швидкості і перейти до стану гри з номером 1.
Якщо номер стану гри 1 (рух м'яча):
надати координатам ЛВК круга приростів;
врахувати можливість відбивання від горизонтальних меж поля:
складова швидкості по вертикалі змінює напрям на протилежний;
відрізок з кінцями у центрах кругів при русі з відбиванням і без нього перпендикулярний до межі і поділяється нею навпіл;
якщо найближча до лівого (правого) краю екрану точка білого круга перетнула білу обмежувальну лінію поза розташуванням прямокутника червоного (жовтого) прямокутника зображення ракетки програми (користувача), збільшити рахунок суперника на 1 у перейти до стану гри з номером 0 (2).
Якщо номер стану гри 2 (вкидання м'яча у напрямку праворуч), розташувати білий круг у центрі поля, надати йому сталої горизонтальної швидкості праворуч, випадкової вертикальної швидкості і перейти до стану гри з номером 1.
5. Підбиття підсумків уроку
Виставлення оцінок.
6. Домашнє завдання
Порівняти створену програму з демонстраційним розв'язанням. Змінити наявну програму, додавши випадковість у вибір величини переміщення ракетки, керованої програмою. Інакше кажучи, надати можливість користувачу виграти.
Матеріал упорядковано Олександром Рудиком.