Оглавление:

Reckless Racer Arduino OLED Game, AdafruitGFX и основы растровых изображений: 6 шагов
Reckless Racer Arduino OLED Game, AdafruitGFX и основы растровых изображений: 6 шагов

Видео: Reckless Racer Arduino OLED Game, AdafruitGFX и основы растровых изображений: 6 шагов

Видео: Reckless Racer Arduino OLED Game, AdafruitGFX и основы растровых изображений: 6 шагов
Видео: Arduino Star Wars Game - how to make 2024, Ноябрь
Anonim
Игра Reckless Racer Arduino OLED, AdafruitGFX и основы растровых изображений
Игра Reckless Racer Arduino OLED, AdafruitGFX и основы растровых изображений
Игра Reckless Racer Arduino OLED, AdafruitGFX и основы растровых изображений
Игра Reckless Racer Arduino OLED, AdafruitGFX и основы растровых изображений

В этом уроке мы рассмотрим, как использовать растровые изображения с помощью библиотеки Adafruit_GFX.c в качестве спрайтов в игре. Самая простая игра, которую мы могли придумать, - это автомобильная игра с боковой полосой прокрутки, в конце концов наш бета-тестер и помощник кодера выбрали название «Безрассудный гонщик», так как это довольно безрассудно ехать не в ту сторону по автостраде !!.

Дизайн нашей схемы показан на изображениях, включенных выше, и подробно описан в нашем последнем проекте / руководстве здесь Snake Instructables, в котором описывается, как работает схема.

нам потребуется

Adafruit_GFX

Paint.net

IDE Arduino для windowslinux

и, пожалуйста, взгляните на учебник Змеи для остального оборудования.

Запасы

Змея игра

Шаг 1. Установка Paint.net

Установка Paint.net
Установка Paint.net
Установка Paint.net
Установка Paint.net
Установка Paint.net
Установка Paint.net

Мы используем paint.net, поскольку программное обеспечение является бесплатным, поэтому вы можете загрузить Paint. Net здесь.

Чтобы установить paint.net, дважды щелкните загруженную программу и ответьте положительно: «Да, хорошо, я согласен», и изображения выше дадут вам направление.

Шаг 2. Рисование простого экрана-заставки

Рисование простого экрана-заставки
Рисование простого экрана-заставки
Рисование простого экрана-заставки
Рисование простого экрана-заставки
Рисование простого экрана-заставки
Рисование простого экрана-заставки

Когда вы находитесь в paint.net, создайте новое изображение, нажав «Файл», затем «Создать», установите размер изображения 1260x620 (см. Первое изображение), нажмите «ОК», когда у вас появится новая страница, нарисуйте экран-заставку, используя только 2 цвета: черный и белый, используя карандаш. инструмент (рис2), когда вы нарисовали (или вставили) изображение экрана-заставки, щелкните изображение, затем измените его размер (изображение 4), во всплывающем окне измените размер с 1260 x 620 на 126 x 62 (на 2 пикселя меньше, чем ваш дисплей) (рис 5). Нажмите OK.

затем щелкните меню «Файл» и затем сохраните как (рис. 6).

когда всплывающее окно появляется в раскрывающемся меню типа файла, выберите BMP (растровое изображение). (рис. 7), введите имя файла и нажмите «Сохранить», когда появится всплывающее окно, установите для дизеринга значение 0 и установите значение 8 бит, нажмите «ОК» (рис. 8)).

Шаг 3: преобразование BMP в файл растрового изображения C

Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C
Преобразование BMP в файл растрового изображения C

Теперь нам нужно преобразовать наше изображение в формат, который может понять Arduino. Для этого доступно множество инструментов, но я «иду туда», где находится инструмент для преобразования растровых изображений сайта is marlin webs…

marlinfw.org/tools/u8glib/converter.html

Итак, мы начинаем этот раздел, используя указанную выше ссылку, чтобы открыть веб-сайт, показанный на рис.1.

нажмите на выбрать файл и выберите растровое изображение, которое вы создали ранее (рис2)

Конвертер растровых изображений marlin автоматически преобразует ваше изображение в код c, дважды щелкните левой кнопкой мыши код, который должен выделить код, затем щелкните правой кнопкой мыши и щелкните копию (рис3)

далее Мы делаем щелчок правой кнопкой мыши и создаем новый текстовый документ (рис4)

дважды щелкните новый документ, при открытии щелкните правой кнопкой мыши и вставьте код (рис5)

