- Created test.tmj and test.tsj files in the maps directory. - Added tileset.tsj with configuration for the MainTileset including image path and dimensions.
30 lines
3.3 KiB
Markdown
30 lines
3.3 KiB
Markdown
språk: go
|
|
typ: spel
|
|
|
|
## Bibliotek och Verktyg
|
|
* **Ebitengine** (`github.com/hajimehoshi/ebiten/v2`): Kärnmotor. Hanterar 2D-rendering av sprites (top-down + side-view), fönster, tangentbord/mus/handkontroll samt plattformsoberoende ljuduppspelning.
|
|
* **net** (Standardbiblioteket) / **kcp-go** (`github.com/xtaci/kcp-go`): Nätverk för multiplayer. `net` erbjuder standard TCP/UDP, medan `kcp-go` ger "Reliable UDP" för snabb realtidsuppdatering utan dataförlust.
|
|
* **mathgl** (`github.com/go-gl/mathgl/mgl64`): Vektormatematik (3D-vektorer). Används för koordinatsystemet och spelets 3D-positioner, vilket är basen för egen handkodad fysik (gravitation) och projicering ner till 2D-skärmen.
|
|
|
|
## Kärnarkitektur
|
|
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 (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 lagren upp till 3 block inåt i djupet. För varje block inåt blir objektet gradvis mer utgråat (skuggat) och transparent, vilket skapar en tydlig känsla av djup (parallax-liknande 3D-effekt).
|
|
- **Höger vy (Ovanifrån):** Visar X- och Z-axeln (bredd och djup). Visar bara spelarens närområde i Y-led med en specifik ljushets- och transparensstege:
|
|
- **-1 block** (Nivån spelaren står på) samt **0 block** (Samma höjd): Båda är lite ljusare (tint 1.2).
|
|
- **+1 block upp**: Ljusare och lite transparent (alpha 0.5, tint 1.4).
|
|
- **+2 block upp**: Ännu ljusare och nästan helt transparent (alpha 0.2, tint 1.6).
|
|
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.
|
|
|
|
## Map Pipeline
|
|
* **Tiled JSON (`assets/maps/*.tmj`)**: Kartdata.
|
|
* **Entity Definitions (`assets/entity_defs.json`)**: JSON som mappar ID till top/sido sprites samt om den är solid eller har specifik logik.
|
|
Exempel:
|
|
- id 1: side tile_02, top tile_31 (Gräs)
|
|
- id 2: side tile_12, top tile_12 (Jord)
|
|
- id 3: portal (Grässtruktur som byter karta)
|