added transient entities: when crossed, turns into wall tile
This commit is contained in:
40
grid/grid.go
40
grid/grid.go
@@ -3,7 +3,6 @@ package grid
|
||||
import (
|
||||
"image"
|
||||
"log"
|
||||
"log/slog"
|
||||
"openquell/assets"
|
||||
"openquell/components"
|
||||
"openquell/config"
|
||||
@@ -14,6 +13,7 @@ import (
|
||||
)
|
||||
|
||||
type Grid struct {
|
||||
World *ecs.World
|
||||
Width int
|
||||
Height int
|
||||
Size int
|
||||
@@ -48,18 +48,26 @@ func NewGrid(world *ecs.World,
|
||||
components.Renderable,
|
||||
components.Collectible](world)
|
||||
|
||||
obsmapper := generic.NewMap4[
|
||||
obsmapper := generic.NewMap5[
|
||||
components.Position,
|
||||
components.Velocity,
|
||||
components.Renderable,
|
||||
components.Speed,
|
||||
components.Obstacle](world)
|
||||
|
||||
transmapper := generic.NewMap3[
|
||||
components.Position,
|
||||
components.Renderable,
|
||||
components.Transient](world)
|
||||
|
||||
var pos *components.Position
|
||||
var vel *components.Velocity
|
||||
var render *components.Renderable
|
||||
var speed *components.Speed
|
||||
var transient *components.Transient
|
||||
|
||||
playerobserver := observers.GetPlayerObserver(world)
|
||||
obstacleobserver := observers.GetObstacleObserver(world)
|
||||
|
||||
for point, tile := range mapslice {
|
||||
switch tile.Renderable {
|
||||
@@ -73,15 +81,20 @@ func NewGrid(world *ecs.World,
|
||||
pos, _, render, speed, _ = playermapper.Get(entity)
|
||||
playerobserver.AddEntity(entity)
|
||||
speed.Value = config.PLAYERSPEED
|
||||
slog.Debug("player start pos", "X", point.X*tilesize,
|
||||
"Y", point.Y*tilesize, "Z", 191)
|
||||
case tile.Collectible:
|
||||
entity := colmapper.New()
|
||||
pos, render, _ = colmapper.Get(entity)
|
||||
case tile.Obstacle:
|
||||
entity := obsmapper.New()
|
||||
pos, vel, render, _ = obsmapper.Get(entity)
|
||||
pos, vel, render, speed, _ = obsmapper.Get(entity)
|
||||
vel.Direction = tile.Direction
|
||||
vel.PointingAt = tile.Direction
|
||||
speed.Value = config.PLAYERSPEED
|
||||
obstacleobserver.AddEntity(entity)
|
||||
case tile.Transient:
|
||||
entity := transmapper.New()
|
||||
pos, render, transient = transmapper.Get(entity)
|
||||
transient.Sprites = tile.TileNames
|
||||
default:
|
||||
log.Fatalln("unsupported tile type encountered")
|
||||
}
|
||||
@@ -106,6 +119,7 @@ func NewGrid(world *ecs.World,
|
||||
Width: width,
|
||||
Height: height,
|
||||
Map: mapslice,
|
||||
World: world,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,3 +136,19 @@ func (grid *Grid) GetTile(
|
||||
tile := grid.Map[newpoint]
|
||||
return tile
|
||||
}
|
||||
|
||||
func (grid *Grid) SetTile(tile *assets.Tile, point image.Point) {
|
||||
solidmapper := generic.NewMap4[
|
||||
components.Position,
|
||||
components.Renderable,
|
||||
components.Tilish,
|
||||
components.Solid](grid.World)
|
||||
|
||||
grid.Map[point] = tile
|
||||
|
||||
entity := solidmapper.New()
|
||||
pos, render, _, _ := solidmapper.Get(entity)
|
||||
|
||||
render.Image = tile.Sprite
|
||||
pos.Update(point.X*grid.Tilesize, point.Y*grid.Tilesize, grid.Tilesize)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user