added transient entities: when crossed, turns into wall tile

This commit is contained in:
2024-02-22 14:33:01 +01:00
parent f696660ccd
commit 308f335cd1
20 changed files with 375 additions and 53 deletions

View File

@@ -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)
}