Я пытаюсь сделать что то вроде видеоигры с Arduino UNO
это школьный проект, но у меня есть некоторые проблемы с выбором меню. В ЖК-дисплее все символы перезаписываются, я начинающий, поэтому я не имею ни малейшего представления о том, что я делал неправильно (ps.: извините за мой английский, я бразилец. Вот код: //Портативный игровой проект "atari", включающий в себя 3 игры
#include <LiquidCrystal.h>
//define os pinos a ser utilizados no arduino uno,etc.
#define btcima 9
#define btbaixo 8
#define bttiro 10
#define menu 11
LiquidCrystal lcd(7,6,5,4,3,2);
int vel=100;
int pxnave,pynave,pxaste,pyaste,pxtiro,pytiro;//px=posição x, py=posição y, etc
bool game1,game2,game3,vtiro;//vtiro=variavel de tiro
int pontos;
int maxpontos=15;
int vtela;
byte nave[8]={B00000,B01100,B00110,B11111,B00110,B01100,B00000,B00000};
byte asteroide[8]={B01110,B10111,B11111,B11101,B10111,B01110,B00000,B00000};
byte explosao[8]={B10101,B00010,B11000,B10101,B01010,B10110,B01101,B10011};
byte tiro3[8]={B00000,B00000,B11110,B11111,B11111,B11110,B00000,B00000};
int line[4] = {0,1,2,3},
line_bk[4],
index,
menu_number = 0;
boolean menu_flag = 0,
enter_flag = 0,
sub_menu = 0;
void readButts();
void list_menu();
void menu_select();
void setup()
{
//--configuração do menu--
pinMode(menu, INPUT_PULLUP);
pinMode(bttiro, INPUT_PULLUP);
lcd.begin (16,4);
//lcd.setBacklight(HIGH);--apenas para lcd i2c
lcd.clear();
lcd.setCursor(0,0);
lcd.print(">");
pxnave=pynave=pyaste=pontos=pytiro=0;
pxtiro=-1;
pxaste=12;
vtela=0;
lcd.createChar(1,nave);
lcd.createChar(2,asteroide);
lcd.createChar(4,explosao);
lcd.createChar(6,tiro3);
//lcd.begin(16,2);
//lcd.clear();
game1=-false;
game2=false;
game3=false;
vtiro=false;
}
void loop(){
if(!sub_menu)
{
lcd.clear();
lcd.setCursor(1,line[0]);
lcd.print("1) NAVE: THE GaMe ");
lcd.setCursor(1,line[1]);
lcd.print("2) PING PONG ");
lcd.setCursor(1,line[2]);
lcd.print("3) lula & dilma ");
lcd.setCursor(1,line[3]);
lcd.print("4) Creditos ");
}
readButts();
if(game1){
lcd.clear();
vtela=0;
if (digitalRead(btcima)==1){
pynave=0;
}
if(digitalRead(btbaixo)==1){
pynave=1;
}
if(digitalRead(bttiro)==1){
pxtiro=1;
vtiro=true;
pytiro=pynave;
}
pxaste-=1;
desenhaNave(pxnave, pynave);
desenhaAsteroide(pxaste, pyaste);
if(vtiro){
desenhaTiro3(pxtiro, pytiro);
pxtiro+=1;
}
if(pxaste<0){
pxaste=12;
pyaste=random(0,2);
}
if(pxtiro>16){
vtiro=false;
pxtiro-=1;
}
if (((pxtiro==pxaste+1)&&(pytiro==pyaste))||((pxtiro==pxaste)&&(pytiro==pyaste))){
vtiro=false;
pxtiro=-1;
desenhaExplosaoAsteroide(pxaste, pyaste);
pyaste=random(0,2);
pxaste=12;
pontos+=5;
if((pontos>=maxpontos)){
game1=0;
vtela=7;//rever
}
}
if((pxnave==pxaste)&&(pynave==pyaste)){
game1=0;
desenhaExplosaoNave(pxnave, pynave);
vtela=6;
}
delay(vel);
}else{
tela(vtela);
if(digitalRead(bttiro)==1){
reset1();
}
}
}
void readButts()
{
if(!digitalRead(menu)) menu_flag = 0x01;
if(!digitalRead(bttiro)) enter_flag = 0x01;
if(digitalRead(menu) && menu_flag)
{
menu_flag = 0x00;
list_menu();
menu_number+=1;
if(menu_number > 5) menu_number = 1;
}
if(digitalRead(bttiro) && enter_flag)
{
enter_flag = 0x00;
sub_menu = !sub_menu;
menu_select();
}
}
void list_menu()
{
for(int i=4; i>-1; i--)
{
index = i-1;
line_bk[i] = line[i];
if(index < 1) line[i] = line_bk[i+4];
else line[i] = line[i-1];
}
}
void menu_select()
{
switch(menu_number)
{
case 1:
vtela==0;
game1= true;
game2=false;
game3=false;
break;
case 2:
vtela==4;
game1= false;
game2=true;
game3=false;
break;
case 3:
vtela==5;
game1= false;
game2=false;
game3=true;
break;
case 4:
vtela==8;
game1= false;
game2=false;
game3=false;
break;
//case 5: ---pensar---
} //end switch
}
void desenhaNave(int px, int py){
lcd.setCursor(px,py);
lcd.write(1);
}
void desenhaAsteroide(int px, int py){
lcd.setCursor(px,py);
lcd.write(2);
}
void desenhaTiro3(int px, int py){
lcd.setCursor(px,py);
lcd.write(6);
}
void desenhaExplosaoNave(int px, int py){
lcd.clear();
lcd.setCursor(px,py);
lcd.write(4);
delay(1000);
lcd.clear();
}
void desenhaExplosaoAsteroide(int px, int py){
lcd.setCursor(px,py);
lcd.write(4);
delay(1000);
lcd.clear();
}
void reset1(){
pontos=0;
game1=true;
vtela=0;
}
void reset2(){
pontos=0;
game2=true;
vtela=0;
}
void reset3(){
pontos=0;
game3=true;
vtela=0;
}
void tela(int cond){//0=jogo da nave 1=ganhou 2= perdeu 3= menu de seleção 4=jogo pingpong 5=jogo plataforma
if(cond<1){
lcd.setCursor(3,0);
lcd.print("Nave: THE GAmE");
lcd.setCursor(0,1);
lcd.print("PRESSIONE START");
}
if(cond==6){
lcd.setCursor(9,0);
lcd.print("pts:");
lcd.setCursor(13,0);
lcd.print (pontos);
lcd.setCursor(1,0);
lcd.print("Perdeu");
lcd.setCursor(0,1);
lcd.print("PRESSIONE START");
}
if(cond==7){
lcd.setCursor(9,0);
lcd.print("pts:");
lcd.setCursor(13,0);
lcd.print (pontos);
lcd.setCursor(1,0);
lcd.print("Ganhou");
lcd.setCursor(0,1);
lcd.print("PRESSIONE START");
}
if (cond==3){
sub_menu=true;
lcd.clear();
}
if(cond==4)
{
lcd.setCursor(3,0);
lcd.print ("Ping Pong");
lcd.setCursor(0,1);
lcd.print ("PRESSIONE START");
}
if (cond==5)
{
lcd.setCursor(3,0);
lcd.print("Lula e Dilma");
lcd.setCursor (0,1);
lcd.print ("PRESSIONE START");
}
if (cond==8)
{
lcd.setCursor(3,0);
lcd.print("Equipe LULA Livre");
lcd.setCursor(0,1);
lcd.print("Obrigado por Jogar");
}
}`enter code here`
@Peternen, 👍2
Обсуждение1 ответ
Вероятно, поскольку вы установили курсор в положение посередине строки, только новый текст перезаписывается поверх старого текста. Но если есть какие-то символы из предыдущего текста, они останутся.
Таким образом, самый простой способ-либо очистить экран (если вы можете обновить экран из одного места), либо переписать всю строку (и, вероятно, добавить пробелы до/после текста, который вы хотите написать, чтобы перезаписать старый текст).
Некоторые другие советы:
- Пишите комментарии и имена переменных на английском языке (я знаю, что это не ваш родной язык, но вы можете выучить сразу два языка-C и английский).
- Выровняйте свой код (убедитесь, что каждый { и } выровнен правильно; это значительно облегчит жизнь и предотвратит ошибки.
- game1, game2 и game3 являются логическими, где только один может быть истинным. Для этого
придумывается перечисление
(перечисление). Поэтому создайтеигру enum enum { game1, game2, game3 };
в качестве типа и объявите переменнуюGame currentGame = game1;
- Вы используете оператор switch для menu_number, но почему бы не для cond?
- Вы используете много текста, весь текст также занимает драгоценную память памяти SRAM, в которой у вас всего 2048 байт. Если для каждой строки вы добавляете F спереди (например, F("МЕНЮ"); это будет сохранено только во флэш-памяти.
- Запись значения на 7-сегментный дисплей max7219
- Печать string and integer LCD
- Бесполезная проводка коробки и код
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Wemos: дисплей 16x2 ничего не показывает
- Может ли датчик 12 В, быть подключен к выходному сигналу 5 В Arduino Uno
- Как сделать динамическое меню с подменю ( Arduino mega или Arduino Uno)
- Как подключить этот последовательный дисплей SPI к Arduino?
Просто для вдохновения, вы можете взглянуть на [Arduboy](https://arduboy.com/) и библиотеки с открытым исходным кодом, на которых построены его игры., @Edgar Bonet
https://wokwi.com/arduino/projects/297467237377245705 можете ли вы проверить эту ссылку, @ArduinoFan