Затем мы должны добавить строку в верхней части кода #include, это позволяет нам сохранять данные растрового изображения во флеш-память на Arduino, затем мы переименовываем #define width, height и name во что-то более простое в использовании, они выделены на рис. 6, мы переименовываем их из случайно сгенерированных символов, переименовываем их в подчеркнутый пример ниже

#define LOGOWIDTH

#define LOGOHEIGHT

const unsigned char LOGOPIC PROGMEM

затем щелкните файл, затем сохраните его как, сохраните файл как logo.c закройте блокнот, щелкните правой кнопкой мыши на logo.c и нажмите «Копировать».

Шаг 4: Отображение логотипа с помощью DrawBitmap

Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap
Отображение логотипа с помощью DrawBitmap

Теперь мы загружаем IDE arduino, создаем новый эскиз и сохраняем его с именем logoexample.ino, затем в качестве чит-кода в arduino ide щелкните меню файла, затем сохраните как, вернитесь в папку проекта, щелкните правой кнопкой мыши и вставьте файл.c (рис2) затем нажмите «Отмена», это избавит вас от необходимости переходить к папке для вставки в файл.

введите следующий код в IDE arduino или загрузите ino.

(мы рекомендуем вводить текст, а не копировать и вставлять или использовать файлы ниже, это лучший способ научиться)

#include / * это будет зависеть от того, где вы храните

ino обычно находится в папке C: / Users / ~ username / Documents / Arduino / project ~ name

и так мы связываемся с нашим растровым изображением * /

#включают

#включают

uint8_t bmpX, bmpY = 0; / * резервируем память для 2 X 8-битных целых чисел, нам нужны только 8-битные целые числа

поскольку значение никогда не превышает 128 (пикселей), поэтому мы можем сэкономить место, используя 8-битные целые числа (максимальное значение 255) * /

установка void ()

