113 lines
2.6 KiB
Go
113 lines
2.6 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 {
|
|
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" {
|
|
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)
|
|
fmt.Printf("✅ Collider generiert: Type=%s, Asset=%s, Pos=(%.0f,%.0f), DrawOff=(%.0f,%.0f), HitboxOff=(%.0f,%.0f)\n",
|
|
def.Type, obj.AssetID, c.Rect.OffsetX, c.Rect.OffsetY,
|
|
def.DrawOffX, def.DrawOffY, def.Hitbox.OffsetX, def.Hitbox.OffsetY)
|
|
}
|
|
}
|
|
}
|
|
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
|
|
}
|