#define joyXpin 0
#define joyYpin 1
#define botonPin 2
#define pinBuzzer 3
#define __DEBUG__
#include <SPI.h>//Esta libreria no es necesaria
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "graficos.h"
//Estado Joystick
int joyX;
int joyY;
//Posicion e Inercia de la Nave
int posX = 30;
int posY = 100;
int inerciaX = 0;
int inerciaY = 0;
//Posicion del Background
int scrollBG = 0;
//Parametros del Rayo
int rayX;
int rayY;
int rayFrame;
//Estado del Boton
bool botonActivo;
// Definir constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
void setup() {
pinMode(botonPin, INPUT_PULLUP);
pinMode(pinBuzzer, OUTPUT);
#ifdef __DEBUG__
Serial.begin(9600);
delay(100);
Serial.println("Iniciando pantalla OLED");
#endif
// Iniciar pantalla OLED en la dirección 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
#ifdef __DEBUG__
Serial.println("No se encuentra la pantalla OLED");
#endif
while (true);
}
//Rotacion de la pantalla
display.setRotation(3);
}
void loop() {
//Lee posicion del joystick
joyX = analogRead(joyXpin);
joyY = analogRead(joyYpin);
//Calculo del movimiento
if (joyX < 500 || joyX > 530) {
inerciaX = map(joyX, 0, 1020, -8, 8);
}
else {
if (inerciaX > 0) {
inerciaX--;
}
if (inerciaX < 0) {
inerciaX++;
}
}
if (joyY < 500 || joyY > 530) {
inerciaY = map(joyY, 0, 1020, -8, 8);
}
else {
if (inerciaY > 0) {
inerciaY--;
}
if (inerciaY < 0) {
inerciaY++;
}
}
posX = posX + inerciaX;
posY = posY + inerciaY;
//Evita limites de la pantalla
if (posX < 0) {
posX = 0;
inerciaX = 0;
}
if (posX > 51) {
posX = 51;
inerciaX = 0;
}
if (posY < 0) {
posY = 0;
inerciaY = 0;
}
if (posY > 115) {
posY = 115;
inerciaY = 0;
}
//Scroll Background Infinito
display.clearDisplay();
//Render BG 1
display.drawBitmap(0, scrollBG, bg, 64, 128, SSD1306_WHITE);
//Render BG 2
display.drawBitmap(0, scrollBG - 128, bg, 64, 128, SSD1306_WHITE);
scrollBG += 1;
if (scrollBG > 128) {
scrollBG = 0;
}
//Dibuja Nave en la nueva posicion
if (inerciaX >= 4) {
display.drawBitmap(posX, posY, naveDE, 13, 13, SSD1306_WHITE);
}
if (inerciaX <= -4) {
display.drawBitmap(posX, posY, naveIZ, 13, 13, SSD1306_WHITE);
}
if (inerciaX < 4 && inerciaX > -4) {
display.drawBitmap(posX, posY, nave, 13, 13, SSD1306_WHITE);
}
//Evalua Disparo
if (digitalRead(botonPin) == LOW && botonActivo == false) {
rayX = posX + 6;
rayY = posY - 2;
rayFrame = 1;
botonActivo = true;
tone(pinBuzzer, 80);
}
//Dibuja Disparos
if (rayFrame > 0 && rayFrame <= 3) {
dibujaRayo(rayX, rayY, rayFrame);
rayFrame++;
}
else {
rayFrame = 0;
botonActivo = false;
noTone(pinBuzzer);
}
display.display();
delay(25);
}
void dibujaRayo(int origenX, int origenY, int frame) {
if (rayFrame == 1) {
display.drawLine(origenX, origenY, origenX, origenY - 128, SSD1306_WHITE);
tone(pinBuzzer, 80);
}
if (rayFrame == 2) {
display.drawLine(origenX, origenY - 30, origenX, origenY - 128, SSD1306_WHITE);
tone(pinBuzzer, 170);
}
if (rayFrame == 3) {
display.drawLine(origenX, origenY - 80, origenX, origenY - 128, SSD1306_WHITE);
tone(pinBuzzer, 165);
}
}