Files
Regin_mountain_of_treasures/plan.md

2.6 KiB

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 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.