watch now!  

Willkommen bei Dino Run!

Tauche ein in die aufregende Welt von Dino Run, einem fesselnden Spiel, das sowohl für Anfänger als auch für erfahrene Spieler geeignet ist! Übernimm die Kontrolle über unseren mutigen Dino und springe über gefährliche Hindernisse, während du Punkte sammelst und deine Reaktionsfähigkeit testest.

Features:

  • Spannende Gameplay: Überwinde verschiedene Hindernisse, darunter Kakteen und fliegende Vögel, und steigere deinen Punktestand.
  • Einfache Steuerung: Nutze den Joystick, um den Dino zu steuern und ihn zum Springen zu bringen. Ideal für schnelle, actiongeladene Spielsessions!
  • Verschiedene Hindernisse: Jedes Spiel bietet neue Herausforderungen mit zufällig generierten Hindernissen.
  • Funktionalität mit Arduino: Erlebe die Kombination von Spiel und Technik. Entwickelt mit Arduino und OLED-Displays, um ein einzigartiges Spielerlebnis zu bieten.

Lerne mehr:

Auf dieser Seite findest du alle Informationen zu unserem Spiel, einschließlich der Download-Links für den Quellcode und hilfreiche Tutorials, um dein eigenes Dino Run-Spiel zu erstellen. Lass dich inspirieren und werde Teil der Dino Run-Community!

Beginne noch heute dein Abenteuer und erlebe den Nervenkitzel von Dino Run!

  • OLED-Display (I2C):

    • VCC an 5V (oder 3.3V, je nach Display)
    • GND an GND
    • SDA an A4 (bei Arduino Uno) oder SDA Pin des verwendeten Arduino-Boards
    • SCL an A5 (bei Arduino Uno) oder SCL Pin des verwendeten Arduino-Boards
  • Joystick:

    • VCC an 5V
    • GND an GND
    • X-Achse (horizontal) an A0 (oder einen anderen analogen Pin)
    • Y-Achse (vertikal) an A1 (optional, je nach Bedarf)
    • Button an D2 (oder einen anderen digitalen Pin)

Code :

#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

// OLED-Display über I2C
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

// Joystick Pins
const int joystickXPin = A0;  
const int joystickButtonPin = 2;  // Knopf zum Springen

// Spielvariablen
int dinoY = 48;  // Dino-Position auf der Y-Achse
int dinoVelocity = 0;  // Geschwindigkeit des Dinos
const int gravity = 1;  // Schwerkraft
bool isJumping = false;  // Springt der Dino gerade?
int obstacleX = 128;  // Hindernis-Position auf der X-Achse
int obstacleType = 0;  // Typ des Hindernisses (0: Quadrat, 1: Kreis, 2: Dreieck)
int score = 0;  // Punktestand
bool gameStarted = false;  // Spielstatus
const int groundY = 58;  // Y-Position des Bodens
int baseDelay = 50;  // Basisverzögerung in Millisekunden (geschwindigkeit bei 0 punkten)

void setup() {
  u8g2.begin();
  pinMode(joystickButtonPin, INPUT_PULLUP);  // Knopf für den Sprung
  resetGame();
}

// Menü anzeigen
void showMenu() {
  u8g2.clearBuffer();
  
  // "HD Robotics" oben
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(30, 10, "HD Robotics");
  
  // "Dino Run" in der Mitte
  u8g2.setFont(u8g2_font_fub14_tr);  // Mittlere Schriftart
  u8g2.drawStr(20, 35, "Dino Run");

  // URL "hdrobotics.de" unten
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(25, 55, "hdrobotics.de");
  
  u8g2.sendBuffer();
}

// Spiel zurücksetzen
void resetGame() {
  dinoY = 48;  
  dinoVelocity = 0;
  obstacleX = 128;
  obstacleType = random(0, 3);  // Zufälliger Hindernistyp
  isJumping = false;
  score = 0;
  gameStarted = false;
  showMenu();
}

