Nachdem nun die Bibliotheken hinzugefügt wurden, folgt nun die Initialisierung der benötigten Pins und Variablen.
Wichtig ist, sich vorab Gedanken zu machen, wie man diese anordnet. (siehe Abbildung 3)
2.1) Taster:
Zuerst müssen allen vier Tastern einen Pin am Arduino zugewiesen werden, diese kann man beliebig an den digitalen Schnittstellen anschließen.
Danach werden die Pins mit pinMode(); und digitalWrite(); initialisiert.
/* Deklaration Display, Verbindung zum I2C (SDA, SCL pins) */constcharOLED_RESET;// Reset pinAdafruit_SSD1306display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);
2.3) Variablen
Auch können vorab Variablen bestimmt werden, die für die Programmierung benötigt werden.
Wie die Größe des Displays und die Eigenschaften vom Schläger und Ball.
Zusätzlich ist geplant, eine Punkteanzeige zu entwerfen, wofür zwei Variablen benötigt werden.
constunsignedcharPADDLE_RATE=33;// const: Konstant, wert bleibt unverändertconstunsignedcharBALL_RATE=16;// unsigned long: kann keine negativen Zahlen speichernconstunsignedcharPADDLE_HEIGHT=25;constcharSCREEN_WIDTH=128;// OLED Display BreiteconstcharSCREEN_HEIGHT=64;// OLED Display HöheunsignedintPlayer_one=0,Player_two=0;
2.4) Position vom Ball, Paddle und Spieler auf dem Display
Im nächsten Schritt sollen die Postionen auf dem Display festgelegt werden.
Benötigte Postionen sind: Ball, Spieler 1 (Player) und Spieler 2 (CPU).
Auch werden zwei update Variablen benötigt, um später den Ball und Schläger bewegen zu können.
Dieser Werte können nach Geschmack angepasst werden.
Um später zu sehen, wo man welche Objekte platziert hat, muss das Display hochgefahren werden.
Zusätzlich wird beim Start vom Display ein Timer gesetzt, dieser wird für die Bewegung vom Ball benötigt. Benötigt wird: display.display(); und mills(); zum Zeitauslesen.
voidsetup(){Serial.begin(9600);/* Hochfahren vom Display */display.begin(SSD1306_SWITCHCAPVCC,0x3C);// Starte das Display display.display();// Zeigt das Startbild vom Arduino anunsignedlongstart=millis();// Anzahl von Ms zurück, seit Arduino-Board das aktuelle Programm gestartet hatdelay(1000);display.clearDisplay();// Löscht das Bild/* Ball Timer zuweisen*/Ball_update=millis();delay(1000);}
3.1) Display Spielname anzeigen
Als Zusatzaufgabe habe ich überlegt, bevor das Spiel startet den Namen Pong Spiel auf dem Display anzeigen zu lassen.
Tipp: Hierfür werden die display.set(); und display.println(); Funktionen benötigt.
/* Pong Spiel Namen anzeigen */display.setTextSize(2);display.setTextColor(WHITE);display.setCursor(5,25);display.println("Pong Spiel");display.display();delay(1000);display.clearDisplay();
4) Display Punkteanzeige
Um die Punktanzeige ins Spiel mit einzubringen, werden zwei Methoden benötigt.
Die erste Methode soll die Zahlen auf dem Display anzeigen.
Die zweite Methode soll die erstellen Zahlen wieder löschen, um das nächste Ergebnis korrekt anzuzeigen. Tipp: Hierfür werden die display.set(); und display.println(); Funktionen benötigt.
/* Benötigte Bibliotheken */#include<SPI.h>#include<Wire.h>#include<Adafruit_GFX.h>#include<Adafruit_SSD1306.h>/* Taster PINS */constcharUP_BUTTON=2;constcharDOWN_BUTTON=3;constcharUP_BUTTON_TWO=4;constcharDOWN_BUTTON_TWO=5;/* Variablen */constunsignedcharPADDLE_RATE=33;// const: Konstant, wert bleibt unverändertconstunsignedcharBALL_RATE=16;// unsigned long: kann keine negativen Zahlen speichernconstunsignedcharPADDLE_HEIGHT=25;constcharSCREEN_WIDTH=128;// OLED Display BreiteconstcharSCREEN_HEIGHT=64;// OLED Display HöheunsignedintPlayer_one=0,Player_two=0;/* Deklaration Display, verbindung zum I2C (SDA, SCL pins) */constcharOLED_RESET=0;// Reset pinAdafruit_SSD1306display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);/* Position vom Ball, Paddle und Spieler auf dem Display */unsignedcharBall_x=64,Ball_y=32;unsignedcharBall_dir_x=1,Ball_dir_y=1;constunsignedcharCPU_X=12;unsignedcharCpu_y=16;constunsignedcharPLAYER_X=115;unsignedcharPlayer_y=16;unsignedlongBall_update;unsignedlongPaddle_update;voidsetup(){Serial.begin(9600);/* Hochfahren vom Display */display.begin(SSD1306_SWITCHCAPVCC,0x3C);// Starte das Displaydisplay.display();// Zeigt das Startbild vom Arduino anunsignedlongstart=millis();// Anzahl von Ms zurück, seit Arduino-Board das aktuelle Programm gestartet hatdelay(1000);display.clearDisplay();// Löscht das Bild/* Pong Spiel Namen anzeigen */display.setTextSize(2);display.setTextColor(WHITE);display.setCursor(5,25);display.println("Pong Spiel");display.display();delay(1000);display.clearDisplay();/* Ball Timer zuweisen*/Ball_update=millis();delay(1000);/* Taster Initialisieren */pinMode(UP_BUTTON,INPUT);// Taster als INPUT festlegenpinMode(DOWN_BUTTON,INPUT);digitalWrite(UP_BUTTON,HIGH);// Taster anschaltendigitalWrite(DOWN_BUTTON,HIGH);/* Taster zwei */pinMode(UP_BUTTON_TWO,INPUT);pinMode(DOWN_BUTTON_TWO,INPUT);digitalWrite(UP_BUTTON_TWO,HIGH);digitalWrite(DOWN_BUTTON_TWO,HIGH);}/* Punkteanzeige */voiddrawScore(){display.setTextSize(2);display.setTextColor(WHITE);display.setCursor(43,0);display.println(Player_one);display.setCursor(73,0);display.println(Player_two);}/* Punkte zurücksetzten */voideraseScore(){display.setTextSize(2);display.setTextColor(BLACK);display.setCursor(43,0);display.println(Player_one);display.setCursor(73,0);display.println(Player_two);}voidloop(){drawScore();boolupdate=false;// Ein bool enthält einen von zwei Werten, true oder falseunsignedlongtime=millis();// Zeit-VariablestaticboolUp_state=false;staticboolDown_state=false;staticboolUp_state_two=false;staticboolDown_state_two=false;Up_state|=(digitalRead(UP_BUTTON)==LOW);// Taster auslesenDown_state|=(digitalRead(DOWN_BUTTON)==LOW);Up_state_two|=(digitalRead(UP_BUTTON_TWO)==LOW);Down_state_two|=(digitalRead(DOWN_BUTTON_TWO)==LOW);/* Neue Ballposition */if(time>Ball_update){/* Neue Ballposition */unsignedcharNew_x=Ball_x+Ball_dir_x;// (x+1)unsignedcharNew_y=Ball_y+Ball_dir_y;// (y+1)/* Checkt ob die verticalen Wände berüht werden */if(New_x==0){// Wand linksBall_dir_x=-Ball_dir_x;// Wechselt die RichtungNew_x+=Ball_dir_x+Ball_dir_x;eraseScore();// Punkt für SpielerPlayer_one+=1;drawScore();}if(New_x==127){// Wand rechtsBall_dir_x=-Ball_dir_x;// Wechselt die RichtungNew_x+=Ball_dir_x+Ball_dir_x;eraseScore();// Punkt für den ComputerPlayer_two+=1;drawScore();}// Checkt ob die horizontalen Wände berüht werdenif(New_y==0||New_y==63){Ball_dir_y=-Ball_dir_y;// Wechselt die RichtungNew_y+=Ball_dir_y+Ball_dir_y;}// Checkt, ob der Spieler 1 Paddel getroffen wurdeif(New_x==PLAYER_X&&New_y>=Player_y&&New_y<=Player_y+PADDLE_HEIGHT){Ball_dir_x=-Ball_dir_x;New_x+=Ball_dir_x+Ball_dir_x;}// Checkt, ob der Spieler 2 Paddel getroffen wurdeif(New_x==CPU_X&&New_y>=Cpu_y&&New_y<=Cpu_y+PADDLE_HEIGHT){Ball_dir_x=-Ball_dir_x;New_x+=Ball_dir_x+Ball_dir_x;}display.drawPixel(Ball_x,Ball_y,BLACK);display.drawPixel(New_x,New_y,WHITE);Ball_x=New_x;Ball_y=New_y;Ball_update+=BALL_RATE;update=true;// true ~ display.display();}/* Spieler 1 Paddel */display.drawFastVLine(PLAYER_X,Player_y,PADDLE_HEIGHT,BLACK);if(Up_state){Player_y-=1;}if(Down_state){Player_y+=1;}Up_state=Down_state=false;if(Player_y<1)Player_y=1;// Um nicht aus dem Bildschirm zu gelangenif(Player_y+PADDLE_HEIGHT>63)Player_y=63-PADDLE_HEIGHT;display.drawFastVLine(PLAYER_X,Player_y,PADDLE_HEIGHT,WHITE);update=true;/* Spieler 2 Paddel */display.drawFastVLine(CPU_X,Cpu_y,PADDLE_HEIGHT,BLACK);if(Up_state_two){Cpu_y-=1;// Paddle 1 nach unten}if(Down_state_two){Cpu_y+=1;// Paddle 1 nach oben}Up_state_two=Down_state_two=false;if(Cpu_y<1)Cpu_y=1;// Um nicht aus dem Bildschirm zugelangenif(Cpu_y+PADDLE_HEIGHT>63)Cpu_y=63-PADDLE_HEIGHT;display.drawFastVLine(CPU_X,Cpu_y,PADDLE_HEIGHT,WHITE);if(update)display.display();}