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 (Cpu) und Spieler 2 (Player).
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 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;// 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);display.begin(SSD1306_SWITCHCAPVCC,0x3C);// Starte das Display display.display();// Display Aktualisierung unsignedlongstart=millis();// Anzahl von Ms zurück, seit Arduino-Board das aktuelle Programm gestartet hat/* Taster Initialisieren */pinMode(UP_BUTTON,INPUT);pinMode(DOWN_BUTTON,INPUT);digitalWrite(UP_BUTTON,HIGH);digitalWrite(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);display.clearDisplay();// Display alle Pixel ausschaltenwhile(millis()-start<2000);// Solange Millis kleiner als 2000ms istdisplay.display();Ball_update=millis();delay(1000);}/* Punkteanzeige */voiddrawScore(){display.setTextSize(2);display.setTextColor(WHITE);display.setCursor(44,0);display.println(Player_one);display.setCursor(74,0);display.println(Player_two);}/* Punkte zurücksetzten */voideraseScore(){display.setTextSize(2);display.setTextColor(BLACK);display.setCursor(44,0);display.println(Player_one);display.setCursor(74,0);display.println(Player_two);}voidloop(){drawScore();boolupdate=false;// Ein bool enthält einen von zwei Werten, true oder falseunsignedlongtime=millis();staticboolUp_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);// Taster auslesenDown_state_two|=(digitalRead(DOWN_BUTTON_TWO)==LOW);if(time>Ball_update){unsignedcharNew_x=Ball_x+Ball_dir_x;// neue BallpositionunsignedcharNew_y=Ball_y+Ball_dir_y;// Checkt ob die verticalen Wände berüht werdenif(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=Player_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=Player_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 Computer 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;}// Checkt ob der Spieler 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;}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;// updated bool auf true}display.drawFastVLine(CPU_X,Cpu_y,PADDLE_HEIGHT,BLACK);if(Up_state_two){Cpu_y-=1;}if(Down_state_two){Cpu_y+=1;}Up_state_two=Down_state_two=false;if(Cpu_y<1)Cpu_y=1;if(Cpu_y+PADDLE_HEIGHT>63)Cpu_y=63-PADDLE_HEIGHT;display.drawFastVLine(CPU_X,Cpu_y,PADDLE_HEIGHT,WHITE);// Spieler Paddeldisplay.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;if(Player_y+PADDLE_HEIGHT>63)Player_y=63-PADDLE_HEIGHT;display.drawFastVLine(PLAYER_X,Player_y,PADDLE_HEIGHT,WHITE);update=true;if(update)display.display();}