Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Игра Arduino Touch Breakout

Компоненты и расходные материалы

Arduino UNO
× 1
AZ-Delivery 2.4 TFT LCD сенсорный дисплей Arduino Shield
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Это небольшая версия классической видеоигры для Arduino UNO и TFT LCD экрана (240x320 пикселей), драйвер ILI9341 с 8-битной параллельной связью.

Игра

В этом разделе есть несколько экранов с различными настраиваемыми строками и столбцами кирпичей, до восьми строк, причем каждые две строки имеют разный цвет, который можно запрограммировать или выключить с помощью различных шаблонов. Используя единственный мяч, используя сенсорную панель, игрок должен сбить как можно больше кирпичей, используя стены и / или ракетку внизу, чтобы отрикошетить мяч от кирпичей и уничтожить их. Если ракетка игрока не попадает в отскок мяча, игрок теряет ход.

Каждый кирпичик ряда приносит разные очки.

  uint8_t pointsForRow [] ={7, 7, 5, 5, 3, 3, 1, 1};  

На каждом уровне можно настроить размер ракетки и размер мяча. Скорость мяча увеличивается с каждым ударом, вы можете настроить начальную скорость для каждого экрана. В зависимости от того, каким острием ракетки ударяется по мячу, горизонтальная скорость также изменяется

Вы можете определить как новые экраны с разными рисунками стен:

Как играть

Держите устройство руками и большими пальцами по экрану переместите ракетку влево или вправо.

Определите новый экран

Эта структура используется для определения нового экрана:

  typedef struct game_type {
int Ballize;
int playerwidth;
int playerheight;
int exponent;
int top;
int row;
int columns;
int brickGap;
int живет;
int wall [GAMES_NUMBER];
int initVelx;
int initVely;
} game_type;

и добавить в набор новый экран:

  game_type games [GAMES_NUMBER] =