void loop() {
  if (!gameStarted) {
    if (digitalRead(joystickButtonPin) == LOW) {  // Start bei Knopfdruck
      gameStarted = true;
      delay(300);  // Entprellen
    }
  } else {
    playGame();
  }
}

// Funktion zum Zeichnen des umgedrehten Dinos
void drawDino(int y) {
  // Körper (quadratisch)
  u8g2.drawBox(10, y, 10, 10);  // Hauptkörper

  // Kopf (kleiner Kreis) auf der rechten Seite, jetzt höher gesetzt
  u8g2.drawDisc(20, y - 2, 3, U8G2_DRAW_ALL);  // Dino Kopf (kleiner Kreis rechts, 2 Pixel höher)

  // Füße (zwei kleine Linien oder Rechtecke unten)
  u8g2.drawBox(11, y + 10, 2, 2);  // Linker Fuß
  u8g2.drawBox(17, y + 10, 2, 2);  // Rechter Fuß

  // Schwanz (Dreieck links am hinteren Teil)
  u8g2.drawTriangle(8, y + 5, 8, y + 9, 4, y + 7);  // Dino Schwanz links
}

// Funktion zum Zeichnen unterschiedlicher Hindernisse
void drawObstacle(int x, int type) {
  switch (type) {
    case 0:  // Quadrat
      u8g2.drawBox(x, 48, 10, 10);
      break;
    case 1:  // Kreis
      u8g2.drawDisc(x + 5, 53, 5, U8G2_DRAW_ALL);  // Kreis mit Radius 5
      break;
    case 2:  // Dreieck
      u8g2.drawTriangle(x, 58, x + 10, 58, x + 5, 48);  // Einfaches Dreieck
      break;
  }
}

// Funktion zum Zeichnen des Bodens
void drawGround() {
  u8g2.drawHLine(0, groundY, 128);  // Horizontale Linie als Boden
}

// Funktion zum Steuern und Spielen des Spiels
void playGame() {
  u8g2.clearBuffer();

  // Hindernis bewegen
  obstacleX -= 3;  // Hindernisgeschwindigkeit
  if (obstacleX < 0) {
    obstacleX = 128;
    obstacleType = random(0, 3);  // Neues Hindernis mit zufälliger Form
    score++;  // Punktestand erhöhen, wenn das Hindernis passiert wird
  }

  // Joystick-Steuerung zum Springen
  int joystickXValue = analogRead(joystickXPin);  // Lese den Joystick
  if ((digitalRead(joystickButtonPin) == LOW || joystickXValue < 512 - 50) && !isJumping) {
    dinoVelocity = -7;  // Reduzierte Sprunghöhe
    isJumping = true;
  }

  // Schwerkraft und Bewegung des Dinos
  dinoY += dinoVelocity;
  dinoVelocity += gravity;

  // Begrenzung der Dino-Position
  if (dinoY >= 48) {
    dinoY = 48;  // Bodenposition
    isJumping = false;  // Dino ist auf dem Boden
  }

  // Zeichnen des Dinos, des Hindernisses und des Bodens
  drawDino(dinoY);
  drawObstacle(obstacleX, obstacleType);
  drawGround();

  // Kollisionserkennung
  if (obstacleX < 20 && obstacleX > 0 && dinoY > 38) {  // Kollisionserkennung angepasst
    gameOver();
  }

  // Punktestand anzeigen (nur während des Spiels)
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.setCursor(5, 10);
  u8g2.print("Score: ");
  u8g2.print(score);

  // Frame aktualisieren
  u8g2.sendBuffer();

  // Berechnung der Verzögerung basierend auf dem Punktestand
  int currentDelay = baseDelay - (score);  // Verringert die Verzögerung um 1 ms pro Punkt
  delay(max(currentDelay, 10));  // Mindestverzögerung von 10 ms
}

// Funktion bei Spielende
void gameOver() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(30, 30, "Game Over!");
  u8g2.sendBuffer();
  delay(2000);  // Kurze Pause vor dem Neustart
  resetGame();
}