- План гри:
- Кругова діаграма:
- Передумови:
- Програмування Arduino для космічної гонки:
- Гра Arduino Space Racer працює:
Програмування завжди було цікавим, і воно стало набагато кращим на таких платформах, як Arduino. Майже кожен програміст тут спробував би розробити якусь гру, використовуючи мову, яку вони вивчають / практикують. Це допомагає їм налаштувати свої навички програмування у цікавій, але продуктивній формі. Я був великим шанувальником Arduino з тих пір, як познайомився з ним, і завжди хотів спробувати з ним щось круте, коли дізнався, наскільки здорово він може стати за допомогою графічного РК-дисплея, такого як Nokia 5110, разом із Arduino. Це був цікавий спосіб налаштувати кілька навичок програмування та одночасно розважитися, тож, хоча, хлопці, вам також може бути цікаво розвивати свою гру. Отже, у цьому підручнику ми дізнаємось, як ми можемо створити гідну гру за допомогою Arduino та графічних РК-дисплеїв.
Ми вже створили цю старомодну гру Змія за допомогою Arduino, тому цього разу ми пробуємо щось нове, і ми назвали цю гру космічною гонкою, де вам потрібно захистити свій корабель від ворожих кораблів за допомогою джойстика.
План гри:
Перш ніж ми почнемо, дуже важливо спланувати, як би насправді працювала ваша гра. Я вибрав графічний РК-дисплей та джойстик Nokia5110 для вибору обладнання. У цьому посібнику я припускаю, що ви також вибрали те саме. Оскільки у Nokia 5110 не так багато місця, ми плануємо всю свою гру з роздільною здатністю 84 * 48 пікселів нашого дисплея. Ми вже зробили підручники про те, як поєднати РК Nokia 5110 з Arduino та Джойстик з Arduino.
У цьому просторі ми повинні щільно вписатися в ігрову зону та область табло, де відображатимуться такі речі, як рахунок та інше. Дуже важливо знати місце розташування пікселів, де ви розміщуєте речі, щоб відстежувати розташування пікселів та оновлювати їх на екрані.
Після того, як буде вирішено появу на екрані гри, ми повинні визначити персонажів нашої гри. Для моєї гри у нас є лише два - персонаж гравця, який є космічним кораблем, і персонаж ворога, який повинен виглядати як космічний корабель інопланетян. РК Nokia може відображати растрові зображення, тому я вирішив використовувати цю опцію для відображення свого космічного корабля та ворогів.
Отже, у нас буде космічний корабель, який мчить крізь космічні кораблі інопланетян, цей космічний корабель матиме три смуги для змін, щоб уникнути попадання інопланетян. За весь час прибульці можуть займати лише дві доріжки, і гравець повинен мати можливість їздити по вільній доріжці. Після завершення цих ідей ми можемо перейти до обладнання, а потім до програмування.
Кругова діаграма:
Схема цієї гри Arduino дуже проста; нам просто потрібно зв’язати РК-модуль Nokia 5110 та джойстик з Arduino. Повна електрична схема показана нижче
РК-дисплей Nokia 5110 працює з 3,3 В, а модуль джойстика працює на 5 В, тому переконайтеся, що ви підключаєте РК-дисплей лише з 3,3 В, оскільки 5 В може назавжди пошкодити його. РК-дисплей зв'язується з Arduino через протокол SPI, а джойстик зчитує лише АЦП, щоб зчитувати зміну напруги. Налаштування підключення буде виглядати приблизно так нижче
Передумови:
Перш ніж ми заглибимося в частину програмування, для вас важливо бути зручним із модулем дисплея та джойстиком, тому ви можете скористатися наступними підручниками, щоб дізнатись більше про них, а потім повернутися сюди, щоб переконатися, що все працює так, як ми потрібно це!
- Nokia 5110 РК-інтерфейс з Arduino
- Модуль джойстика взаємодіє з Arduino
Програмування Arduino для космічної гонки:
Повна програму для гри можна знайти в кінці цієї сторінки; Ви можете використовувати його безпосередньо на IDE Arduino і завантажити на свою дошку. Але якщо ви хочете знати, що насправді відбувається всередині коду, читайте далі.
Як завжди ми починаємо програму з додавання файлів заголовків нашої бібліотеки, нам потрібні три бібліотеки для цього проекту, з яких бібліотека SPI за замовчуванням додається до вашої IDE. Інші дві бібліотеки потрібно завантажити зі сторінки Adafruit Github. Дотримуйтесь підручника з взаємодії з РК, згаданого в розділі «Необхідні умови», якщо ви не знаєте, як додати бібліотеку.
#включати
Якщо ви дотримувались навчальних посібників, ви повинні знати, що можна відображати растрові зображення на РК-дисплеї. Отже, ми повинні перетворити потрібне зображення в растровий код за допомогою програмного забезпечення, згаданого в підручнику, ви можете вибрати будь-яке зображення з Інтернету та використовувати його, перетворивши їх у растровий код. Переконайтесь, що зображення досить просте для відображення на нашому РК-екрані, перевірте попередній перегляд перед тим, як фактично спробувати РК-екран. У нашій програмі ми використали два растрові символи, один - космічний корабель, а інший - ворожий корабель, растровий код для обох додається в наш код, як показано нижче.
// Растрові дані для SpaceShip static const unsigned char PROGMEM ship = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B0001111, B111111, B11 B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Бітмап-дані для статичної константи const unsigned char PROGMEM ворог = { B00000101, B11000000, B00001011, B11100000, B00000011, B11100000, B00110011, B11111000, B01111111, B11111100, B10111111, B11111010, B01110111, B11011100, B01111110, B11111100, B00111111, B11111100, B11101111, B11101110, B11000001, B00000110, B10000001, B00000010, B10000000, B00000010, B00000000, B00000000, };
Ми повинні вказати шпильки, до яких підключений дисплей Nokia LCD 5110. З дисплеєм повідомляється за допомогою SPI-зв'язку, якщо ви дотримувались принципової схеми вище, код ініціалізації РК-дисплея буде таким, що вам не потрібно його змінювати.
Дисплей Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Вкажіть шпильки, до яких підключений РК-дисплей
Усередині функції налаштування ми просто запускаємо послідовний монітор зі швидкістю передачі 9600 бод, щоб ми могли налагоджувати речі, а потім ініціалізувати РК-дисплей. Ми також повинні встановити контрастність РК-дисплея, кожен дисплей буде працювати найкраще при різному рівні контрастності, тому пограйте зі значенням, щоб перевірити, яке саме вам підходить. Нарешті ми також очищаємо екран дисплея, щоб почати все по-новому.
void setup () { Serial.begin (9600); // Серійний монітор для налагодження display.begin (); // Початок РК-дисплея зв'язку. SetContrast (30); // Встановлення контрастності дисплея display.clearDisplay (); // очищає екран і запускає нове }
Як тільки екран очищається, ми переходимо до функції циклу і там відображаємо ігровий екран. Екран гри - це не що інше, як основний скелет гри, а також оцінка та рівень швидкості. Ми використовували функцію лінії, щоб намалювати три лінії як кордони, а праворуч відображаємо текстову оцінку та швидкість, як і старі ретро ручні ігрові пристрої.
void gamescreen () { // Накресліть межу для відображення екрана. drawLine (0, 0, 0, 47, ЧОРНИЙ); display.drawLine (50, 0, 50, 47, ЧОРНИЙ); display.drawLine (0, 47, 50, 47, ЧОРНИЙ); // Вводимо тексти за замовчуванням display.setTextSize (1); display.setTextColor (ЧОРНИЙ); display.setCursor (52,2); display.println ("Швидкість"); display.setCursor (54,12); display.println (швидкість_ігри); display.setCursor (52,25); display.println ("Оцінка"); display.setCursor (54,35); display.println (оцінка); }
Далі ми повинні отримати вхідні дані користувача, щоб дозволити йому / їй керувати космічним кораблем. Вхідні дані будуть надходити від модуля джойстика, який підключений до виводу А1. Аналогове значення датчика становитиме 512, якщо його не переміщати, і збільшуватиметься та зменшуватиметься при переміщенні вздовж осі X. Ми використовуємо ці значення, щоб визначити, чи хоче користувач рухатися вліво чи вправо. Вам слід прочитати підручник Джойстика з взаємодією з Arduino, згаданий у передумовах, якщо вам важко зрозуміти наведену нижче програму.
// Отримати введення від користувача Joy_X = analogRead (A1); // Зчитуємо значення X із джойстика if (Joy_X <312 && POS! = 1 && control == true) // Якщо джойстик рухається вправо {POS--; control = false;} // Зменшити положення космічного корабля else if (Joy_X> 712 && POS! = 3 && control == true) // Якщо джойстик рухається вправо {POS ++; control = false;} // Збільшення позиції космічного корабля else if (Joy_X> 502 && Joy_X <522) // Якщо джойстик повертається до початкового положення control = true; // Підготовка до наступного ходу // Введення від користувача отримано
Отримавши позицію космічного корабля від користувача, ми повинні розмістити космічний корабель у цьому конкретному місці. Ми використовуємо функцію, наведену нижче, і передаємо значення позиції як параметр, а потім на основі позиції космічний корабель розміщується у відповідній колії.
void player_car (char pos) // Розмістіть космічний корабель на основі вибраної користувачем позиції { if (pos == 1) display.drawBitmap (2, 32, корабель, 15, 15, ЧОРНИЙ); if (pos == 2) display.drawBitmap (18, 32, корабель, 15, 15, ЧОРНИЙ); if (pos == 3) display.drawBitmap (34, 32, корабель, 15, 15, ЧОРНИЙ); }
Тепер, коли наш космічний корабель розміщений на екрані і готовий до перегонів, ми маємо представити ворожі кораблі, які змагатимуться разом з гравцем. Кожного разу, коли ворожий корабель перетинає екран, ми припускаємо, що він мертвий, а коли він мертвий, нам доводиться створювати новий космічний корабель. Наведена нижче функція робить те саме. Це створює нову позицію для двох ворожих кораблів і розміщує їх у верхній частині екрана.
if (neprijatel_dead) // Перевірка ворожих кораблів мертвих {// Якщо вони мертві neprijatelj_0_pos = POS; // створюємо першого ворога над космічним кораблем противник_1_pos = випадковий (0,4); // створюємо прихованого ворога в якомусь іншому випадковому місці ворога_фаза = 0; // Привести ворога у верхню частину neprijatelja_dead = false; // Ворог створений, щоб вони вже не вмерли }
Після розміщення ворожих кораблів у верхній частині екрану ми повинні збити його так, щоб він списався так, ніби наш гравець мчить вгору, для цього нам просто потрібно збільшити фазу (місце, де відображається зображення), щоб вона опускається повільно. Те саме робиться для обох ворожих кораблів, як показано нижче
корабель ворога (противник_0_pos, фаза ворога_); ворожа_фаза ++; // Розмістіть першого ворога на екрані і закиньте його вниз_ корабель_ противника (противник_1_pos, ворог_фаза); ворожа_фаза ++; // Помістіть прихованого ворога на екран і побийте його вниз
Нижче показана функція « вражеський корабель» , вона дуже схожа на функцію плеєра, але тут у нас є два параметри. Один призначений для розміщення ворога на колії, а другий - для переміщення ворога до дна.
void neprijatel_ship (int place, int phase) // Помістіть вражеський корабель у нове місце та фазу { if (place == 1) display.drawBitmap (2, фаза, ворог, 15, 15, ЧОРНИЙ); if (place == 2) display.drawBitmap (18, фаза, ворог, 15, 15, ЧОРНИЙ); if (place == 3) display.drawBitmap (34, фаза, ворог, 15, 15, ЧОРНО); }
Наступний шматок коду повинен перевірити, чи не уникав космічний корабель ворожий корабель. Щоб перевірити це, нам потрібно знати положення ворожих кораблів та космічний корабель гравця. Оскільки ми знаємо все, нам просто потрібно перевірити, чи позиція космічного корабля така ж, як і ворожий. Ми перевіряємо це, лише якщо ворожий корабель досягнув поблизу космічного корабля. Якщо гравець не уникнув ворога, це означає, що гра закінчена.
if (противникова_фаза> 22 && ((противник_0_pos == POS) - (противник_1_pos == POS)))) // Якщо космічний корабель торкається будь-якого з ворожих game_over (); // Відображення гри закінчено
Якщо гравець успішно уникнув ворога, тоді ми повинні вбити ворога і дати гравцеві очко. Для цього ми просто перевіряємо, чи ворог досягнув нижньої частини екрана, і якщо він це робить, ми вбиваємо його, використовуючи код нижче
if (противникова_фаза> 40) // Якщо космічний корабель рятується від ворогів {neprijateljska_dead = правда; score ++;} // Збільшуйте рахунок і вбивайте ворогів
Як би було весело, якби ми не збільшували складність гри, коли отримуємо високі бали. Отже, ми використовуємо іншу функцію, яка потім контролює рахунок гравця і на основі оцінки збільшує швидкість гри. Швидкість фактично контролюється за допомогою функції затримки, яка контролює інтервал оновлення гри, роблячи її швидкою або повільною.
void Level_Controller () // Збільшення швидкості гри на основі рахунку. { if (score> = 0 && score <= 10) // Якщо оцінка 0-10 { game_speed = 0; затримка (80); // сповільнюємо гру на 80 мс } якщо (оцінка> 10 && оцінка <= 20) // Якщо оцінка 10-40 { game_speed = 1; затримка (70); // сповільнюємо гру на 70 мс } if (рахунок> 20 && рахунок <= 30) // Якщо рахунок 20-40 { game_speed = 2; затримка (60); // сповільнюємо гру на 60 мс } якщо (оцінка> 30 && оцінка <= 40) // Якщо оцінка 30-40 { game_speed = 3; затримка (50); // сповільнюємо гру на 50мс } }
Гра Arduino Space Racer працює:
Переконавшись, що апаратне забезпечення та програма зрозумілі, просто побудуйте схему та завантажте код на плату Arduino. Ви повинні помітити початок гри, як показано нижче
Використовуйте джойстик, щоб уникнути ворожого корабля, рухаючись вліво або вправо. Щоб уникнути кожного ворога, ваш рахунок буде збільшено на одиницю. Коли рахунок стає високим, швидкість гри також збільшується, тобто збільшення швидкості відбувається на 10 мс за кожні 10 набраних балів. Ви можете продовжувати і спиратися на цю гру, щоб представити нові рівні або внести деякі апаратні зміни, щоб керувати нею за допомогою руху, використовуючи акселерометр. Творчість - це єдина межа. Для довідки ви тут навчитесь використовувати акселерометр з Arduino.
Сподіваюся, ви зрозуміли проект і сподобалось його будувати. Якщо ви зіткнулися з будь-якою проблемою з тим, як це працює, будь ласка, опублікуйте проблему в розділі коментарів нижче або скористайтеся форумами для отримання технічної допомоги. Щасливих ігор !!
Перевірте повний код та демонстраційне відео нижче.