Private
Public Access
1
0
Files
EscapeFromTeacher/pkg/game/world.go
Sebastian Unterschütz f1dff8d64c
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 1m49s
add offline moving platform logic: implement dynamic platform detection and movement handling in offline mode
2026-04-22 23:52:32 +02:00

114 lines
2.4 KiB
Go

package game
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
)
type Collider struct {
Rect
Type string
}
type World struct {
Manifest AssetManifest
ChunkLibrary map[string]Chunk
}
func NewWorld() *World {
return &World{
Manifest: AssetManifest{Assets: make(map[string]AssetDefinition)},
ChunkLibrary: make(map[string]Chunk),
}
}
func (w *World) LoadManifest(path string) error {
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
return json.Unmarshal(data, &w.Manifest)
}
func (w *World) LoadChunkLibrary(dir string) error {
entries, err := os.ReadDir(dir)
if err != nil {
return err
}
count := 0
for _, f := range entries {
if filepath.Ext(f.Name()) == ".json" {
data, _ := ioutil.ReadFile(filepath.Join(dir, f.Name()))
var c Chunk
if err := json.Unmarshal(data, &c); err == nil {
if c.ID == "" {
c.ID = strings.TrimSuffix(f.Name(), ".json")
}
w.ChunkLibrary[c.ID] = c
count++
}
}
}
fmt.Printf("📦 Library: %d Chunks geladen aus %s\n", count, dir)
return nil
}
// NEU: Gibt die Liste zurück, statt sie zu speichern!
func (w *World) GenerateColliders(activeChunks []ActiveChunk) []Collider {
list := []Collider{}
// 1. Boden
list = append(list, Collider{
Rect: Rect{OffsetX: -10000, OffsetY: 540, W: 100000000, H: 200},
Type: "platform",
})
// 2. Objekte
for _, ac := range activeChunks {
chunk, exists := w.ChunkLibrary[ac.ChunkID]
if !exists {
fmt.Printf("⚠️ Chunk '%s' nicht in Library!\n", ac.ChunkID)
continue
}
for _, obj := range chunk.Objects {
if obj.MovingPlatform != nil {
continue // Überspringe bewegende Plattformen, werden dynamisch geprüft
}
def, ok := w.Manifest.Assets[obj.AssetID]
if !ok {
fmt.Printf("⚠️ Asset '%s' nicht in Manifest!\n", obj.AssetID)
continue
}
if def.Type == "obstacle" || def.Type == "platform" || def.Type == "wall" {
c := Collider{
Rect: Rect{
OffsetX: ac.X + obj.X + def.DrawOffX + def.Hitbox.OffsetX,
OffsetY: obj.Y + def.DrawOffY + def.Hitbox.OffsetY,
W: def.Hitbox.W,
H: def.Hitbox.H,
},
Type: def.Type,
}
list = append(list, c)
}
}
}
return list
}
// CheckRectCollision prüft, ob zwei Rechtecke sich überschneiden (AABB)
func CheckRectCollision(a, b Rect) bool {
return a.OffsetX < b.OffsetX+b.W &&
a.OffsetX+a.W > b.OffsetX &&
a.OffsetY < b.OffsetY+b.H &&
a.OffsetY+a.H > b.OffsetY
}