martedì 23 febbraio 2016

Mini Tennis su Arduino

Sono abbastanza vecchio da aver giocato a Pong sulle consolle di fine anni 70-inizio anni 80 (in particolare alla versione Polistil) ed avendo una mezz'ora libera ed un schermo oled SSD1306 (32x128 pixel) ho voluto provare a farmi la mia versione di Pong con Arduino


Pong della Polistil

Questo progettino e' fatto soltanto per divertirsi e per imparare ad usare l'SSD1306, non c'e' nessuna pretesa di giocabilita'


Come sul pong originale il controllo della racchetta avviene mediante un potenziometro.
Via via che il gioco va avanti la velocita' della palla aumenta

// -------------------------------------------------------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4

Adafruit_SSD1306 display(OLED_RESET);


int x;
int y;
int dx = 2;
int dy = 2;
int yb = 0;
int punteggio;
int contatore;
int ritardo;

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {         
  Serial.begin(9600);
       
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  delay(200);
  punteggio = 48; //codice ASCII per il numero zero
  x = 64;
  y = random(30);
  contatore = 0;
  ritardo = 40;
  
  randomSeed(analogRead(0));

}


void loop() {
  x = x + dx;
  y = y + dy;
  display.clearDisplay();

  // disegna il punto
  display.drawPixel(x, y, WHITE);

  //disegna il punteggio
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(120,0);
  display.write(punteggio);
  //display.display();

  //legge il potenziometro
  int pot = analogRead(A2);
  Serial.println(pot);
  yb = round(pot/25);

  // disegna il rettangolo
  display.fillRect(1, yb, 2, 7, 1);
  display.display();

  // se trova una parete rimbalza
  if (x >= 127) dx = -dx;
  if (y >= 31) dy = -dy;
  //if (x <= 1) dx = -dx;
  if (y <= 1) dy = -dy;
  
  // se e' sulla parete di destra controlla la posizione
  // della barra
  // se rimbalza inverte la direzione
  if (x < 7)
     {
       if ((y >= yb) && (y <= yb+7))
           {
             dx = -dx;
             // dopo 10 rimbalzi consecutivi il gioco si fa piu' veloce 
             contatore = contatore + 1;
              if (contatore == 3)
                  {
                  contatore = 0;
                  ritardo = ritardo = ritardo - 3;
                  }
             }
       else
           {
              punteggio = punteggio + 1;
              delay(500);
              x = 64;
              y = random(30);
              dx = 2;
              dy = 2;
              ritardo = 40;
              contatore = 0;
           }
      } 

delay(ritardo);
}