// размер шара, ширина игрока, высота игрока, показатель степени, верх, строки, столбцы, brickGap, жизни, стена [8], initVelx, initVely
{
{10, 60, 8, 6, 40, 8, 8, 3, 3, {0x18, 0x66, 0xFF, 0xDB, 0xFF, 0x7E, 0x24, 0x3C}, 28, -28},

Образец стены

Образец стены определяется как массив 8x8 бит

эдж.

  {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}  

что соответствует этому битовому массиву

  1,0,1,0,1,0,1,0 
1,0,1,0,1,0,1,0
1,0,1, 0,1,0,1,0
1,0,1,0,1,0,1,0
1,0,1,0,1,0,1,0
1,0,1,0,1,0,1,0
1,0,1,0,1,0,1,0
1,0,1,0,1,0 , 1,0

Изготовим эту стену, обратите внимание, что она зеркальная:

Аппаратное обеспечение

В этом проекте используется 2,4-дюймовый TFT ЖК-дисплей AZ-Delivery с резистивным 4-проводным сенсорным экраном и встроенным устройством чтения SD-карт. AZ-Delivery 2,4-дюймовый TFT ЖК-дисплей.

Подробнее об этом щите в моей статье «Дорожные испытания сенсорного ЖК-дисплея AZ-Delivery 2, 4 TFT»

Сборка щита

Вам нужно только подключить экран к Aduino.

Библиотеки

  #include  // Базовая графическая библиотека 
#include
#include

Калибровка сенсорного экрана

Вы должны откалибровать дисплей так, чтобы информация о местоположении была правильной при прикосновении к дисплею. Библиотека MCUFriend_kbv предоставляет пример с именем «TouchScreen_Calibr_native». В примере результаты отправляются на последовательный порт. Запустите последовательный монитор IDE Arduino, чтобы вы могли скопировать код, сгенерированный в примере.

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

Для этого проекта вам понадобятся данные для «калибровки портрета».

  TouchScreen.h Калибровка GFX 
Создание всех выводов управления и шины INPUT_PULLUP
Типичное аналоговое подтягивание 30k с соответствующим выводом
будет считаться низким, когда цифровое значение записано LOW
например читает ~ 25 для направления X 300R
например читает ~ 30 для направления 500R Y
Тестирование:(A2, D8) =26
Тестирование:(A3, D9) =28
ID =0x9341
cx =153 cy =103 cz =534 X, Y, Давление
cx =150 cy =475 cz =406 X, Y, Давление
cx =155 cy =868 cz =231 X, Y, Давление
cx =517 cy =103 cz =561 X, Y, давление
cx =535 cy =855 cz =364 X, Y, давление
cx =884 cy =88 cz =650 X, Y, давление
cx =908 cy =478 cz =557 X, Y, давление
cx =902 cy =864 cz =488 X, Y, давление
*** КОПИРОВАНИЕ-ВСТАВКА из последовательного терминала:
const int XP =8, XM =A2, YP =A3, YM =9; // 240x320 ID =0x9341
const int TS_LEFT =118, TS_RT =931, TS_TOP =72, TS_BOT =887;
КАЛИБРОВКА ПОРТРЕТА 240 x 320
x =map (px, LEFT =118 , RT =931, 0, 240)
y =map (py, TOP =72, BOT =887, 0, 320)
ЛАНДШАФТНАЯ КАЛИБРОВКА 320 x 240
x =map (py, LEFT =72, RT =887, 0, 320)
y =map (px, TOP =931, BOT =118, 0, 240)

Анимация

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

pos + =vel * dt;

Избегайте арифметики с плавающей запятой

Разрешение ILI9341 составляет 240 x 320, поэтому нам нужны два 9-битных целых числа для ссылки на пиксель на экране. Использование 16-битных целых чисел позволяет освободить 6 бит для представления десятичной части.

нннн нннн нндд дддд

Мы называем это число 6 двоичной экспонентой. И мы можем использовать эти шесть битов, чтобы иметь десятичную часть в диапазоне от 0,000 до 0,63. Таким образом, мы можем использовать целочисленную математику, избегая арифметики с плавающей запятой.

Чтобы получить целую часть числа, делаем арифметический сдвиг вправо.

число>> показатель

  state.ballx + =state.velx; 
state.bally + =state.vely;

// проверяем столкновения мячей и выходим
checkBallCollisions (game , &state, state.ballx>> game-> exponent, state.bally>> game-> exponent);
checkBallExit (game, &state, state.ballx>> game-> exponent, state.bally>> game -> экспонента);

Демо-режим

Раскомментируйте директиву Define, и ракетка будет следовать за мячом, как показано в демонстрационных видеороликах:

  #define DEMO_MODE  

Наслаждайтесь!

Создавайте новые выкройки и уровни и делитесь ими!

Код

  • Прорыв Arduino
Arduino Breakout Arduino
 / * Arduino Touch TFT Breakout Классическая игра для прорыва Необходимые детали:Ardunio UNO AZ-Delivery 2.4 TFT LCD сенсорный дисплей Arduino Shield или совместимый. Этот пример кода находится в открытом доступе. Изменено 07.11.2020 Энрике Альбертос * /// #define DEMO_MODE # include  // Базовая графическая библиотека # include  #include  #define BLACK 0x0000 #define BLUE 0x001F # define КРАСНЫЙ 0xF800 # определить ЗЕЛЕНЫЙ 0x07E0 # определить CYAN 0x07FF # определить MAGENTA 0xF81F # определить ЖЕЛТЫЙ 0xFFE0 # определить БЕЛЫЙ 0xFFFF # определить PRIMARY_COLOR 0x4A11 # определить PRIMARY_LIGHT_COLOR 0x7A17 # определить PRIMARY_LIGHT_COLOR 0x7TORCOLOR_COLOR 0x7A17 # определить PRIMARY_FF_DARK40 // определить PRIMARY_FOR_COL_COL_C16 #define LCD_CD A2 // Команда / данные переходят в аналоговый 2 # define LCD_WR A1 // Запись ЖК-дисплея переходит в аналоговый 1 # define LCD_RD A0 // Считывание ЖК-дисплея переходит в аналоговый 0 # define LCD_RESET A4 // Альтернативно можно просто подключиться к сбросу Arduino pinAdafruit_TFTLCD tft (LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); # define LOWFLASH (defined (__ AVR_ATmega328P__) &&defined (MCUFRIEND_KBV_H _)) // Порог давления сенсорного экрана # define MIN_PRESSURE 40 # // define 8, XM =A2, YP =A3, YM =9; // 240x320 ID =0x9341const int16_t TS_LEFT =122, TS_RT =929, TS_TOP =77, TS_BOT =884; const TouchScreen ts =TouchScreen (XP, YP, XM, YM, 300); # определить SCORE_SIZE 30char ScoreFormat [] ="% 04d "; typedef struct gameSize_type {int16_t x, y, width, height;} gameSize_type; gameSize_type gameSize; uint16_t backgroundColor =BLACK; int level; const uint8_t BIT_MASK [] ={0x01, 0x02, 0x04, 0x40x20, 0x10, 0x04, 0x40x20, 0x10, 0x04, 0x08, 0x10, , 0x80}; uint8_t pointsForRow [] ={7, 7, 5, 5, 3, 3, 1, 1}; # определить GAMES_NUMBER 16typedef struct game_type {int Ballize; int playerwidth; int playerheight; int показатель степени; int top; int rows; int columns; int brickGap; int живет; внутренняя стена [GAMES_NUMBER]; int initVelx; int initVely;} game_type; game_type games [GAMES_NUMBER] =// размер шара, ширина игрока, высота игрока, показатель степени, верх, строки, столбцы, brickGap, жизни, стена [8], initVelx, initVely {{10, 60, 8, 6, 40, 8, 8, 3, 3, {0x18, 0x66, 0xFF, 0xDB, 0xFF, 0x7E, 0x24, 0x3C}, 28, -28}, {10, 50, 8, 6, 40, 8, 8, 3 , 3, {0xFF, 0x99, 0xFF, 0xE7, 0xBD, 0xDB, 0xE7, 0xFF}, 28, -28}, {10, 50, 8, 6, 40, 8, 8, 3, 3, {0xAA, 0x55 , 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, 28, -28}, {8, 50, 8, 6, 40, 8, 8, 3, 3, {0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF}, 34, -34}, {10, 40, 8, 6, 40, 8, 8, 3, 3, {0xFF, 0xAA, 0xAA, 0xFF, 0xFF, 0xAA, 0xAA, 0xFF}, 28, -28}, {10, 40, 8, 6, 40, 8, 8, 3, 3, {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}, 28, -28}, { 12, 64, 8, 6, 60, 4, 2, 3, 4, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 20, -20}, {12, 60, 8, 6 , 60, 5, 3, 3, 4, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 22, -22}, {10, 56, 8, 6, 30, 6, 4, 3, 4, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 24, -24}, {10, 52, 8, 6, 30, 7, 5, 3, 4, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 26, -26 }, {8, 48, 8, 6, 30, 8, 6, 3, 3, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 28, -28}, {8, 44, 8, 6, 30, 8, 7, 3, 3, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 30, -30}, {8, 40, 8, 6, 30, 8 , 8, 3, 3, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 32, -32}, {8, 36, 8, 6, 40, 8, 8, 3, 3, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 34, -34}, {8, 36, 8, 6, 40, 8, 8, 3, 3, {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}, 34, -34}}; game_type * game; typedef struct game_state_type {uint16_t ballx; uint16_t bally; uint16_t ballxold; uint16_t жирным шрифтом; int velx; int vely; int playerx; int playerxold; int wallState [8]; int score; int ОстающийсяЖивес; int top; int bottom; int walltop; int wallbottom; int brickheight; int brickwidth;}; game_state_type состояние; ///////////////////////////////////////////// ////////////////////// НАСТРОЙКА ARDUINO ////////////////////////// //////////////////////////////////// void setup () {initTft (tft); gameSize ={0, 0, tft.width (), tft.height ()}; newGame (&games [0], &state, tft);} ///////////////////////////////////// /////////////////////////// ARDUINO LOOP ///////////////////// ///////////////////////////////////////// int selection =-1; void loop ( void) {selection =readUiSelection (игра, &состояние, выбор); drawPlayer (игра, &состояние); // сохраняем старую позицию для удаления старых пикселей state.playerxold =state.playerx; // вычисляем новое положение мяча x1 =x0 + vx * dt // проверяем максимальную скорость if (abs (state.vely)> ((1 < exponent) - 1)) {state.vely =((1 <<игра-> показатель степени) - 1) * ((state.vely> 0) - (state.vely <0)); } if (abs (state.velx)> ((1 < exponent) - 1)) {state.velx =((1 < exponent) - 1) * ((state.velx> 0 ) - (state.velx <0)); } state.ballx + =state.velx; state.bally + =state.vely; // проверяем столкновения мячей и выходим из checkBallCollisions (game, &state, state.ballx>> game-> exponent, state.bally>> game-> exponent); checkBallExit (игра, &состояние, state.ballx>> game-> exponent, state.bally>> game-> exponent); // рисуем мяч в новой позиции drawBall (state.ballx>> game-> exponent, state.bally>> game-> exponent, state.ballxold>> game-> exponent, state.ballyold>> game-> exponent, game -> размер шара); // сохраняем старую позицию для удаления старых пикселей state.ballxold =state.ballx; state.ballyold =state.bally; // увеличиваем скорость state.velx =(20 + (state.score>> 3)) * ((state.velx> 0) - (state.velx <0)); state.vely =(20 + (state.score>> 3)) * ((state.vely> 0) - (state.vely <0)); // если кирпичи не переходят на следующий уровень if (noBricks (game, &state) &&level  жизни, состояние-> оставшиеся жизни); updateScore (состояние-> оценка); setupWall (игра, состояние); touchToStart (); clearDialog (gameSize); updateLives (игра-> жизни, состояние-> оставшиеся жизни); updateScore (состояние-> оценка); setupWall (game, state);} void setupStateSizes (game_type * game, game_state_type * state, Adafruit_TFTLCD &tft) {state-> bottom =tft.height () - 30; state-> brickwidth =tft.width () / game-> columns; state-> brickheight =tft.height () / 24;} void setupState (game_type * game, game_state_type * state, Adafruit_TFTLCD &tft) {setupStateSizes (игра, состояние, tft); для (int я =0; я <игра-> строк; я ++) {состояние-> wallState [я] =0; } state-> playerx =tft.width () / 2 - game-> playerwidth / 2; состояние-> Остальные Жизни =игра-> Жизни; состояние-> балли =состояние-> дно <<игра-> экспонента; состояние-> жирный шрифт =состояние-> дно <<игра-> показатель; состояние-> velx =игра-> initVelx; state-> vely =game-> initVely;} void updateLives (int живет, int осталосьLives) {for (int i =0; i <живет; i ++) {tft.fillCircle ((1 + i) * 15, 15, 5 , ЧЕРНИТЬ); } for (int я =0; я <оставшиеся жизни; я ++) {tft.fillCircle ((1 + i) * 15, 15, 5, ЖЕЛТЫЙ); }} void setupWall (game_type * game, game_state_type * state) {int colors [] ={КРАСНЫЙ, КРАСНЫЙ, СИНИЙ, СИНИЙ, ЖЕЛТЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ЗЕЛЕНЫЙ}; состояние-> walltop =game-> top + 40; состояние-> нижняя стенка =состояние-> верх стены + игра-> строки * состояние-> высота кирпича; for (int i =0; i  rows; i ++) {for (int j =0; j  columns; j ++) {if (isBrickIn (game-> wall, j, i)) {setBrick (состояние-> wallState, j, i); drawBrick (состояние, j, i, цвета [i]); }}}} void drawBrick (game_state_type * state, int xBrick, int yBrickRow, uint16_t backgroundColor) {tft.fillRect ((state-> brickwidth * xBrick) + game-> brickGap, state-> walltop + (state-> brickheight * yBrickRow) + game-> brickGap, state-> brickwidth - game-> brickGap * 2, state-> brickheight - game-> brickGap * 2, backgroundColor);} логическое noBricks (game_type * game, game_state_type * state) {for ( int i =0; i  rows; i ++) {if (state-> wallState [i]) return false; } return true;} void drawPlayer (game_type * game, game_state_type * state) {// краска tft.fillRect (state-> playerx, state-> bottom, game-> playerwidth, game-> playerheight, ЖЕЛТЫЙ); if (state-> playerx! =state-> playerxold) {// удаляем старые пиксели if (state-> playerx  playerxold) {tft.fillRect (state-> playerx + game-> playerwidth, state-> bottom , abs (состояние-> playerx - состояние-> playerxold), game-> playerheight, backgroundColor); } else {tft.fillRect (state-> playerxold, state-> bottom, abs (state-> playerx - state-> playerxold), game-> playerheight, backgroundColor); }}} void drawBall (int x, int y, int xold, int yold, int Ballize) {// удаляем старые пиксели // if (xold! =x &&yold! =y) {if (xold <=x &&yold <=y) {tft.fillRect (xold, yold, Ballize, y - yold, ЧЕРНЫЙ); tft.fillRect (xold, yold, x - xold, Ballize, ЧЕРНЫЙ); } else if (xold> =x &&yold> =y) {tft.fillRect (x + ballize, yold, xold - x, ballize, ЧЕРНЫЙ); tft.fillRect (xold, y + Ballize, Ballize, yold - y, ЧЕРНЫЙ); } else if (xold <=x &&yold> =y) {tft.fillRect (xold, yold, x - xold, Ballize, ЧЕРНЫЙ); tft.fillRect (xold, y + Ballize, Ballize, yold - y, ЧЕРНЫЙ); } иначе, если (xold> =x &&yold <=y) {tft.fillRect (xold, yold, Ballize, y - yold, ЧЕРНЫЙ); tft.fillRect (x + размер шара, yold, xold - x, размер шара, ЧЕРНЫЙ); } // закрашиваем новый шар tft.fillRect (x, y, Ballize, Ballize, ЖЕЛТЫЙ); //}} void touchToStart () {drawBoxedString (0, 200, «ВЫРЫВ», 3, ЖЕЛТЫЙ, ЧЕРНЫЙ); drawBoxedString (0, 240, «НАЧАТЬ НАПРЯЖЕНИЕ», 2, КРАСНЫЙ, ЧЕРНЫЙ); while (waitForTouch () <0) {}} void gameOverTouchToStart () {drawBoxedString (0, 180, «ИГРА ЗАВЕРШЕНА», 3, ЖЕЛТЫЙ, ЧЕРНЫЙ); drawBoxedString (0, 220, «НАЧАТЬ НАЧАТЬ», 2, КРАСНЫЙ, ЧЕРНЫЙ); while (waitForTouch () <0) {}} void updateScore (int score) {char buffer [5]; snprintf (буфер, sizeof (буфер), ScoreFormat, Score); drawBoxedString (tft.width () - 50, 6, buffer, 2, YELLOW, PRIMARY_DARK_COLOR);} void checkBrickCollision (game_type * game, game_state_type * state, uint16_t x, uint16_t y) {int x1 =x + game-> ballsize; int y1 =y + game-> размер шара; int collissions =0; столкновения + =checkCornerCollision (игра, состояние, x, y); столкновения + =checkCornerCollision (игра, состояние, x1, y1); столкновения + =checkCornerCollision (игра, состояние, x, y1); столкновения + =checkCornerCollision (игра, состояние, x1, y); если (столкновения> 0) {состояние-> vely =(-1 * состояние-> vely); if ((((x% state-> brickwidth) ==0) &&(state-> velx <0)) || ((((x + game-> ballize)% state-> brickwidth) ==0) &&(состояние-> velx> 0))) {состояние-> velx =(-1 * состояние-> velx); }}} int checkCornerCollision (game_type * game, game_state_type * state, uint16_t x, uint16_t y) {if ((y> state-> walltop) &&(y  wallbottom)) {int yBrickRow =(y - state-> стена) / состояние-> высота кирпича; int xBrickColumn =(x / состояние-> ширина кирпича); если (isBrickIn (состояние-> wallState, xBrickColumn, yBrickRow)) {hitBrick (состояние, xBrickColumn, yBrickRow); возврат 1; }} return 0;} void hitBrick (game_state_type * state, int xBrick, int yBrickRow) {состояние-> оценка + =pointsForRow [yBrickRow]; drawBrick (состояние, xBrick, yBrickRow, БЕЛЫЙ); задержка (16); drawBrick (состояние, xBrick, yBrickRow, СИНИЙ); задержка (8); drawBrick (состояние, xBrick, yBrickRow, backgroundColor); unsetBrick (состояние-> wallState, xBrick, yBrickRow); updateScore (state-> score);} void checkBorderCollision (game_type * game, game_state_type * state, uint16_t x, uint16_t y) {// проверяем столкновение со стеной if (x + game-> Ballize> =tft.width ()) {state -> velx =-abs (состояние-> velx); } if (x <=0) {состояние-> velx =abs (состояние-> velx); } if (y <=SCORE_SIZE) {состояние-> vely =abs (состояние-> vely); } if (((y + game-> ballize)> =state-> дно) &&((y + game-> ballize) <=(state-> bottom + game-> playerheight)) &&(x> =state-> playerx) &&(x <=(state-> playerx + game-> playerwidth))) {// изменить vel x возле границ игрока if (x> (state-> playerx + game-> playerwidth - 6)) {state -> velx =state-> velx - 1; } иначе, если (x <состояние-> playerx + 6) {состояние-> velx =состояние-> velx + 1; } state-> vely =-abs (состояние-> vely); }} void checkBallCollisions (game_type * game, game_state_type * state, uint16_t x, uint16_t y) {checkBrickCollision (game, state, x, y); checkBorderCollision (game, state, x, y);} void checkBallExit (game_type * game, game_state_type * state, uint16_t x, uint16_t y) {if (((y + game-> ballize)> =tft.height ())) {состояние-> оставшиеся жизни-; updateLives (игра-> жизни, состояние-> оставшиеся жизни); задержка (500); состояние-> vely =-abs (состояние-> vely); }} void setBrick (int wall [], uint8_t x, uint8_t y) {wall [y] =wall [y] | BIT_MASK [x];} void unsetBrick (int wall [], uint8_t x, uint8_t y) {wall [y] =wall [y] &~ BIT_MASK [x];} логическое isBrickIn (int wall [], uint8_t x, uint8_t y) {return wall [y] &BIT_MASK [x];} /////////////////////////////////// /////////////////////////////// НАСТРОЙКА TFT /////////////////// /////////////////////////////////////////// void initTft (Adafruit_TFTLCD &tft) {tft.reset (); uint16_t ID =tft.readID (); tft.begin (ID); tft.setRotation (0);} ////////////////////////////////////////// ////////////////////// Методы рисования экрана ///////////////////////// ////////////////////////////////////// ** Печать текста передним цветом поверх заполненного поля с фоновый цвет. Размер прямоугольника рассчитывается с учетом всего текста без полей @param x горизонтальная координата в точках в левом верхнем углу @param y вертикальная координата в точках в левом верхнем углу @param fontsize размер шрифта текста для печати @param foreColor передний цвет текста для печати @param backgroundColor цвет заполненного прямоугольника @return void * / void drawBoxedString (const uint16_t x, const uint16_t y, const char * string, const uint16_t fontsize, const uint16_t foreColor, const uint16_t backgroundColor) {tft.setTextSize (fontsize); int16_t x1, y1; uint16_t w, h; tft.getTextBounds (строка, x, y, &x1, &y1, &w, &h); tft.fillRect (x, y, w, h, backgroundColor); tft.setCursor (x, y); tft.setTextColor (foreColor); tft.print (string);} / ** Очистить экран до фона по умолчанию @param void @return void * / void clearDialog (gameSize_type gameSize) {tft.fillRect (gameSize.x, gameSize.y, gameSize.width, gameSize .height, backgroundColor); tft.fillRect (gameSize.x, gameSize.y, gameSize.width, SCORE_SIZE, PRIMARY_DARK_COLOR);} //////////////////////////// //////////////////////////////////// ПРОЧИТАЙТЕ ВЫБОР пользовательского интерфейса /////////// ////////////////////////////////////////////////// // * Проверяет, выбирает ли пользователь какой-либо из видимых включенных элементов пользовательского интерфейса. Вызывается обратный вызов onTap для выбранного элемента, и он устанавливается как нажатый @param lastSelected последний выбор @ возвращает новый выбор * / int readUiSelection (game_type * game, game_state_type * состояние, const int16_t lastSelected) {int16_t xpos, ypos; // координаты экрана TSPoint tp =ts.getPoint (); //tp.x, tp.y - значения АЦП, // если выводы используются совместно, вам необходимо исправить направления выводов сенсорного экрана pinMode (XM, OUTPUT); pinMode (YP, ВЫХОД); // у нас есть минимальное давление, которое мы считаем допустимым // давление 0 означает отсутствие нажатия! если (tp.z> MINPRESSURE &&tp.z  tft.width () / 2) {состояние-> playerx + =2; } else {состояние-> playerx - =2; } if (state-> playerx> =tft.width () - game-> playerwidth) state-> playerx =tft.width () - game-> playerwidth; если (состояние-> playerx <0) state-> playerx =0; возврат 1; } #ifdef DEMO_MODE state-> playerx =(state-> ballx>> game-> exponent) - game-> playerwidth / 2; if (state-> playerx> =tft.width () - game-> playerwidth) state-> playerx =tft.width () - game-> playerwidth; if (state-> playerx <0) state-> playerx =0; #endif return -1;} int waitForTouch () {int16_t xpos, ypos; // координаты экрана TSPoint tp =ts.getPoint (); //tp.x, tp.y - значения АЦП, // если выводы используются совместно, вам необходимо исправить направления выводов сенсорного экрана pinMode (XM, OUTPUT); pinMode (YP, ВЫХОД); // у нас есть минимальное давление, которое мы считаем допустимым // давление 0 означает отсутствие нажатия! if (tp.z> MINPRESSURE &&tp.z  

Схема


Производственный процесс

  1. Игра с гироскопом Arduino с MPU-6050
  2. Игра Arduino Pong - OLED-дисплей
  3. Портативное емкостное сенсорное пианино
  4. Игровой контроллер Arduino
  5. Игра Arduino Pong на матрице 24x16 с MAX7219
  6. Игра Giant Animatronics Lego Minfig Operation Game
  7. Беспроводные MIDI-адаптеры USB-BLE
  8. Игра Pixel Chaser
  9. Распознавание и синтез речи с помощью Arduino
  10. Автоматизированная игра Дино с использованием arduino