/**************************************************************************
**************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//******************
//define pros botões
#define pinoA 7
#define pinoB 8
//******************
//cabeçalho das funções
void menu(void);//Imprime o menu
void ranking (void);//Imprime o ranking
void creditos(void);//Imrpime os creditos
void fechar(void);//Fecha o jogo
int botao(void);//Move a seta e lê a seta, retorna um valor do tipo int
void seta(int a);//Imprime a seta, usa um parametro do tipo int
void jogadores(void);//Imprime os jogadores existentes
void dinossauro(void);//Imprime o desenho
void setup() {
Serial.begin(9600);
//declarando a funçao dos botoes
pinMode(pinoA, INPUT_PULLUP);
pinMode(pinoB, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.clearDisplay();
}
void loop() {
//Declara variavel
int pos;
display.clearDisplay();
//Chama a função 'menu'
menu();
//Chama a função 'botao'
pos = botao();
//Que retorna a posição da seta, um int
//Esse int vai entrar no SWITCH CASE
switch(pos){
case 1:
//Chama a função 'jogadores'
delay(100);
jogadores();
delay(10);
//Chama a função 'dinossauro'
dinossauro();
break;
case 2:
//Chama a função 'ranking'
ranking();
break;
case 3:
//Chama a função 'creditos'
creditos();
break;
case 4:
//Chama a função 'fechar'
fechar();
break;
}
}
void menu(void)
{
//Imprime o menu na tela
display.fillRect(10,0,108,15, WHITE);
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(42, 4);
display.print("DINOKILL");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(42, 20);
display.print("JOGAR");
display.setCursor(42, 30);
display.print("Ranking");
display.setCursor(42, 40);
display.print("Creditos");
display.setCursor(42, 50);
display.print("Sair");
display.display();
}
void ranking(void)
{
//Imprime o ranking na tela
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5,20);
display.print("Felicio - 287");
display.setCursor(5,30);
display.print("Doglair - 259");
display.setCursor(5,40);
display.print("Cleverson - 180");
display.display();
delay(4000);
display.clearDisplay();
}
void creditos(void)
{
display.clearDisplay();
//Imprime os creditos se movendo na tela atraves do LOOP FOR
for(int i=0;i<110;i++)
{
//Limpa a tela
display.clearDisplay();
//Imprime na adicionando a 'i' para a posição
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(28, 64-i);
display.print("Carlos");
display.setCursor(28, 74-i);
display.print("Rafael");
display.setCursor(28, 85-i);
display.print("Reginaldo");
display.setCursor(28, 95-i);
display.print("Thiago");
display.display();
}
display.display();
delay(3500);
display.clearDisplay();
}
void fechar(void)
{
//Imprime a mensagem de saida
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(5, 35);
display.print("Jogo fechado!");
display.setCursor(5, 50);
display.print("DINO KILL");
display.display();
delay(4000);
display.clearDisplay();
}
int botao(void)
{
//Declara variaveis
int botaoA = 1;
int botaoB = 1;
int botaoAA = 1;
int cursor = 1;
//Começa o LOOP
do{
//Lê os botões
botaoB = digitalRead(pinoB);
botaoA = digitalRead(pinoA);
delay(10);
//Lê o botão com o delay
botaoAA = digitalRead(pinoA);
//Se houve alteração na subtração a mode de dar 1 vai entrar no IF
if((botaoA-botaoAA)==1)
{
//IF e ELSE que vai alterar o valor de 'cursor' até um maximo de 4
if(cursor>=4)
{
cursor = 1;
}
else
{
cursor++;
}
}
//Chama a função 'seta' com o parametro 'cursor'
seta(cursor);
//Enquanto não apertar o segundo botão para mudar o valor de
//'botaoB' o LOOP vai continuar
}while(botaoB==1);
//Quando o loop acabar, a função vai retornar o valor de 'cursor'
return cursor;
}
void seta(int a)
{
display.display();
//Entre no SWITCH CASE com o parametro passado para a função
//SWITCH CASE que vai decidir qual seta imprimir
//Vai imprimir 3 setas pretas e 1 seta branca
//de acordo com o valor de 'a'
switch(a){
case 1:
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(28, 20);
display.print("->");
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(28, 30);
display.print("->");
display.setCursor(28, 40);
display.print("->");
display.setCursor(28, 50);
display.print("->");
display.display();
break;
case 2:
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(28, 30);
display.print("->");
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(28, 20);
display.print("->");
display.setCursor(28, 40);
display.print("->");
display.setCursor(28, 50);
display.print("->");
display.display();
break;
case 3:
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(28, 40);
display.print("->");
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(28, 20);
display.print("->");
display.setCursor(28, 30);
display.print("->");
display.setCursor(28, 50);
display.print("->");
display.display();
break;
case 4:
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(28, 50);
display.print("->");
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(28, 20);
display.print("->");
display.setCursor(28, 30);
display.print("->");
display.setCursor(28, 40);
display.print("->");
display.display();
break;
}
}
void jogadores (void)
{
//Declara variavel
int pos;
//Imprime os jogadores
display.clearDisplay();
display.fillRect(10,0,108,15, WHITE);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(42, 20);
display.print("Felicio") ;
display.setCursor(42, 30);
display.print("Doglair");
display.setCursor(42, 40);
display.print("Cleverson");
display.setCursor(42, 50);
display.print("NOVO JOGADOR");
display.display();
//Chama a função 'botao' para imprimir as seta
pos = botao();
//Variavel 'pos' sem utilidade ainda
}
void dinossauro(void)
{
display.clearDisplay();
// desenha o dinossauro
// **desenha a cabeça
display.fillRect(71, 28, 14, 11, SSD1306_WHITE);
display.fillRect(70, 29, 1, 9, SSD1306_WHITE);
display.fillRect(85, 29, 1, 10, SSD1306_WHITE);
// **desenha o corpo
// desenha um quadrado logo abaixo da cabeça
display.fillRect(78, 39, 9, 13, SSD1306_WHITE);
// desenha linha por linha das costas
display.fillRect(87, 40, 1, 12, SSD1306_WHITE);
display.fillRect(88, 41, 1, 11, SSD1306_WHITE);
display.fillRect(89, 42, 1, 10, SSD1306_WHITE);
display.fillRect(90, 43, 1, 9, SSD1306_WHITE);
display.fillRect(91, 44, 1, 8, SSD1306_WHITE);
display.fillRect(92, 45, 1, 7, SSD1306_WHITE);
// desenha linha por linha da parte de baixo do corpo
display.fillRect(79, 52, 14, 1, SSD1306_WHITE);
display.fillRect(80, 53, 13, 1, SSD1306_WHITE);
display.fillRect(81, 54, 11, 1, SSD1306_WHITE);
// **desenha a cauda
display.fillRect(93, 46, 1, 7, SSD1306_WHITE);
display.fillRect(94, 46, 1, 6, SSD1306_WHITE);
display.fillRect(95, 45, 1, 6, SSD1306_WHITE);
display.fillRect(96, 44, 1, 6, SSD1306_WHITE);
display.fillRect(97, 42, 1, 7, SSD1306_WHITE);
display.fillRect(98, 40, 1, 8, SSD1306_WHITE);
// **desenha o braço
display.fillRect(76, 43, 2, 1, SSD1306_WHITE);
display.fillRect(76, 44, 1, 1, SSD1306_WHITE);
// **desenha as perna
// desenha a parte onde as pernas se juntam
display.fillRect(82, 55, 9, 2, SSD1306_WHITE);
// perna da esquerda
display.fillRect(82, 57, 3, 2, SSD1306_WHITE);
display.fillRect(82, 59, 2, 3, SSD1306_WHITE);
display.fillRect(80, 62, 4, 2, SSD1306_WHITE);
// perna da direita
display.fillRect(88, 57, 3, 2, SSD1306_WHITE);
display.fillRect(89, 59, 2, 3, SSD1306_WHITE);
display.fillRect(87, 62, 4, 2, SSD1306_WHITE);
// **desenha o olho e a boca
// desenha o olho
display.fillRect(82, 31, 1, 1, SSD1306_BLACK);
// desenha a boca
display.fillRect(70, 36, 7, 1, SSD1306_BLACK);
display.display();
// ******************************
// ******************************
// ******************************
// loop para testar os movimentos
// fiz esse loop so para desenhar os movimentos,
// na hora de aplicar acredito que é melhor fazer uma função
// para chamar cada um desses if e else if
// ******************************
// ******************************
// ******************************
int teste = 0;
int i, j;
// variavel para os passos
int passo = 0;
// variavel para abaixar
int abaixar = 0;
// variavel para pular
int pular = 0;
do{
abaixar += 1;
pular += 1;
display.display();
delay(10);
//if e else if para mexer as pernas
if(passo==0 && pular <= 60)
{
// apaga as pernas
display.fillRect(80, 60, 11, 4, SSD1306_BLACK);
// desenha a perna da direita
display.fillRect(88, 57, 3, 2, SSD1306_WHITE);
display.fillRect(89, 59, 2, 3, SSD1306_WHITE);
display.fillRect(87, 62, 4, 2, SSD1306_WHITE);
// ergue o pé da esquerda
display.fillRect(82, 59, 2, 3, SSD1306_WHITE);
display.fillRect(80, 60, 4, 2, SSD1306_WHITE);
passo = 1;
}
else if(passo==1 && pular <= 60)
{
// apaga as pernas
display.fillRect(80, 60, 11, 4, SSD1306_BLACK);
// desenha a perna da esquerda
display.fillRect(82, 57, 3, 2, SSD1306_WHITE);
display.fillRect(82, 59, 2, 3, SSD1306_WHITE);
display.fillRect(80, 62, 4, 2, SSD1306_WHITE);
// ergue o pé da direta
display.fillRect(89, 59, 2, 3, SSD1306_WHITE);
display.fillRect(87, 60, 4, 2, SSD1306_WHITE);
passo = 0;
}
// if e else if para abaixar e levantar
if(abaixar>20 && abaixar<40)
{
// apaga a parte levantada do corpo
display.fillRect(70, 28, 22, 26, SSD1306_BLACK);
// desenha o corpo abaixado
// desenha a cabeça
display.fillRect(54, 42, 14, 11, SSD1306_WHITE);
display.fillRect(53, 43, 1, 9, SSD1306_WHITE);
display.fillRect(68, 43, 1, 10, SSD1306_WHITE);
// desenha olho e a boca
display.fillRect(65, 45, 1, 1, SSD1306_BLACK);
display.fillRect(53, 50, 7, 1, SSD1306_BLACK);
// desenha o corpo abaixado
display.fillRect(69, 45, 23, 9, SSD1306_WHITE);
display.fillRect(71, 44, 20, 1, SSD1306_WHITE);
display.fillRect(73, 43, 15, 1, SSD1306_WHITE);
// desenha o braço
display.fillRect(69, 55, 2, 1, SSD1306_WHITE);
display.fillRect(70, 54, 1, 1, SSD1306_WHITE);
}
else if(abaixar>40)
{
// apaga a parte abaixada do corpo
display.fillRect(53, 42, 38, 12, SSD1306_BLACK);
display.fillRect(69, 54, 2, 2, SSD1306_BLACK);
// desenha o corpo levantado
// desenha a cabeça
display.fillRect(71, 28, 14, 11, SSD1306_WHITE);
display.fillRect(70, 29, 1, 9, SSD1306_WHITE);
display.fillRect(85, 29, 1, 10, SSD1306_WHITE);
// desenha o olho e a boca
display.fillRect(82, 31, 1, 1, SSD1306_BLACK);
display.fillRect(70, 36, 7, 1, SSD1306_BLACK);
// desenha o corpo
// desenha um quadrado logo abaixo da cabeça
display.fillRect(78, 39, 9, 13, SSD1306_WHITE);
// desenha linha por linha das costas
display.fillRect(87, 40, 1, 12, SSD1306_WHITE);
display.fillRect(88, 41, 1, 11, SSD1306_WHITE);
display.fillRect(89, 42, 1, 10, SSD1306_WHITE);
display.fillRect(90, 43, 1, 9, SSD1306_WHITE);
display.fillRect(91, 44, 1, 8, SSD1306_WHITE);
display.fillRect(92, 45, 1, 7, SSD1306_WHITE);
// desenha algumas linhas da parte de baixo
display.fillRect(79, 52, 14, 1, SSD1306_WHITE);
display.fillRect(80, 53, 13, 1, SSD1306_WHITE);
// desenha o braço
display.fillRect(76, 43, 2, 1, SSD1306_WHITE);
display.fillRect(76, 44, 1, 1, SSD1306_WHITE);
abaixar = 0;
}
// coloquei esse && abaixar<20; so para realmente não ter
// falta de sincronia nos testes
if(pular==60 && abaixar<20)
{
// coloquei esse abaixar = 0; pra não ter falta de sincronia
abaixar = 0;
// loop para movimentar o boneco pra cima
for(i=0;i<26;i++)
{
display.display();
// **desenha a cabeça
display.fillRect(71, 28-i, 14, 11, SSD1306_WHITE);
display.fillRect(70, 29-i, 1, 9, SSD1306_WHITE);
display.fillRect(85, 29-i, 1, 10, SSD1306_WHITE);
// **desenha o corpo
display.fillRect(78, 39-i, 9, 13, SSD1306_WHITE);
display.fillRect(87, 40-i, 1, 12, SSD1306_WHITE);
display.fillRect(88, 41-i, 1, 11, SSD1306_WHITE);
display.fillRect(89, 42-i, 1, 10, SSD1306_WHITE);
display.fillRect(90, 43-i, 1, 9, SSD1306_WHITE);
display.fillRect(91, 44-i, 1, 8, SSD1306_WHITE);
display.fillRect(92, 45-i, 1, 7, SSD1306_WHITE);
display.fillRect(79, 52-i, 14, 1, SSD1306_WHITE);
display.fillRect(80, 53-i, 13, 1, SSD1306_WHITE);
display.fillRect(81, 54-i, 11, 1, SSD1306_WHITE);
// **desenha a cauda
display.fillRect(93, 46-i, 1, 7, SSD1306_WHITE);
display.fillRect(94, 46-i, 1, 6, SSD1306_WHITE);
display.fillRect(95, 45-i, 1, 6, SSD1306_WHITE);
display.fillRect(96, 44-i, 1, 6, SSD1306_WHITE);
display.fillRect(97, 42-i, 1, 7, SSD1306_WHITE);
display.fillRect(98, 40-i, 1, 8, SSD1306_WHITE);
// **desenha o braço
display.fillRect(76, 43-i, 2, 1, SSD1306_WHITE);
display.fillRect(76, 44-i, 1, 1, SSD1306_WHITE);
// **desenha as perna
display.fillRect(82, 55-i, 9, 2, SSD1306_WHITE);
display.fillRect(82, 57-i, 3, 2, SSD1306_WHITE);
display.fillRect(82, 59-i, 2, 3, SSD1306_WHITE);
display.fillRect(80, 62-i, 4, 2, SSD1306_WHITE);
display.fillRect(88, 57-i, 3, 2, SSD1306_WHITE);
display.fillRect(89, 59-i, 2, 3, SSD1306_WHITE);
display.fillRect(87, 62-i, 4, 2, SSD1306_WHITE);
// **desenha o olho e a boca
display.fillRect(82, 31-i, 1, 1, SSD1306_BLACK);
display.fillRect(70, 36-i, 7, 1, SSD1306_BLACK);
delay(1);
// apaga o que fica pra tras quando levanta um pixel
display.fillRect(70, 38-i, 1, 1, SSD1306_BLACK);
display.fillRect(71, 39-i, 7, 1, SSD1306_BLACK);
display.fillRect(76, 45-i, 1, 1, SSD1306_BLACK);
display.fillRect(77, 44-i, 1, 1, SSD1306_BLACK);
display.fillRect(78, 52-i, 1, 1, SSD1306_BLACK);
display.fillRect(79, 53-i, 1, 1, SSD1306_BLACK);
display.fillRect(80, 54-i, 1, 1, SSD1306_BLACK);
display.fillRect(81, 55-i, 1, 1, SSD1306_BLACK);
display.fillRect(80, 64-i, 4, 1, SSD1306_BLACK);
display.fillRect(84, 59-i, 1, 1, SSD1306_BLACK);
display.fillRect(85, 57-i, 3, 1, SSD1306_BLACK);
display.fillRect(88, 59-i, 1, 1, SSD1306_BLACK);
display.fillRect(87, 64-i, 4, 1, SSD1306_BLACK);
display.fillRect(91, 55-i, 1, 1, SSD1306_BLACK);
display.fillRect(92, 54-i, 1, 1, SSD1306_BLACK);
display.fillRect(93, 53-i, 1, 1, SSD1306_BLACK);
display.fillRect(94, 52-i, 1, 1, SSD1306_BLACK);
display.fillRect(95, 51-i, 1, 1, SSD1306_BLACK);
display.fillRect(96, 50-i, 1, 1, SSD1306_BLACK);
display.fillRect(97, 49-i, 1, 1, SSD1306_BLACK);
display.fillRect(98, 48-i, 1, 1, SSD1306_BLACK);
}
}
else if(pular==65 && abaixar<20)
{
// para não ter falta de sincronia no teste
abaixar = 0;
//loop para movimentar o boneco para baixo
for(j=0;j<26;j++)
{
display.display();
// (y-25) porque é a posição por qual tem que começar a cair
// **desenha a cabeça
display.fillRect(71, (28-25)+j, 14, 11, SSD1306_WHITE);
display.fillRect(70, (29-25)+j, 1, 9, SSD1306_WHITE);
display.fillRect(85, (29-25)+j, 1, 10, SSD1306_WHITE);
// **desenha o corpo
display.fillRect(78, (39-25)+j, 9, 13, SSD1306_WHITE);
display.fillRect(87, (40-25)+j, 1, 12, SSD1306_WHITE);
display.fillRect(88, (41-25)+j, 1, 11, SSD1306_WHITE);
display.fillRect(89, (42-25)+j, 1, 10, SSD1306_WHITE);
display.fillRect(90, (43-25)+j, 1, 9, SSD1306_WHITE);
display.fillRect(91, (44-25)+j, 1, 8, SSD1306_WHITE);
display.fillRect(92, (45-25)+j, 1, 7, SSD1306_WHITE);
display.fillRect(79, (52-25)+j, 14, 1, SSD1306_WHITE);
display.fillRect(80, (53-25)+j, 13, 1, SSD1306_WHITE);
display.fillRect(81, (54-25)+j, 11, 1, SSD1306_WHITE);
// **desenha a cauda
display.fillRect(93, (46-25)+j, 1, 7, SSD1306_WHITE);
display.fillRect(94, (46-25)+j, 1, 6, SSD1306_WHITE);
display.fillRect(95, (45-25)+j, 1, 6, SSD1306_WHITE);
display.fillRect(96, (44-25)+j, 1, 6, SSD1306_WHITE);
display.fillRect(97, (42-25)+j, 1, 7, SSD1306_WHITE);
display.fillRect(98, (40-25)+j, 1, 8, SSD1306_WHITE);
// **desenha o braço
display.fillRect(76, (43-25)+j, 2, 1, SSD1306_WHITE);
display.fillRect(76, (44-25)+j, 1, 1, SSD1306_WHITE);
// **desenha as perna
display.fillRect(82, (55-25)+j, 9, 2, SSD1306_WHITE);
display.fillRect(82, (57-25)+j, 3, 2, SSD1306_WHITE);
display.fillRect(82, (59-25)+j, 2, 3, SSD1306_WHITE);
display.fillRect(80, (62-25)+j, 4, 2, SSD1306_WHITE);
display.fillRect(88, (57-25)+j, 3, 2, SSD1306_WHITE);
display.fillRect(89, (59-25)+j, 2, 3, SSD1306_WHITE);
display.fillRect(87, (62-25)+j, 4, 2, SSD1306_WHITE);
// **desenha o olho e a boca
display.fillRect(82, (31-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(70, (36-25)+j, 7, 1, SSD1306_BLACK);
delay(1);
// apaga o que fica pra tras quando abaixa um pixel
display.fillRect(70, (28-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(71, (27-25)+j, 14, 1, SSD1306_BLACK);
display.fillRect(85, (28-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(86, (38-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(87, (39-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(88, (40-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(89, (41-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(90, (42-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(91, (43-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(92, (44-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(93, (45-25)+j, 2, 1, SSD1306_BLACK);
display.fillRect(95, (44-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(96, (43-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(97, (41-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(98, (40-25)+j, 1, 1, SSD1306_BLACK);
display.fillRect(80, (61-25)+j, 2, 1, SSD1306_BLACK);
display.fillRect(87, (61-25)+j, 2, 1, SSD1306_BLACK);
display.fillRect(76, (42-25)+j, 2, 1, SSD1306_BLACK);
}
pular = 0;
}
//LOOP vai continuar até ler o pinoB
}while(digitalRead(pinoB));
delay(1000);
}