Refaktoriserat kartan till en solid 3D-Array [][][]Entity och adderat dubbla views (TopDown & SideView) var spelaren laddar sina Animation Frames

This commit is contained in:
2026-04-26 00:24:28 +02:00
parent b250629e34
commit feabe7366c
135 changed files with 316 additions and 153 deletions

View File

@@ -10,6 +10,9 @@ typ: spel
Spelets arkitektur bygger på att helt separera 3D-spellogiken från 2D-rendering.
1. **3D Verklighet:** Varje spelfigur och block har en 3D-vektor (`X`, `Y`, `Z`) samt en storlek (`Width`, `Height`, `Depth`). Fysikmotorn (som bygger på euler-integrering och AABB-kollisioner) körs helt och hållet i denna 3D-värld. Tyngdkraft drar objekt neråt längs Y eller Z axeln.
2. **2D Rendering:** Spelet håller reda på aktuellt "ViewMode" (t.ex. TopDown eller SideView). I renderingen itererar motorn över 3D-objekten och översätter deras 3D-vektorer till `(X, Y)` på skärmen baserat på vald vy. Varje objekt har hänvisningar till olika 2D-sprites (t.ex. en bild fotograferad uppifrån, en från sidan) som sedan ritas med *Ebitengine*.
3. **Spelcykel (Game Loop):** Spelet styrs av en global `Game`-struct med en `Update()` (sköter 3D-fysik, input, state-förändringar) och en `Draw()` (översätter till 2D och ritar) funktion.
4. **States:** Koden är uppdelad i "Scenes" eller "States" (Huvudmeny, Gameplay-läge) för isolerad logik.
2. **2D Rendering (Double Viewport):** Spelet renderas genom två synkroniserade vyportar bredvid varandra, båda med en svart inramning:
- **Vänster vy (Sido-vy):** Visar X- och Y-axeln (bredd och höjd). När spelaren går "inåt" längs Z-axeln ritas en ny rad av kartan ut, med spelaren uppdaterad i centrum.
- **Höger vy (Ovanifrån):** Visar X- och Z-axeln (bredd och djup). När spelaren ändrar höjd (Y-axel, t.ex. genom att hoppa) renderas en ny höjd-slice av världen med spelaren i absoluta mittpunkten.
3. **Kartstruktur:** Världen sparas i grunden som en tre-dimensionell array (`[][][]Entity`), exempelvis motsvarande en 10x10x10 map. Varje block motsvarar 32x32 pixlar i world-space som sedan representeras av specifika sprites ur `assets/images/1 Tiles`. Kartans botten består av solida jordblock som förhindrar spelaren från att falla igenom.
4. **Gemensamt Spelobjekt (Entity):** All logik byggs på ett generiskt `Entity`-interface som besvarar frågor som `IsBlocking()`, `IsMovable()`, `Move()`, `Damage()`, `Pickup()` och `GetHealth()`. Detta gör att karaktärer, pussel och fiender smidigt kan kalla varandras triggers och dela samma kollisionsmekanismer i 3D-kuben.
5. **Animation och Input:** Kontroller och inputs (Gå, Hoppa m.m) knyts till konfigurerbara actions. Karaktärerna använder sprite-sheets där varje "frame" är 96x96 pixlar som bläddras igenom i en specifik timer för att spela upp livliga animationer. Att byta håll innebär att man byter animation state och hastighetsvektor.