Arduino Projekt: Pong Spiel: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 7: Zeile 7:
* Ein Punkt (Ball) bewegt sich auf dem Bildschirm hin und her.  
* Ein Punkt (Ball) bewegt sich auf dem Bildschirm hin und her.  
* Jeder der beiden Spieler steuert einen senkrechten Strich (Schläger), den er mit zwei Tastern nach oben und unten steuern kann.  
* Jeder der beiden Spieler steuert einen senkrechten Strich (Schläger), den er mit zwei Tastern nach oben und unten steuern kann.  
* Lässt man den „Ball“ am „Schläger“ vorbei und berührt die Wand, erhält der Gegner einen Punkt.<br>
* Wenn die linke oder rechte Wand berührt wird, erhält der Gegner einen Punkt.<br>


⇒ Für den Fall, dass kein Arduino zur Verfügung steht, kann ein '''webbasierter Arduino Emulator''' verwendet werden. [https://wokwi.com/projects/new/arduino-uno [klicken]]
⇒ Für den Fall, dass '''kein Arduino''' zur Verfügung steht oder '''Materialien''' nicht vorhanden sind. Kann dieser '''webbasierter Arduino Emulator''' verwendet werden. [https://wokwi.com/projects/new/arduino-uno [klicken]]
<br><br>
<br><br>
[[Datei:PongGameUML.png|600px]]<br>
[[Datei:PongGameUML.png|600px]]<br>
Zeile 54: Zeile 54:
== Aufbau Schaltung ==
== Aufbau Schaltung ==
[[Datei:Schaltung_Pong.png|500px|thumb|right|Abb.4 Schaltung Pong Spiel]]
[[Datei:Schaltung_Pong.png|500px|thumb|right|Abb.4 Schaltung Pong Spiel]]
In Abb. 4 wird die Schaltung für das Projekt "Arduino Pong Spiel" dargestellt.<br>
In Abbildung 4 wird die Schaltung für das Projekt "Arduino Pong Spiel" dargestellt.<br>
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.


==Programmierung==
==Programmierung==
Es ist wichtig, die [[Programmierrichtlinien Einsteiger|['''Programmierrichtlinien''']]] beim Programmieren einzuhalten.
Es ist wichtig, die [[Programmierrichtlinien Einsteiger|['''Programmierrichtlinien''']]] beim Programmieren einzuhalten.<br><br>
<br><br>
Wenn Sie Fragen zur Programmierung haben, finden Sie die Antworten in den [https://wiki.hshl.de/wiki/index.php/Kategorie:Arduino:_Projekt_Grundkenntnisse ['''Grundkenntnissen''']].
<br>
----
----
=== Bibliotheken einfügen===
=== Bibliotheken einfügen===
Zeile 87: Zeile 88:
=== Initialisierung Arduino===
=== Initialisierung Arduino===
'''1. Taster initialisieren'''<br>
'''1. Taster initialisieren'''<br>
Zuerst müssen Sie allen vier Tastern einen Pin am Arduino zugewiesen werden. Diese kann man beliebig an den digitalen Schnittstellen anschließen.<br>
Zuerst müssen Sie allen vier Tastern einen Pin am Arduino zugewiesen werden. Diese können Sie beliebig an den digitalen Schnittstellen anschließen.<br>
Danach werden die Pins mit [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Pulsierende_LED)#pinMode() '''<code>pinMode();</code>'''] und [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Arduino_LED_W%C3%BCrfel)#digitalWrite() '''<code>digitalWrite();'''</code>] initialisiert.
Danach werden die Pins mit [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Pulsierende_LED)#pinMode() '''<code>pinMode();</code>'''] und [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Arduino_LED_W%C3%BCrfel)#digitalWrite() '''<code>digitalWrite();'''</code>] initialisiert.


Zeile 124: Zeile 125:


'''2. OLED Display initialisieren''' <br>
'''2. OLED Display initialisieren''' <br>
Hierfür nutzt man die [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Arduino_Pong_Spiel)#OLED_Display <code>'''Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);'''</code>] Funktion.
Nutzen Sie die [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Arduino_Pong_Spiel)#OLED_Display <code>'''Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);'''</code>] Funktion.


['''Quelltext 3: ''' <code>Pong.ino</code>]
['''Quelltext 3: ''' <code>Pong.ino</code>]
Zeile 217: Zeile 218:
|}
|}


'''1. Display Spielname anzeigen''' <br>
''' Display Spielname anzeigen''' <br>
Als optionale Zusatzaufgabe können Sie den Namen '''Pong Spiel''' auf dem Display anzeigen lassen.<br>
Als optionale Zusatzaufgabe können Sie den Namen '''Pong Spiel''' auf dem Display anzeigen lassen.<br>


Zeile 254: Zeile 255:
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">


/* Punkteanzeigen */
void drawScore()  
void drawScore() {              
{
  display.setTextSize(2);
display.setTextSize(2);
  display.setTextColor(WHITE);
display.setTextColor(WHITE);
  display.setCursor(43, 0);
display.setCursor(43, 0);
  display.println(Player_one);
display.println(playerOne);


  display.setCursor(73, 0);
display.setCursor(73, 0);
  display.println(Player_two);  
display.println(playerTwo);
}
}
/* Punkte zurücksetzten */
/* Punkte zurücksetzten */
void eraseScore() {                              
void eraseScore()  
  display.setTextSize(2);
{
  display.setTextColor(BLACK);
display.setTextSize(2);
  display.setCursor(43, 0);
display.setTextColor(BLACK);
  display.println(Player_one);
display.setCursor(43, 0);
 
display.println(playerOne);
  display.setCursor(73, 0);
 
  display.println(Player_two);
display.setCursor(73, 0);
display.println(playerTwo);
}
}
</syntaxhighlight>
</syntaxhighlight>
Zeile 278: Zeile 281:


----
----
=== Bewegter Ball===
=== Bewegter Ball===
Damit der Ball sich auf dem Display bewegt, benötigt man eine '''Rechenfunktion'''.<br>
Damit der Ball sich auf dem Display bewegt, benötigt Sie eine '''Rechenfunktion'''.<br>


'''Tipp: ''' Rechnen Sie den X und Y Wert + 1 und erstellen Sie eine neue Variable.
'''Tipp: ''' Rechnen Sie den X und Y Wert + 1 und erstellen Sie eine neue Variable.
Zeile 313: Zeile 317:
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
if (time > Ball_update) {
/* Checkt ob die vertikalen Wände berührt werden */
    /* Neue Ballposition */
  if (New_x == 0) // Wand links
    unsigned char New_x = Ball_x + Ball_dir_x;               // (x+1)
  {                        
    unsigned char New_y = Ball_y + Ball_dir_y;               // (y+1)
    ballDir_x = -ballDir_x;            // Wechselt die Richtung
    New_x += ballDir_x + ballDir_x;
    eraseScore();                        // Punkt für Spieler
    playerOne += 1;
    drawScore();
    New_x = 64;                           // Ball Reset
    New_y = 32;
  }


    /* Checkt, ob die vertikalen Wände berührt werden */
  if (New_x == 127)   // Wand rechts
    if (New_x == 0) {                        // Wand links
  {                     
      Ball_dir_x = -Ball_dir_x;            // Wechselt die Richtung
       ballDir_x = -ballDir_x;            // Wechselt die Richtung
      New_x += Ball_dir_x + Ball_dir_x;
       New_x += ballDir_x + ballDir_x;
      eraseScore();                        // Punkt für Spieler
      Player_one += 1;
      drawScore();
      New_x = 64;                          // Ball Reset
      New_y = 32;
 
    }
    if (New_x == 127) {                    // Wand rechts
       Ball_dir_x = -Ball_dir_x;            // Wechselt die Richtung
       New_x += Ball_dir_x + Ball_dir_x;
       eraseScore();                        // Punkt für Spieler 2
       eraseScore();                        // Punkt für Spieler 2
       Player_two += 1;
       playerTwo += 1;
       drawScore();
       drawScore();
       New_x = 64;                          // Ball Reset
       New_x = 64;                          // Ball Reset
Zeile 339: Zeile 340:
     }
     }


    // Checkt, ob die horizontalen Wände berührt werden
// Checkt ob die horizontalen Wände berührt werden
    if (New_y == 0 || New_y == 63) {
  if (New_y == 0 || New_y == 63)  
      Ball_dir_y = -Ball_dir_y;          // Wechselt die Richtung
  {
      New_y += Ball_dir_y + Ball_dir_y;
    ballDir_y = -ballDir_y;          // Wechselt die Richtung
 
    New_y += ballDir_y + ballDir_y;
    }
  }
}
 
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Zeile 361: Zeile 360:
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
  /* Checkt, ob der Spieler 1 Paddel getroffen wurde */
  // Checkt, ob der Spieler 1 Paddel getroffen wurde
if (New_x == PLAYER_ONE_X && New_y >= Player_one_y && New_y <= Player_one_y + PADDLE_HEIGHT) {
  if (New_x == PLAYER_ONE_X && New_y >= playerOne_y && New_y <= playerOne_y + PADDLE_HEIGHT)  
  Ball_dir_x = -Ball_dir_x;
  {
  New_x += Ball_dir_x + Ball_dir_x;
    ballDir_x = -ballDir_x;
}
    New_x += ballDir_x + ballDir_x;
  }


/* Checkt, ob der Spieler 2 Paddel getroffen wurde */
// Checkt, ob der Spieler 2 Paddel getroffen wurde
if (New_x == PLAYER_two_X && New_y >= Player_two_y && New_y <= Player_two_y + PADDLE_HEIGHT) {
  if (New_x == PLAYER_TWO_X && New_y >= playerTwo_y && New_y <= playerTwo_y + PADDLE_HEIGHT) {
  Ball_dir_x = -Ball_dir_x;
    ballDir_x = -ballDir_x;
  New_x += Ball_dir_x + Ball_dir_x;
    New_x += ballDir_x + ballDir_x;
}
  }
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Zeile 387: Zeile 387:
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
  display.drawPixel(Ball_x, Ball_y, BLACK);
display.drawPixel(ballX, ballY, BLACK);
  display.drawPixel(New_x, New_y, WHITE);
    display.drawPixel(New_x, New_y, WHITE);
  Ball_x = New_x;
    ballX = New_x;
  Ball_y = New_y;
    ballY = New_y;


  Ball_update += BALL_RATE;
    ballUpdate += BALL_RATE;
  display.display();        // Später: update = true;   (true = display.display();
    update = true;               // true ~ display.display();
  }
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Zeile 414: Zeile 414:
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
bool update = false;                          // Ein bool enthält einen von zwei Werten, true oder false
unsigned long time = millis();              // Zeit-Variable


bool update = false;                          // Ein bool enthält einen von zwei Werten, true oder false
static bool UP_STATE = false;
 
static bool DOWN_STATE = false;
  static bool Up_state = false;
static bool UP_STATE_TWO = false;
  static bool Down_state = false;
static bool DOWN_STATE_TWO = false;
  static bool Up_state_two = false;
  static bool Down_state_two = false;
 
  Up_state |= (digitalRead(UP_BUTTON) == LOW);                  // Taster auslesen
  Down_state |= (digitalRead(DOWN_BUTTON) == LOW);
  Up_state_two |= (digitalRead(UP_BUTTON_TWO) == LOW);
  Down_state_two |= (digitalRead(DOWN_BUTTON_TWO) == LOW);


UP_STATE |= (digitalRead(UP_BUTTON) == LOW);                  // Taster auslesen
DOWN_STATE |= (digitalRead(DOWN_BUTTON) == LOW);
UP_STATE_TWO |= (digitalRead(UP_BUTTON_TWO) == LOW);
DOWN_STATE_TWO |= (digitalRead(DOWN_BUTTON_TWO) == LOW);


if (update)                      // Wenn Variable = true wird display.display(); ausgeführt
if (update)                      // Wenn Variable = true wird display.display(); ausgeführt
    display.display();
display.display();
}
}
</syntaxhighlight>
</syntaxhighlight>
Zeile 442: Zeile 441:
'''Tipp: '''<br>
'''Tipp: '''<br>
# Der Ablauf ist ähnlich wie beim Ball, nur wird die if-Bedingung von den Tastern betätigt.
# Der Ablauf ist ähnlich wie beim Ball, nur wird die if-Bedingung von den Tastern betätigt.
# Zusätzlich müssen noch die Schläger auf dem Display mit der Funktion <br> <code>'''display.drawFastVLine(PLAYER_ONE_X, Player_one_y, PADDLE_HEIGHT, BLACK);'''</code> angezeigt werden.
# Zusätzlich müssen noch die Schläger auf dem Display mit der Funktion <br> <code>'''display.drawFastVLine(PLAYER_ONE_X, playerOne_y, PADDLE_HEIGHT, BLACK);'''</code> angezeigt werden.


['''Quelltext 14: ''' <code>Pong.ino</code>]
['''Quelltext 14: ''' <code>Pong.ino</code>]
Zeile 451: Zeile 450:
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Spieler 1 Paddel */
/* Spieler 1 Paddel */
   display.drawFastVLine(PLAYER_ONE_X, Player_one_y, PADDLE_HEIGHT, BLACK);
   display.drawFastVLine(PLAYER_ONE_X, playerOne_y, PADDLE_HEIGHT, BLACK);
   if (Up_state) {
   if (UP_STATE)  
    Player_one_y -= 1;
  {
  playerOne_y -= 1;
   }
   }
   if (Down_state) {
   if (DOWN_STATE)  
     Player_one_y += 1;
  {
     playerOne_y += 1;
   }
   }
  Up_state = Down_state = false;
  UP_STATE = DOWN_STATE = false;
    
    
  if (Player_one_y < 1) Player_one_y = 1;                                    // Um nicht aus dem Bildschirm zu gelangen
  if (playerOne_y < 1) playerOne_y = 1;                                    // Um nicht aus dem Bildschirm zu gelangen
  if (Player_one_y + PADDLE_HEIGHT > 63) Player_one_y = 63 - PADDLE_HEIGHT;
  if (playerOne_y + PADDLE_HEIGHT > 63) playerOne_y = 63 - PADDLE_HEIGHT;
  display.drawFastVLine(PLAYER_ONE_X, Player_one_y, PADDLE_HEIGHT, WHITE);
  display.drawFastVLine(PLAYER_ONE_X, playerOne_y, PADDLE_HEIGHT, WHITE);


  update = true;
  update = true;


/* Spieler 2 Paddel */
/* Spieler 2 Paddel */
   display.drawFastVLine(PLAYER_TWO_X, Player_two_y, PADDLE_HEIGHT, BLACK);
   display.drawFastVLine(PLAYER_TWO_X, playerTwo_y, PADDLE_HEIGHT, BLACK);
   if (Up_state_two) {
   if (UP_STATE_TWO)  
     Player_two_y -= 1;                      // Paddle 1 nach unten
  {
     playerTwo_y -= 1;                      // Paddle 1 nach unten
   }
   }
   if (Down_state_two) {
   if (DOWN_STATE_TWO)  
     Player_two_y += 1;                      // Paddle 1 nach oben
  {
     playerTwo_y += 1;                      // Paddle 1 nach oben
   }
   }
  Up_state_two = Down_state_two = false;
  UP_STATE_TWO = DOWN_STATE_TWO = false;
    
    
   if (Player_two_y < 1) Player_two_y = 1;                                        // Um nicht aus dem Bildschirm zu gelangen
   if (playerTwo_y < 1) playerTwo_y = 1;                                        // Um nicht aus dem Bildschirm zugelangen
   if (Player_two_y + PADDLE_HEIGHT > 63) Player_two_y = 63 - PADDLE_HEIGHT;
   if (playerTwo_y + PADDLE_HEIGHT > 63) playerTwo_y = 63 - PADDLE_HEIGHT;
   display.drawFastVLine(PLAYER_TWO_X, Player_two_y, PADDLE_HEIGHT, WHITE);
   display.drawFastVLine(PLAYER_TWO_X, playerTwo_y, PADDLE_HEIGHT, WHITE);
 
  if (update)                    //hierhin verschieben
  display.display();
}
}
</syntaxhighlight>
</syntaxhighlight>
Zeile 576: Zeile 582:
  display.println(playerTwo);
  display.println(playerTwo);
}
}
/* Punkte zurücksetzten */
/* Punkte zurücksetzten */
void eraseScore()  
void eraseScore()  
Zeile 603: Zeile 610:
  DOWN_STATE |= (digitalRead(DOWN_BUTTON) == LOW);
  DOWN_STATE |= (digitalRead(DOWN_BUTTON) == LOW);
  UP_STATE_TWO |= (digitalRead(UP_BUTTON_TWO) == LOW);
  UP_STATE_TWO |= (digitalRead(UP_BUTTON_TWO) == LOW);
  DOWN_STATE_TWP |= (digitalRead(DOWN_BUTTON_TWO) == LOW);
  DOWN_STATE_TWO |= (digitalRead(DOWN_BUTTON_TWO) == LOW);


/* Neue Ballposition */
/* Neue Ballposition */
   if (time > ballUpdate)  
   if (time > ballUpdate)  
   {
   {
  /* Neue Ballposition */
   unsigned char New_x = ballX + ballDir_x;              // (x+1)
   unsigned char New_x = ballX + ballDir_x;              // (x+1)
   unsigned char New_y = ballY + ballDir_y;              // (y+1)
   unsigned char New_y = ballY + ballDir_y;              // (y+1)


/* Checkt ob die vertikalen Wände berüht werden */
/* Checkt ob die vertikalen Wände berührt werden */
   if (New_x == 0)  // Wand links
   if (New_x == 0)  // Wand links
   {                         
   {                         
Zeile 635: Zeile 641:
     }
     }


// Checkt ob die horizontalen Wände berüht werden
// Checkt ob die horizontalen Wände berührt werden
   if (New_y == 0 || New_y == 63)  
   if (New_y == 0 || New_y == 63)  
   {
   {
Zeile 703: Zeile 709:
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Quelle: [https://github.com/shveytank/Arduino_Pong_Game Link]
[https://github.com/shveytank/Arduino_Pong_Game Quelle]


<br>
<br>
----
----
'''→ zurück zum Hauptartikel: [[Konzipierung_und_Evaluierung_von_Arduino-Projekten_verschiedener_Schwierigkeitsgrade_für_die_Lehre | BA: Arduino-Projekte für die Lehre]]'''
'''→ zurück zum Hauptartikel: [[Konzipierung_und_Evaluierung_von_Arduino-Projekten_verschiedener_Schwierigkeitsgrade_für_die_Lehre | BA: Arduino-Projekte für die Lehre]]'''

Aktuelle Version vom 12. September 2023, 07:10 Uhr

Abb. 1: Pong Spiel

Autor: Justin Frommberger

Aufgabenstellung

Das Ziel dieses Projektes ist, ein eigenes Pong-Spiel umzusetzen.

  • Ein Punkt (Ball) bewegt sich auf dem Bildschirm hin und her.
  • Jeder der beiden Spieler steuert einen senkrechten Strich (Schläger), den er mit zwei Tastern nach oben und unten steuern kann.
  • Wenn die linke oder rechte Wand berührt wird, erhält der Gegner einen Punkt.

⇒ Für den Fall, dass kein Arduino zur Verfügung steht oder Materialien nicht vorhanden sind. Kann dieser webbasierter Arduino Emulator verwendet werden. [klicken]


[Abb. 2: UML]

Benötigte Materiallien

Tabelle 1: Materialliste
Nr. Anz. Beschreibung Bild
1 Funduino Arduino UNO R3
1 Typ 2
14+ Jumperkabel, männlich/männlich
1 Steckbrett
4 Taster
1 0.96 I2C OLED Display

Vorab wichtig zu wissen!

Abb. 3: OLED Display

OLED Display:

Beim UNO R3 gibt es dafür oberhalb des Pin 13 einen SDA und SCL Pin, alternativ können auch die analogen Pins A4 (SDA) und A5 (SCL) verwendet werden.

Tabelle 2: OLED Display Pins
VCC Pin für die Spannungsversorgung, anzuschließen an den 5V Pin des Mikrocontrollers
GND Ground-Pin, anzuschließen an den GND Pin des Mikrocontrollers
SDA Überträgt Daten oder Adressen
SCL Überträgt den Takt

Aufbau Schaltung

Abb.4 Schaltung Pong Spiel

In Abbildung 4 wird die Schaltung für das Projekt "Arduino Pong Spiel" dargestellt.
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.

Programmierung

Es ist wichtig, die [Programmierrichtlinien] beim Programmieren einzuhalten.

Wenn Sie Fragen zur Programmierung haben, finden Sie die Antworten in den [Grundkenntnissen].


Bibliotheken einfügen

Downloaden Sie die Bibliotheken für das OLED Display [SSD10306] und [GFX].

Benötigt wird:

  1. Kommunikation zum I2C/TWI Gerät: Wire.h
  2. Kommunikation mit dem SPI Gerät: SPI.h
  3. Adafruit GFX Grafik: Adafruit_GFX.h
  4. 128x64 and 128x32 OLEDs Displays: Adafruit_SSD1306.h

[Quelltext 1: Pong.ino]


Initialisierung Arduino

1. Taster initialisieren
Zuerst müssen Sie allen vier Tastern einen Pin am Arduino zugewiesen werden. Diese können Sie beliebig an den digitalen Schnittstellen anschließen.
Danach werden die Pins mit pinMode(); und digitalWrite(); initialisiert.

[Quelltext 2: Pong.ino]

2. OLED Display initialisieren
Nutzen Sie die Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Funktion.

[Quelltext 3: Pong.ino]

3. Variablen initialisieren
Auch können vorab Variablen bestimmt werden, die für die Programmierung benötigt werden.

  • Die Größe des Displays und die Ball Rate
  • Zwei Variablen für eine Punkteanzeige
  • BALL_RATE ist die Rate in Millisekunden, mit der der Ball aktualisiert werden soll.
    • Höhere Zahl: langsamerer Ball
    • Niedrigere Zahl: schnellerer Ball

[Quelltext 4: Pong.ino]

4. Position vom Ball, Paddle und Spieler auf dem Display festlegen

  • Benötigte Postionen sind: Ball, Spieler 1 (playerOne) und Spieler 2 (playerTwo).
  • Benötigt wird eine Update-Variable, um den Ball zu bewegen.
  • Dieser Werte können nach Geschmack angepasst werden.

[Quelltext 5: Pong.ino]


Display hochfahren

Um später zu sehen, wo Sie 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.

[Quelltext 6: Pong.ino]

Display Spielname anzeigen
Als optionale Zusatzaufgabe können Sie den Namen Pong Spiel auf dem Display anzeigen lassen.

Tipp: Hierfür werden die display.set(); und display.println(); Funktionen benötigt.

[Quelltext 7: Pong.ino]


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.

[Quelltext 8: Pong.ino]


Bewegter Ball

Damit der Ball sich auf dem Display bewegt, benötigt Sie eine Rechenfunktion.

Tipp: Rechnen Sie den X und Y Wert + 1 und erstellen Sie eine neue Variable.

[Quelltext 9: Pong.ino]

1. Wände erkennen
Damit der Ball wie gewünscht von den Wänden abprallt, müssen die Wände bei Berührung mit einer if-Bedingung() abgefragt werden.

  • Wenn der Ball auf eine Wand trifft, muss die Richtung vom Ball geändert werden.
  • Zusätzlich soll der Spieler einen Punkt bekommen, wenn die linke oder rechte Wand berührt wurde.

Tipp: Wenn die X oder Y Position von der Wand erreicht wurde, negieren Sie den Addierer.

[Quelltext 10: Pong.ino]

2. Paddel erkennen
Auch muss der Ball, wenn er den Schläger berührt, seine Richtung ändern.

Tipp: Die Position von den Paddeln muss kleiner sein als die Position vom Ball.

[Quelltext 11: Pong.ino]

3. Neue Ballposition anzeigen
Nun kann sich der Ball bewegen, muss aber noch auf dem Display als Pixel angezeigt und die alten Pixel wieder gelöscht werden.
Außerdem müssen die neuen Variablen übertragen werden auf die alten, um weitere Abläufe zu ermöglichen.

Tipp: Nutze display.drawPixel(Name, Name, BLACK/WHITE);.

[Quelltext 12: Pong.ino]


Boolean Taster

Um die Taster abzufragen und falsche Eingaben zu überprüfen, wird mit einem bool programmiert.

Tipp:

  1. Neue Variablen für die Taster mit bool initialisieren.
  2. Die alten und neuen Variablen auf LOW zu setzen, um die Taster schalten zu können.
  3. Wenn die bool Variable = true ist, soll das Display mit display.display(); aktualisiert werden.

[Quelltext 13: Pong.ino]


Paddel Spieler

Der letzte Schritt ist, die Schläger mit den Tastern steuerbar zu machen.
Diese dürfen aber nicht aus dem Display gelangen.

Tipp:

  1. Der Ablauf ist ähnlich wie beim Ball, nur wird die if-Bedingung von den Tastern betätigt.
  2. Zusätzlich müssen noch die Schläger auf dem Display mit der Funktion
    display.drawFastVLine(PLAYER_ONE_X, playerOne_y, PADDLE_HEIGHT, BLACK); angezeigt werden.

[Quelltext 14: Pong.ino]

Musterlösung

Quelle



→ zurück zum Hauptartikel: BA: Arduino-Projekte für die Lehre