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:
20
internal/entities/entity.go
Normal file
20
internal/entities/entity.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package entities
|
||||
|
||||
import "github.com/go-gl/mathgl/mgl64"
|
||||
|
||||
// Entity definierar alla bas-objekt i varlden
|
||||
type Entity interface {
|
||||
Pos() mgl64.Vec3
|
||||
SetPos(pos mgl64.Vec3)
|
||||
IsBlocking() bool
|
||||
IsMovable() bool
|
||||
Move(dx, dy, dz float64)
|
||||
Damage(amount int)
|
||||
Pickup() bool
|
||||
GetHealth() int
|
||||
|
||||
// Ritar ut framkallningen av spriten
|
||||
// sideView: ifall vi ritar från sidan (vänster) eller uppifrån (höger)
|
||||
DrawSide(screen interface{}, x, y float64)
|
||||
DrawTop(screen interface{}, x, y float64)
|
||||
}
|
||||
42
internal/entities/tiles.go
Normal file
42
internal/entities/tiles.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package entities
|
||||
|
||||
import (
|
||||
"github.com/go-gl/mathgl/mgl64"
|
||||
"github.com/hajimehoshi/ebiten/v2"
|
||||
)
|
||||
|
||||
type Tile struct {
|
||||
pos mgl64.Vec3
|
||||
health int
|
||||
SideImg *ebiten.Image
|
||||
TopImg *ebiten.Image
|
||||
}
|
||||
|
||||
func (t *Tile) Pos() mgl64.Vec3 { return t.pos }
|
||||
func (t *Tile) SetPos(pos mgl64.Vec3) { t.pos = pos }
|
||||
func (t *Tile) IsBlocking() bool { return true }
|
||||
func (t *Tile) IsMovable() bool { return false }
|
||||
func (t *Tile) Move(dx, dy, dz float64) {
|
||||
// Not feasible for soil etc.
|
||||
}
|
||||
func (t *Tile) Damage(am int) { t.health -= am }
|
||||
func (t *Tile) Pickup() bool { return false }
|
||||
func (t *Tile) GetHealth() int { return t.health }
|
||||
|
||||
func (t *Tile) DrawSide(screen interface{}, x, y float64) {
|
||||
scr := screen.(*ebiten.Image)
|
||||
if t.SideImg != nil {
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
op.GeoM.Translate(x, y)
|
||||
scr.DrawImage(t.SideImg, op)
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Tile) DrawTop(screen interface{}, x, y float64) {
|
||||
scr := screen.(*ebiten.Image)
|
||||
if t.TopImg != nil {
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
op.GeoM.Translate(x, y)
|
||||
scr.DrawImage(t.TopImg, op)
|
||||
}
|
||||
}
|
||||
45
internal/entities/world.go
Normal file
45
internal/entities/world.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package entities
|
||||
|
||||
import "github.com/go-gl/mathgl/mgl64"
|
||||
|
||||
const (
|
||||
TileSize = 32.0 // Varje block ar 32x32 world units
|
||||
)
|
||||
|
||||
type World struct {
|
||||
Width, Height, Depth int
|
||||
Grid [][][]Entity
|
||||
}
|
||||
|
||||
func NewWorld(w, h, d int) *World {
|
||||
grid := make([][][]Entity, w)
|
||||
for x := 0; x < w; x++ {
|
||||
grid[x] = make([][]Entity, h)
|
||||
for y := 0; y < h; y++ {
|
||||
grid[x][y] = make([]Entity, d)
|
||||
}
|
||||
}
|
||||
return &World{Width: w, Height: h, Depth: d, Grid: grid}
|
||||
}
|
||||
|
||||
func (w *World) GetEntityAt(x, y, z int) Entity {
|
||||
if x < 0 || x >= w.Width || y < 0 || y >= w.Height || z < 0 || z >= w.Depth {
|
||||
return nil
|
||||
}
|
||||
return w.Grid[x][y][z]
|
||||
}
|
||||
|
||||
func (w *World) SetEntityAt(x, y, z int, e Entity) {
|
||||
if x < 0 || x >= w.Width || y < 0 || y >= w.Height || z < 0 || z >= w.Depth {
|
||||
return
|
||||
}
|
||||
w.Grid[x][y][z] = e
|
||||
if e != nil {
|
||||
e.SetPos(mgl64.Vec3{float64(x), float64(y), float64(z)})
|
||||
}
|
||||
}
|
||||
|
||||
// Convert absolute 3D position to Grid index
|
||||
func ToGridIndex(pos mgl64.Vec3) (int, int, int) {
|
||||
return int(pos[0]), int(pos[1]), int(pos[2])
|
||||
}
|
||||
Reference in New Issue
Block a user