All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 7m46s
296 lines
7.1 KiB
Markdown
296 lines
7.1 KiB
Markdown
# 🏃 Escape From Teacher
|
||
|
||
Ein Endless-Runner-Spiel entwickelt als Schulprojekt. Renne vor dem Lehrer davon, sammle Münzen, nutze Power-Ups und klettere an Wänden!
|
||
|
||

|
||

|
||

|
||
|
||
## 📋 Inhaltsverzeichnis
|
||
|
||
- [Features](#-features)
|
||
- [Technologie-Stack](#-technologie-stack)
|
||
- [Installation](#-installation)
|
||
- [Spielmodi](#-spielmodi)
|
||
- [Entwicklung](#-entwicklung)
|
||
- [Architektur](#-architektur)
|
||
- [Tools](#-tools)
|
||
- [Lizenz](#-lizenz)
|
||
|
||
## ✨ Features
|
||
|
||
### Gameplay
|
||
- 🏃 **Endless Runner**: Unendliches Spiel mit prozedural generierten Levels
|
||
- 🧗 **Wall Climbing**: Klettere an Wänden hoch für neue Strategien
|
||
- 💰 **Coins & Power-Ups**: Sammle Münzen und nutze Power-Ups wie Double Jump und Godmode
|
||
- 🎯 **Hindernisse**: Weiche bewegenden Plattformen und Objekten aus
|
||
- ⚡ **Dynamische Schwierigkeit**: Das Spiel wird mit der Zeit schneller
|
||
|
||
### Modi
|
||
- 👤 **Solo-Modus**: Spiele alleine und sammle Highscores
|
||
- 👥 **Coop-Modus**: Spiele mit Freunden im Team
|
||
- Team-Namen für Leaderboard
|
||
- Multiplizierter Score basierend auf lebenden Spielern
|
||
- Host-Controls für Lobby-Management
|
||
|
||
### Features
|
||
- 🏆 **Leaderboard**: Redis-basiertes globales Leaderboard mit Proof-Codes
|
||
- 🎮 **Cross-Platform**: Web (WASM) und Desktop (Native)
|
||
- 🎨 **Level Editor**: Erstelle eigene Levels mit dem integrierten Level Builder
|
||
- 🔊 **Audio**: Musik und Sound-Effekte mit Lautstärkeregelung
|
||
- 📱 **Mobile Support**: Touch-Controls für mobile Geräte
|
||
|
||
## 🛠 Technologie-Stack
|
||
|
||
### Backend
|
||
- **Go 1.25+**: Server und Game-Logik
|
||
- **NATS**: Message Broker für Echtzeit-Kommunikation (Legacy)
|
||
- **WebSocket**: Direkte WebSocket-Verbindungen für niedrige Latenz
|
||
- **Redis**: Persistentes Leaderboard mit Proof-Code-Validierung
|
||
|
||
### Frontend
|
||
- **Go + WASM + Ebiten**: Web-Client kompiliert zu WebAssembly
|
||
- **HTML/CSS/JavaScript**: Web-UI und Menüs
|
||
|
||
### Architektur
|
||
- **Client-Side Prediction**: Flüssiges Gameplay trotz Netzwerk-Latenz
|
||
- **Server-Authoritative**: Server validiert alle Spielaktionen
|
||
- **Deterministische Physik**: Gleiche Physik auf Client und Server
|
||
|
||
## 📦 Installation
|
||
|
||
### Voraussetzungen
|
||
|
||
```bash
|
||
# Go 1.25 oder höher
|
||
go version
|
||
|
||
# Redis für Leaderboard
|
||
redis-server --version
|
||
```
|
||
|
||
### Repository klonen
|
||
|
||
```bash
|
||
git clone https://git.zb-server.de/ZB-Server/EscapeFromTeacher.git
|
||
cd EscapeFromTeacher
|
||
```
|
||
|
||
### Assets generieren
|
||
|
||
Die Assets müssen aus den Raw-Dateien generiert werden:
|
||
|
||
```bash
|
||
# Asset-Builder starten (GUI)
|
||
go run ./cmd/builder
|
||
|
||
# Im GUI: Assets laden, anpassen und speichern
|
||
# Dies erstellt cmd/client/web/assets/assets.json und die PNG-Dateien
|
||
```
|
||
|
||
### Server starten
|
||
|
||
```bash
|
||
# Redis starten (Terminal 1)
|
||
redis-server
|
||
|
||
# Server starten (Terminal 2)
|
||
go run ./cmd/server
|
||
```
|
||
|
||
Server läuft auf `http://localhost:8080`
|
||
|
||
### Clients starten
|
||
|
||
#### Web-Client (WASM)
|
||
|
||
```bash
|
||
# WASM kompilieren
|
||
GOOS=js GOARCH=wasm go build -o cmd/client/web/main.wasm ./cmd/client
|
||
|
||
# Web-Server starten (z.B. mit Python)
|
||
cd cmd/client/web
|
||
python3 -m http.server 8000
|
||
|
||
# Browser öffnen: http://localhost:8000
|
||
```
|
||
|
||
#### Desktop-Client (Native)
|
||
|
||
```bash
|
||
go run ./cmd/client
|
||
```
|
||
|
||
## 🎮 Spielmodi
|
||
|
||
### Solo-Modus
|
||
- Starte direkt aus dem Hauptmenü
|
||
- Automatischer Room-Erstellen
|
||
- Score basiert auf zurückgelegter Distanz
|
||
- Eigener Highscore im Leaderboard
|
||
|
||
### Coop-Modus
|
||
1. **Raum erstellen** (Host):
|
||
- "RAUM ERSTELLEN" klicken
|
||
- Team-Namen festlegen (optional)
|
||
- Raum-Code mit Freunden teilen
|
||
|
||
2. **Raum beitreten**:
|
||
- Raum-Code eingeben
|
||
- "RAUM BEITRETEN" klicken
|
||
|
||
3. **Gameplay**:
|
||
- Host startet das Spiel wenn alle bereit sind
|
||
- Team-Score = Distanz × Anzahl lebender Spieler
|
||
- Beispiel: 100 Tiles mit 3 Spielern = 300 Punkte pro Spieler
|
||
|
||
### Steuerung
|
||
|
||
**Desktop:**
|
||
- `Leertaste` / `W` / `↑`: Springen
|
||
- `A` / `←`: Links bewegen
|
||
- `D` / `→`: Rechts bewegen
|
||
- `S` / `↓`: Schneller fallen
|
||
|
||
**Mobile:**
|
||
- Touch-Buttons auf dem Bildschirm
|
||
|
||
**Wall Climbing:**
|
||
- Laufe gegen eine Wand
|
||
- Halte Richtungstaste gedrückt zum Hochklettern
|
||
- Lasse los zum Herunterrutschen
|
||
|
||
## 🔧 Entwicklung
|
||
|
||
### Projekt-Struktur
|
||
|
||
```
|
||
EscapeFromTeacher/
|
||
├── cmd/
|
||
│ ├── server/ # Game Server
|
||
│ ├── client/ # Desktop & WASM Client
|
||
│ │ └── web/ # Web Assets & HTML
|
||
│ ├── builder/ # Asset Builder Tool
|
||
│ └── levelbuilder/ # Level Editor
|
||
├── pkg/
|
||
│ ├── game/ # Gemeinsame Game-Logik
|
||
│ ├── server/ # Server-spezifische Logik
|
||
│ └── config/ # Konfiguration
|
||
└── assets_raw/ # Rohe Asset-Dateien
|
||
```
|
||
|
||
### Neue Features entwickeln
|
||
|
||
1. **Server-Logik** in `pkg/server/`
|
||
2. **Game-Logik** (gemeinsam) in `pkg/game/`
|
||
3. **Client-Rendering** in `cmd/client/`
|
||
4. **Web-UI** in `cmd/client/web/`
|
||
|
||
### Build-Befehle
|
||
|
||
```bash
|
||
# Server
|
||
go build -o server ./cmd/server
|
||
|
||
# Desktop-Client
|
||
go build -o client ./cmd/client
|
||
|
||
# WASM-Client
|
||
GOOS=js GOARCH=wasm go build -o cmd/client/web/main.wasm ./cmd/client
|
||
|
||
# Level Builder
|
||
go build -o levelbuilder ./cmd/levelbuilder
|
||
```
|
||
|
||
## 🧰 Tools
|
||
|
||
### Level Builder
|
||
|
||
Erstelle eigene Levels mit dem visuellen Editor:
|
||
|
||
```bash
|
||
go run ./cmd/levelbuilder
|
||
```
|
||
|
||
**Features:**
|
||
- Drag & Drop von Assets
|
||
- Bewegende Plattformen konfigurieren
|
||
- Chunk-basiertes Level-Design
|
||
- JSON-Export in `cmd/client/web/assets/chunks/`
|
||
|
||
### Asset Builder
|
||
|
||
Konvertiere Raw-Assets zu optimierten Spiel-Assets:
|
||
|
||
```bash
|
||
go run ./cmd/builder
|
||
```
|
||
|
||
**Features:**
|
||
- PNG-Kompression und -Skalierung
|
||
- Hitbox-Editor
|
||
- Asset-Metadaten (Typ, Offsets, etc.)
|
||
- Generiert `assets.json`
|
||
|
||
## 📐 Architektur
|
||
|
||
### Client-Server Kommunikation
|
||
|
||
```
|
||
Client Server
|
||
| |
|
||
|------ WebSocket ------->|
|
||
| (Input Events) |
|
||
| |
|
||
|<----- Broadcast --------|
|
||
| (Game State) |
|
||
| |
|
||
|-- Score Submission ---->|
|
||
| |
|
||
|<--- Proof Code ---------|
|
||
```
|
||
|
||
### Game Loop
|
||
|
||
**Server (60 FPS):**
|
||
1. Verarbeite Inputs von allen Clients
|
||
2. Update Physik (Gravity, Kollision, etc.)
|
||
3. Update Map (Chunk spawning/despawning)
|
||
4. Broadcast Game State an alle Clients
|
||
|
||
**Client:**
|
||
1. Sende lokale Inputs an Server
|
||
2. Empfange Game State vom Server
|
||
3. Render Game State
|
||
4. (Optional) Client-Side Prediction für lokalen Spieler
|
||
|
||
### Score-System
|
||
|
||
**Solo:**
|
||
- Score = Zurückgelegte Distanz (in Tiles)
|
||
- Coins: +200 Punkte
|
||
|
||
**Coop:**
|
||
- Distanz-Score akkumuliert pro Tick
|
||
- Pro Tick: `Score += Anzahl lebender Spieler`
|
||
- Beispiel: 3 Spieler → +3 Punkte/Tick (180 Punkte/Sekunde)
|
||
- Coins werden geteilt: Alle Spieler bekommen +200
|
||
|
||
## 📄 Lizenz
|
||
|
||
Dies ist ein **Schulprojekt**. Kommerzielle Nutzung und Veränderung des Quellcodes sind ausdrücklich untersagt. Alle Rechte liegen bei den Urhebern.
|
||
|
||
**Projektleitung & Code:** Sebastian Unterschütz
|
||
**Musik & Sound Design:** Max Eisel
|
||
|
||
## 🙏 Credits
|
||
|
||
- **Ebiten**: Go 2D Game Engine
|
||
- **NATS**: Message Broker
|
||
- **Redis**: In-Memory Database
|
||
- **Go WASM**: WebAssembly Support
|
||
|
||
---
|
||
|
||
**Entwickelt als Abschieds-Projekt für IT232 (2025/2026)**
|