{задержка (100); // даем дисплею и т. д. время для включения display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // это для инициализации дисплея display.clearDisplay (); // начинаем с пустого экрана}

/ * обратите внимание, что вам не нужно вводить эти комментарии, они предназначены для справки …………..

Команда, на которой мы собираемся сосредоточиться, - это display.drawBitmap, это то, что рисует наш экран-заставку. (bmpX - это значение оси X на экране, где будет точка привязки X растрового изображения, а bmpX и bmpY - значения, которые нам нужны для создания движения (bmpY, это значение оси Y на экране, где привязка Y точки растрового изображения, мы получим ссылочные имена, как мы определили их в logo.c (LOGOPIC - это имя растрового изображения в #included файле logo.c (LOGOWIDTH, сколько пикселей пересекает (X), чтобы нарисовать растровое изображение из точки привязки (LOGOHEIGHT, на сколько пикселей вниз (Y) нарисовать растровое изображение из точки привязки, пиксели X и Y пересекаются, можно ввести вручную, но проще использовать те, которые предопределены, чем запоминать их все (1, последнее значение - цвет, так как экран монохромный 0 черный 1 белый. Хорошо, начни вводить со следующей строки: ¬D lol * / void loop () {display.clearDisplay (); // очистить экран // растровое изображение, нарисованное из верхний левый, x, y, имя растрового изображения, ширина X, высота Y, цветной дисплей. drawBitmap (bmpX, bmpY, LOGOPIC, LOGOWIDTH, LOGOHEIGHT, 1); display.display (); // это фактически рисует буфер на дисплей когда-либо}

загрузите свой код для Arduino и убедитесь, что он работает (рис. 3).

Шаг 5: перемещение растрового спрайта

Image
Image
Перемещение растрового спрайта
Перемещение растрового спрайта
Перемещение растрового спрайта
Перемещение растрового спрайта

используя предыдущие инструкции, используйте paint.net и создайте новый файл размером 30x15 пикселей (рис.1) и нарисуйте грубую машину, которую наш молодой дизайнер сначала начинает с лобового стекла (фото 2 и 3).

снова сохраните его как файл BMP Windows (как на шаге 2), преобразуйте в растровое изображение C (шаг 3) и поместите файл car.c (или что угодно) в ту же папку, что и вновь созданный arduino ino (эскиз) файл.

(p.s. не забудьте добавить строку #include в car.c, чтобы нас часто ловили)

Сначала свяжите ваш эквивалент car.c

#включают

#include #include Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library #include Adafruit_SSD1306 //

Дисплей Adafruit_SSD1306 (128, 64); // устанавливаем разрешение дисплея

/ * bmpX / bmpY нам нужно, чтобы это были переменные, так как изменение этих значений и перерисовка

экран - это то, как мы создаем эффект анимации движения. hitSide и hitTop - это то, как мы сохраняем спрайт на экране * / uint8_t bmpX, bmpY = 0; // резервируем память для 2 8-битных целых чисел (0-255) нам не нужно больше 128 будет самым большим используемым числом bool hitSide = 0; bool hitTop = 0;

установка void ()

{задержка (100); // даем дисплею и т. д. время для включения display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // это для инициализации дисплея display.clearDisplay (); // начинаем с пустого экрана

}

пустой цикл ()

{display.clearDisplay (); // очищаем экран // растровое изображение, нарисованное сверху слева, x, y, имя растрового изображения, ширина X, высота Y, цвет display.drawBitmap (bmpX, bmpY, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // display.display (); // это фактически отрисовывает буфер к дисплею когда-либо / * так мы отслеживаем край экрана и решаем, добавлять ли пиксель, перемещать сверху вниз) или удалять пиксель (перемещать снизу вверх) * / switch (hitSide) // это выбирает направление автомобиля на основе логического {case 0: bmpX ++; перерыв;

Дело 1:

bmpX--; перерыв; } // эти 2 оператора if устанавливают логическое значение true или false if (bmpX == 0) {hitSide = 0; } if (bmpX == 96) // ширина экрана без машины {hitSide = 1; } // то же, что и выше для оси Y if (bmpY == 0) {hitTop = 0; } if (bmpY == 49) // высота экрана минус высота автомобиля {hitTop = 1; } переключатель (hitTop) {case 0: bmpY ++; перерыв; case 1: bmpY--; перерыв; }

}

Вы можете увидеть, как работает программа в прикрепленном видео

Шаг 6: создание гоночной игры

Image
Image

Сначала мы начнем с рисования нескольких разных автомобилей или препятствий, как на ранних этапах обучения, сделав их 30x15 пикселей. Затем мы конвертируем их в растровые изображения c и добавляем ссылки в коде.

#include // эти пути придется изменить в зависимости

// где вы храните файлы // редактируем: я только что узнал, если вы замените // на "", вам не потребуется полный путь // с вашими собственными библиотеками #include

#включают

#include #include

#включают

#include // https://github.com/adafruit/Adafruit-GFX-Library #include <Adafruit_SSD1306 //

Дисплей Adafruit_SSD1306 (128, 64); // определяем параметры отображения

определить переменные и фиксированные значения

// определяем входные контакты это контакты на Arduino, они никогда не меняются, поэтому # define # define INTPIN 3 // только контакты 2 и 3 могут быть прерваны контактами на UNO #define UPPIN 4 // это контакты, подключенные к соответствующему переключателю #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // определение направлений

#define DIRUP 1 // на эти значения "змея" смотрит, чтобы решить-

#define DIRDOWN 2 // направление, в котором будет двигаться змея #define DIRLEFT 3 #define DIRRIGHT 4

uint8_t dirPressed = 0; // значение для регистрации направления движения, на котором пин поднялся высоко

// логические значения запоминают, какой вывод стал высоким

bool BUTUP = 0; bool BUTDWN = 0; bool BUTLFT = 0; bool BUTRHT = 0; // переменные для позиции автомобиля uint8_t carPosX = 1; uint8_t carPosY = {0, 16, 32, 48}; // требуется значение, изменяющее массив

uint8_t lanePosArr = {0, 16, 32, 48}; // массив для хранения, где находится каждая полоса

uint8_t carPosYCnt = 0; uint8_t carYTmp = 0; // переменные для линий дороги uint8_t roadLineX1 = 51; // они предопределены в начале, тогда линии кажутся бесшовными uint8_t roadLineX2 = 102; uint8_t roadLineX3 = 153; uint8_t roadLineX4 = 254; uint8_t roadLineX5 = 200;

// на сколько пикселей перемещается игровая зона за раз

uint8_t drawSpeed = 4;

// переменные для врага0

uint8_t врага0PosX = 255; uint8_t врага0PosY = 0; uint8_t врага1PosX = 255; uint8_t врага1PosY = 0; uint8_t врага2PosX = 255; uint8_t врага2PosY = 0;

// возможность случайного присвоения номера полосы препятствиям

uint8_t laneGen = 0;

uint8_t laneGen0 = 0; uint8_t laneGen1 = 0; uint8_t laneGen2 = 0;

// счетчик очков

длинный счет = 0; // это оценка: / lol long compare = 0; // это сохраняет счет на последнем уровне для сравнения с длинным highScore = 25; uint8_t metreCnt = 0;

здесь мы запускаем функции

// это набор команд, если прерывание активировано void interruptressed () {delay (150); updateDirection (); } // обновляем значение в направлении var, проверяя DIR bools // -------------------------- UPDATE DIRECTION (player) - ------------------------- void updateDirection () {//Serial.println("updateDirection Called "); БУТУП = цифровое чтение (ВВЕРХ); BUTDWN = digitalRead (DWNPIN); BUTLFT = digitalRead (LFTPIN); BUTRHT = digitalRead (RHTPIN); если (BUTUP == true) {dirPressed = DIRUP; } если (BUTDWN == true) {dirPressed = DIRDOWN; } если (BUTLFT == true) {dirPressed = DIRLEFT; } если (BUTRHT == true) {dirPressed = DIRRIGHT; }

}

// ------------------------------- ПЕРЕМЕЩЕНИЕ МАШИНЫ --------------- -------------------------

// это обновит экран движущегося автомобиля спрайт

void moveCar ()

{переключатель (dirPressed) {case DIRUP: carPosYCnt--; carPosY [carPosYCnt]; тон (СНД, 100, 100); если (carPosYCnt == 255) {carPosYCnt = 0; } carYTmp = carPosY [carPosYCnt]; dirPressed = 0; // Serial.println ("carPosY up"); // Serial.println (carPosYCnt); перерыв; case DIRDOWN: carPosYCnt ++; тон (СНД, 100, 100); если (carPosYCnt == 4) {carPosYCnt = 3; } // Serial.println ("carPosY"); // Serial.println (carPosYCnt); carYTmp = carPosY [carPosYCnt]; dirPressed = 0; перерыв; // закомментировал автомобиль, способный двигаться влево и вправо, обнаружение столкновений пока не очень хорошо / * case DIRLEFT: carPosX--; если (carPosX == 0) {carPosX = 1; } // Serial.println ("carPosX"); // Serial.println (carPosX); dirPressed = 0; перерыв; * / case DIRRIGHT: // просто для удовольствия, если вы нажмете вправо, игра издаст шумовой сигнал (SND, 100, 50); // carPosX ++; // если (carPosX == 128) // {// carPosX = 127; //} // Serial.println ("carPosX"); // Serial.println (carPosX); // dirPressed = 0; перерыв; } updateDisplay (); }

// -------------------------- СЛУЧАЙНОЕ ПОЛОЖЕНИЕ X ------------------- -----------

uint8_t randomPosX () // эти 2 подпрограммы просто генерируют случайную позицию для препятствий

{uint8_t posValTmp = 0; posValTmp = random (129, 230); //Serial.println("random x "); //Serial.println(posValTmp); возврат (posValTmp); }

// --------------------------- СЛУЧАЙНОЕ ПОЛОЖЕНИЕ Y ------------------ ------------------

uint8_t randomPosY ()

{uint8_t laneVal = 0; laneVal = random (0, 4); // добавляем дополнительную полосу для случайности, т.е. на ней нет объекта на экране //Serial.println("RandomY "); //Serial.println(lanePosArr[laneVal]); возврат (lanePosArr [laneVal]); }// ------------------------------- УСТАНОВИТЬ СКОРОСТЬ ИГРЫ -------------- -------------- void setGameSpeed () // это останавливает уровень выше 20, что делает игру неиграбельной {если (drawSpeed <21) {drawSpeed = drawSpeed + 2; }}// ------------------------------------ ОБНАРУЖЕНИЕ АВАРИИ ---------- ----------------------- void detectCrash () {

если (враг0PosX = 0 && враг0PosY == carYTmp)

{// Serial.println ("Игра завершена CRAASSSSHHHHHHHEEEEDDD в трафике 0"); игра закончена(); } if (неприятель1PosX = 0 && враг1PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD в трафик 1 "); игра закончена(); } if (неприятель2PosX = 0 && враг2PosY == carYTmp) {//Serial.println("Game Over CRAASSSSHHHHHHEEEEDDD в трафик 2 "); игра закончена(); }}

это процедуры, которые рисуют дисплей.

// ------------------------------- НАРИСОВАТЬ ДОРОГУ --------------- --------------------- void drawRoad () // X, Y, длина, ширина {display.fillRect (roadLineX1, 15, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX1, 30, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX1, 45, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX2, 15, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX2, 30, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX2, 45, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX3, 15, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX3, 30, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX3, 45, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX4, 15, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX4, 30, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX4, 45, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX5, 15, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX5, 30, 30, 4, БЕЛЫЙ); display.fillRect (roadLineX5, 45, 30, 4, БЕЛЫЙ);

roadLineX1 = roadLineX1-drawSpeed;

roadLineX2 = roadLineX2-drawSpeed; roadLineX3 = roadLineX3-drawSpeed; roadLineX4 = roadLineX4-drawSpeed; roadLineX5 = roadLineX5-drawSpeed; display.display (); } // ----------------------------------------- НАБИРАЕМ врагов ---- --------------------------------------- пустые врагиDraw () {// X, Y, bmp имя, ширина, высота, цвет display.drawBitmap (враги0PosX, враги0PosY, ENEMY0, ENEMY0_WIDTH, ENEMY0_HEIGHT, 1); Враг0ПосХ = Враг0ПосХ-drawSpeed; display.drawBitmap (враги1PosX, враги1PosY, ENEMY1, ENEMY1_WIDTH, ENEMY1_HEIGHT, 1); Враг1PosX = враг1PosX-drawSpeed; display.drawBitmap (враги2PosX, враги2PosY, ENEMY2, ENEMY2_WIDTH, ENEMY2_HEIGHT, 1); Враг2ПосХ = Враг2ПосХ-drawSpeed; display.display (); если (враг0PosX> 231 && враг0PosX231 && враг1PosX <255) {враг1PosX = randomPosX (); Враг1PosY = randomPosY (); checkDuplicate (); }

если (враг2PosX> 231 && враг2PosX <255) {враг2PosX = randomPosX (); Враг2PosY = randomPosY (); }} // ------------------------------------ ДИСПЛЕЙ ОБНОВЛЕНИЯ -------- ---------------------------------------- void updateDisplay () {display.clearDisplay (); display.drawBitmap (carPosX, carPosY [carPosYCnt], CARSPRITE, 30, 15, 1); display.fillRect (100, 0, 28, 10, ЧЕРНЫЙ); display.setCursor (100, 0); display.setTextColor (БЕЛЫЙ, ЧЕРНЫЙ); display.println (оценка); display.display ();

}

// ------------------------- ждем цикла нажатий ------------------- ------

// это код домашнего экрана void waitForPress () {splashScreen (); логическое ожидание = 0; // цикл заканчивается, когда это правда display.clearDisplay (); пока (ожидание == 0) {

display.fillRect (19, 20, 90, 32, ЧЕРНЫЙ); // пустой фон для текста

display.setTextColor (БЕЛЫЙ); display.setCursor (23, 24); display.setTextSize (0); display.println («Безрассудный»); display.setCursor (36, 34); display.println («Гонщик»); display.drawBitmap (74, 24, CARSPRITE, CARWIDTH, CARHEIGHT, 1); // x y w h r col display.drawRoundRect (21, 21, 86, 23, 4, БЕЛЫЙ); // граница змейки display.drawRect (19, 20, 90, 33, БЕЛЫЙ); // рамка рамки - 3 display.setCursor (25, 43); display.setTextSize (0); // возврат шрифта к нормальному display.println ("нажать любую клавишу"); display.fillRect (0, 0, 127, 8, ЧЕРНЫЙ); display.setCursor (10, 0); display.print («Рекорд:»); // отображение рекордов display.print (highScore); display.display (); ожидание = digitalRead (INTPIN); // проверяем, изменится ли ожидание нажатой клавиши на 1, заканчивающееся в то время как dirPressed = 0; // кнопка сброса нажимается без направления}} // -------------------------------------- ----- ОБНОВЛЕНИЕ ИГРЫ ----------------------------------------- void updateGame () {moveCar (); drawRoad (); NemysDraw (); // враг1Draw (); // Враг2Draw (); metreCnt ++; detectCrash (); if (metreCnt == 5) // добавляет очко за каждые 10 циклов, чтобы увеличить счет {metreCnt = 0; оценка ++; } if (score == compare + 5) // ускоряет игру каждые 5 очков до максимальной скорости 20 {compare = score; setGameSpeed (); } noTone (SND); updateDisplay ();

}

// ------------------------------ ИГРА ЗАКОНЧЕНА---------------- ------------------------------

// эта процедура рисует линии вокруг машины мертвого героя, а затем отображает экран окончания игры

void gameOver ()

{тон (СНД, 200, 200); // проигрываем звук uint8_t linePosX, linePosY, pixwidth, pixheight = 0; // устанавливаем переменные для рисования прямоугольников вокруг машины linePosX = carPosY; linePosY = carYTmp; pixwidth = 30; pixheight = 15; display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); for (int i = 0; i <= 26; i ++) // это окружает автомобиль прямоугольниками, имитирующими взрыв {linePosX = linePosX-2; linePosY = linePosY-2; ширина пикселя = ширина пикселя + 4; pixheight = pixheight + 4; display.drawRect (linePosX, linePosY, pixwidth, pixheight, ЧЕРНЫЙ); display.drawRect (linePosX, linePosY, pixwidth, pixheight, WHITE); display.display (); тон (СНД, i * 20, 50); задержка (10); } display.setTextSize (2); display.setTextColor (БЕЛЫЙ, ЧЕРНЫЙ); display.setCursor (10, 23); тон (СНД, 50, 500); display.print («ИГРА»); display.display (); задержка (500); тон (СНД, 40, 500); display.print («НАВЕРХ»); display.setTextSize (0); display.display (); задержка (3000); restartGame (); waitForPress (); }

// ----------------------------------------- ПЕРЕЗАПУСК ИГРЫ ----- -------------------------------------------------- -----

void restartGame () // копирует рекорды, сбрасывает всю статистику и генерирует случайные позиции

{if (score> = highScore) // проверяем, выше ли результат, чем high score {highScore = score; // одиночный, если статус для обновления рекорда}

оценка = 0;

drawSpeed = 4; metreCnt = 0; carPosYCnt = 0; Враг0PosX = randomPosX (); Враг0PosY = randomPosY (); Враг1PosX = randomPosX (); Враг1PosY = randomPosY (); Враг2PosX = randomPosX (); Враг2PosY = randomPosY (); noTone (SND);

checkDuplicate ();

}

// ------------------------------------------------ - ПРОВЕРИТЬ ДУБЛИРОВАНИЕ ----------------------------------------------- ------ void checkDuplicate () // они проверяют, занимают ли препятствия одно и то же игровое пространство {// Serial.println ("duplicate checked"); если (враг2PosX> 230 && враг2PosX <255) {в то время как (враг2PosY == враг1PosY || враг2PosY == враг0PosY) {Враг2PosY = randomPosY (); }}

если (враг0PosX> 230 && враг0PosX230 && враг2PosXenemy1PosX && враг2PosX230 && враг0PosXenemy1PosX && враг0PosX

//------------------------------------------- ЗАСТАВКА --- --------------------------------

пустота splashScreen ()

{display.clearDisplay (); display.drawBitmap (0, 0, АВАРИЯ, АВАРИЙНАЯ ШИРИНА, АВАРИЙНАЯ ВЫСОТА, 1); display.display (); задержка (2000); } // ----------------------------------------------- НАСТРАИВАТЬ ------------------------------------------------- ----------- void setup () {delay (100); // пусть все заработает // Serial.begin (9600); // раскомментируем это и все Serial. команды для диагностики неисправностей display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); display.setTextColor (БЕЛЫЙ, ЧЕРНЫЙ); display.setTextWrap (ложь); display.dim (0); pinMode (ВХОД, ВХОД); pinMode (UPPIN, INPUT); pinMode (DWNPIN, ВХОД); pinMode (LFTPIN, ВХОД); pinMode (RHTPIN, ВХОД);

attachInterrupt (digitalPinToInterrupt (INTPIN), прерывание, RISING);

// случайным образом размещаем препятствия противнику0PosX = randomPosX (); Враг0PosY = randomPosY (); Враг1PosX = randomPosX (); Враг1PosY = randomPosY (); Враг2PosX = randomPosX (); Враг2PosY = randomPosY (); checkDuplicate (); // проверка на наличие повторяющихся местоположений // Serial.println ("setup Complete"); заставка(); waitForPress (); } // ----------------------------------------------- ----- ПЕТЛЯ -------------------------------------------- ----------

пустой цикл ()

{updateGame (); }

и это все, любые изменения и отзывы будут приветствоваться. Проблемы, которые нам нужно решить, чтобы устранить мерцание экрана, нам нужно изучить, как его уменьшить, и вражеские машины по-прежнему могут занимать то же пространство.

Рекомендуемые: