Mit Hilfe eines 2 Zeilen Displays und einem Joystick möchte ich ein Jump ‘n Run Spiel entwickeln.
Ziel des Spieles
Das Ziel des Spielers ist es einen entgegenkommenden Stein auszuweichen. Dabei kann der Spieler die Figur nach vorne, hinten, oben und unten bewegen. Die Grenzen der Bewegung sind durch das Display gegeben (2 Zeilen und 16 Zeichen). Jedes Mal, wenn der Spieler die rechte Seite quasi das Zeichen 16 erreicht hat, wird das Leben wieder aufgefrischt.
Ende des Spieles
Das Spiel ist zu Ende, wenn der Spieler alle 3 Leben verloren hat.
Aufbau der Schaltung
Als Erstes wird die Schaltung aufgebaut, da ich die verwendeten Teile der Schaltung bereits in diversen Tutorials beschrieben habe ist die Zusammensetzung eigentlich einfach.
Es soll noch keine Software laufen, sondern das Display, der Joystick sowie der Buzzer und die LEDs sind mit dem Arduino verbunden.
Da die Schaltung mit all den Komponenten ziemlich unübersichtlich ist. Habe ich diese mit der Software Fritzing “nachgezeichnet”.
Display Helligkeit
Das Display wird mit einem 50 kOhm Drehpotentiometer in der Helligkeit verändert.
Der Drehpotentiometer verfügt über drei Anschlüsse.
Anschluss “links” wird mit 5V verbunden sowie mit dem Anschluss VDD des Displays.
Anschluss “Mitte” wird mit V0 des Displays verbunden.
Anschluss “rechts” wird mit GND verbunden sowie mit dem Anschluss RW des Displays.
Des Weiteren wird die Hintergrundbeleuchtung mit einem 4,7kOhm Widerstand gedimmt.
Der Quellcode
#include <LiquidCrystal.h> //Bibliothek für das LCD Display. #define joystickX A0 //X Achse des Joysticks am analogen PIN A0. #define joystickY A1 //Y Achse des Joysticks am analogen PIN A1. #define buzzerPin 6 //Buzzer am digitalen PIN 6 //LED's für die Anzeige der vorhandenen Leben. #define ledPin1 8 //LED 1 am digitalen PIN 8 #define ledPin2 9 //LED 2 am digitalen PIN 9 #define ledPin3 10 //LED 3 am digitalen PIN 10 int currentMenRow = 0; //Variable zum Speichern der Y Position des "Männchen" int currentMenCol = 0; //Variable zum Speichern der X Position des "Männchen" int currentStarRow = 1; //Variable zum Speichern der Y Position des "Steines" int currentStarCol = 0; //Variable zum Speichern der X Position des "Steines" //Variable zum Speichern des zustandes ob eine Stein //sich gerade von Rechts nach Links bewegt. boolean starIsRunning = false; //Variable zum Speichern der Anzahl der Leben. int countLive = 3; //Variable für den Timer //Dieser Wert wird je nach Spieldauer erhöht. int timerDelay = 150; //Initialisierung des LCD Displays LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { //Begin der seriellen Kommunikation mit 9600 Baud Serial.begin(9600); //Initialisieren des LCD Displays mit 16 Zeichen und 2 Zeilen lcd.begin(16, 2); //digitale PINs der LED's als Ausgangssignale setzen. pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); //Alles auf default Werte setzen. doReset(); //In der ersten Zeile, am 2 Zeichen folgenden Text ausgeben. lcd.setCursor(2, 0); lcd.print("Start in "); //Zahlen von 3 bis 1 ausgeben. (Countdown) for(int i=3;i>0;i--){ lcd.setCursor(11, 0); lcd.print(i); delay(750); } } void loop() { //Wenn der Spieler kein Leben mehr hat dann beenden. if(countLive ==0){ lcd.clear(); lcd.setCursor(6, 0); lcd.print("ENDE"); delay(150000); //Eine lange Pause. return; } //Die Millisekunden seit dem der Arduino gestartet wurde auslesen und die durch 1000 rechnen. //Dieser Wert wird benötigt um die aktuelle Spielstärke zu errechnen. int currentSeconds = millis()/1000; //Berechnen der Spielstärke if(currentSeconds > 0 && currentSeconds< 15){ //zwischen 0 und 15 Sekunden timerDelay = 150; } else if (currentSeconds > 15 && currentSeconds< 25){ //größer 15 Sekunden und kleiner 25 Sekunden timerDelay = 125; } else if (currentSeconds > 25 && currentSeconds< 35){ //größer 25 Sekunden und kleiner 35 Sekunden timerDelay = 100; } else if (currentSeconds > 35){ //größer 35 Sekunden timerDelay = 75; } //Löschen des Inhalts auf dem LCD Display. lcd.clear(); //erzeugen eines Sterns. createStar(); //Auslesen der X & Y Achse des Joysticks. int x = analogRead(joystickX); int y = analogRead(joystickY); //Wenn der X Wert gleich 0 ist wurde der Joystick nach oben gedrückt. if(x == 0){ up(); } else if(x > 670){ // Wenn der X Wert größer 670 ist dann nach unten. down(); } //Wenn der Y Wert gleich 0 ist dann wurde der Joystick nach rechts gedrückt. if(y == 0){ left(); } else if(y > 670){ //Wenn der Y Wert größer 670 ist dann wurde der Joystick nach links gedrückt. right(); } //Wenn die aktuelle Position des Sterns größer 0 ist //dann soll die Position um eins gesenkt werden. if(currentStarCol >0){ currentStarCol = currentStarCol -1; } else { //Wenn die Position gleich 0 ist dann soll ein neuer Stern erzeugt werden. starIsRunning = false; } //Darstellen des Männchen im LCD Displays anhand der Positionsdaten lcd.setCursor(currentMenCol, currentMenRow); lcd.print("I"); //Darstellen des Sterns im LCD Displays anhand der Positionsdaten lcd.setCursor(currentStarCol, currentStarRow); lcd.print("*"); //Wenn die Position des Männchen & des Sterns gleich sind, dann soll ein Ton ausgegeben //sowie ein Leben abgezogen werden. if(currentMenCol == currentStarCol && currentMenRow == currentStarRow){ playDeathTone(); countLive--; } //Wenn das Männchen es nach ganz rechts im LCD Display geschaft hat. //Dann soll ein Leben aufgefüllt werden. if(currentMenCol == 16){ addLive(); } //aktualisieren der LEDs showLive(countLive); //Pause, anhand der Spielstärke. delay(timerDelay); } /* * Wenn das Männchen die letzte Spalte im Display erreicht hat soll ein Leven aufgefrischt werden. * Maximal gibt es 3 Leben. */ void addLive(){ if(countLive < 3){ countLive++; } } /** * LED's aktiv bzw. deaktiv bei Anzahl der Leben. */ void showLive(int countLive){ digitalWrite(ledPin1, countLive >= 1? HIGH:LOW); digitalWrite(ledPin2, countLive >= 2? HIGH:LOW); digitalWrite(ledPin3, countLive >= 3? HIGH:LOW); } /** * Erzeugt einen Stern. * Wenn gerade ein Stern "wandert" so wird kein neuer erzeugt. */ void createStar(){ if(starIsRunning){ return; } starIsRunning = true; int randomNumber = random(2000)% 2; currentStarRow = randomNumber; currentStarCol = 16; } /** * Taste "nach oben" wurde betätigt. */ void up(){ if(currentMenRow>0){ currentMenRow = currentMenRow-1; } } /** * Taste "nach unten" wurde betätigt. */ void down(){ if(currentMenRow<=1){ currentMenRow = currentMenRow+1; } } /** * Taste "nach links" wurde betätigt. */ void left(){ if(currentMenCol>=0 && currentMenCol < 16){ currentMenCol = currentMenCol+1; } } /** * Taste "nach rechts" wurde betätigt. */ void right(){ if(currentMenCol > 0){ currentMenCol = currentMenCol-1; } } /** * LEDs "anschalten" */ void doReset(){ digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, HIGH); } /* * Ton ausgeben. */ void playDeathTone(){ tone(buzzerPin, 500); delay(55); noTone(buzzerPin); }