#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// Pin-Definitionen für die Joysticks
#define JOYSTICK1_VERT A0
#define JOYSTICK1_HORIZ A1
#define JOYSTICK1_SEL A2
#define JOYSTICK2_VERT A3
#define JOYSTICK2_HORIZ A4
#define JOYSTICK2_SEL A5
// Display-Definitionen
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Kein Reset-Pin verwendet
#define SCREEN_ADDRESS 0x3C // I2C Adresse des Displays
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Spielerposition und Blickrichtung
int playerX = SCREEN_WIDTH / 2;
int playerY = SCREEN_HEIGHT / 2;
int playerAngle = 0; // 0 - 359 Grad
void setup() {
// Initialisierung der seriellen Kommunikation für Debugging
Serial.begin(9600);
// Initialisierung des Displays
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(1000);
display.clearDisplay();
// Joystick-Eingänge initialisieren
pinMode(JOYSTICK1_SEL, INPUT_PULLUP);
pinMode(JOYSTICK2_SEL, INPUT_PULLUP);
}
void loop() {
// Joystick 1 (Bewegung) auslesen
int joy1Vert = analogRead(JOYSTICK1_VERT);
int joy1Horiz = analogRead(JOYSTICK1_HORIZ);
// Joystick 2 (Kamera) auslesen
int joy2Vert = analogRead(JOYSTICK2_VERT);
int joy2Horiz = analogRead(JOYSTICK2_HORIZ);
// Spielfigurbewegung
if (joy1Vert < 400) {
playerX += cos(radians(playerAngle));
playerY += sin(radians(playerAngle));
} else if (joy1Vert > 600) {
playerX -= cos(radians(playerAngle));
playerY -= sin(radians(playerAngle));
}
if (joy1Horiz < 400) {
playerAngle -= 5;
if (playerAngle < 0) playerAngle += 360;
} else if (joy1Horiz > 600) {
playerAngle += 5;
if (playerAngle >= 360) playerAngle -= 360;
}
// Bildschirm löschen und neu zeichnen
display.clearDisplay();
// 3D-Raum zeichnen (vereinfachte Wireframe-Darstellung)
draw3DRoom();
// Aktualisieren des Displays
display.display();
// Kurze Pause zur Vermeidung von zu schneller Aktualisierung
delay(50);
}
void draw3DRoom() {
// Einfacher 3D-Raum als Wireframe
int roomSize = 30; // Größe des Raums
// Vier Ecken des Raums in 3D berechnen
int corners[4][2];
for (int i = 0; i < 4; i++) {
int angle = playerAngle + i * 90;
corners[i][0] = playerX + cos(radians(angle)) * roomSize;
corners[i][1] = playerY + sin(radians(angle)) * roomSize;
}
// Zeichnen der Wände des Raums
for (int i = 0; i < 4; i++) {
int x1 = map(corners[i][0], playerX - roomSize, playerX + roomSize, 0, SCREEN_WIDTH);
int y1 = map(corners[i][1], playerY - roomSize, playerY + roomSize, 0, SCREEN_HEIGHT);
int x2 = map(corners[(i+1) % 4][0], playerX - roomSize, playerX + roomSize, 0, SCREEN_WIDTH);
int y2 = map(corners[(i+1) % 4][1], playerY - roomSize, playerY + roomSize, 0, SCREEN_HEIGHT);
display.drawLine(x1, y1, x2, y2, SSD1306_WHITE);
}
}