From a84b8b58e1e281df2ea56fad30f9ebd9b030f7e4 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Fri, 12 Apr 2024 15:08:40 +0200 Subject: [PATCH] fixed snap in bug, started with space themed sprites --- TODO.md | 34 +++++++---------- assets/space/space.pal | 42 ++++++++++++++++++++ assets/space/tilemap-oil.ase | Bin 0 -> 3957 bytes assets/space/tilemap-oil.png | Bin 0 -> 12197 bytes components/position.go | 5 +++ grid/collider.go | 72 ++++++++++++++++++++++++++++++++--- systems/player_system.go | 24 ++++++++++-- 7 files changed, 148 insertions(+), 29 deletions(-) create mode 100644 assets/space/space.pal create mode 100644 assets/space/tilemap-oil.ase create mode 100644 assets/space/tilemap-oil.png diff --git a/TODO.md b/TODO.md index b1d5f86..4bba62b 100644 --- a/TODO.md +++ b/TODO.md @@ -1,22 +1,8 @@ ## Levels: -- Add shaders for animation (player destruction etc) - - Start New game starts with last played level, better add a Resume Game menu item for this and use Start New always for level 1. -- for finding caller: - pc := make([]uintptr, 10) - n := runtime.Callers(0, pc) - pc = pc[:n] - fs := runtime.CallersFrames(pc) - source, _ := fs.Next() - source, _ = fs.Next() - source, _ = fs.Next() - - slog.Debug("get observer", "minmoves", observer.LevelScore, - "file", source.File, "line", source.Line) - - Turn menu button in hud_system (events in level_scene!) into ebitenui button - Obstacle don't stop at collectibles @@ -47,8 +33,6 @@ - Add save to disk feature including settings and player accomplishements (FIXME: find the lib, asked in Discord) -- Add coded animated background like in https://github.com/tinne26/bindless/tree/main/src/misc/background - - Rework sprites (again!) to match stellar background: maybe more technical tiles and items? Like some robotic setup? @@ -56,10 +40,6 @@ or south (NOT left or north!) it snaps in visibly, so a short wobble can be seen. -- Rework animation system: since it is impossible to assign multiple - animation types to an entity via LDTK, hard code it in Tiles. Keep - implementation though. CAUTION: last time I changed this, the - collectible detonation didn't work anymore! @@ -82,3 +62,17 @@ Collider.IntersectResolve => func(newpos) {player.pos = newpos; player.vel = stop} - in the end it must be possible to add new entities without the need to write a collision check for them, but have collision detection anyway! + +## Just in case stuff + +- for finding caller: + pc := make([]uintptr, 10) + n := runtime.Callers(0, pc) + pc = pc[:n] + fs := runtime.CallersFrames(pc) + source, _ := fs.Next() + source, _ = fs.Next() + source, _ = fs.Next() + + slog.Debug("get observer", "minmoves", observer.LevelScore, + "file", source.File, "line", source.Line) diff --git a/assets/space/space.pal b/assets/space/space.pal new file mode 100644 index 0000000..c98d91e --- /dev/null +++ b/assets/space/space.pal @@ -0,0 +1,42 @@ +JASC-PAL +0100 +39 +32 0 59 +63 0 83 +108 0 108 +146 0 124 +187 0 151 +236 0 178 +255 19 186 +255 64 190 +255 113 213 +255 147 231 +255 186 253 +245 220 255 +255 255 255 +0 0 0 +12 12 12 +26 26 26 +39 39 39 +54 54 54 +71 71 71 +86 86 86 +99 99 99 +118 118 118 +133 133 133 +153 153 153 +177 177 177 +205 205 205 +42 2 0 +52 9 0 +71 24 0 +94 46 0 +131 71 0 +165 96 0 +201 106 0 +243 119 0 +255 165 41 +255 186 82 +255 239 169 +255 250 211 +255 255 247 diff --git a/assets/space/tilemap-oil.ase b/assets/space/tilemap-oil.ase new file mode 100644 index 0000000000000000000000000000000000000000..6a373619a20eb160a4d4c4392c1c313b424ed19c GIT binary patch literal 3957 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 Z>#6I_8Q#mcS7l0`X@_ivJg!5<{{Ydek2C-P literal 0 HcmV?d00001 diff --git a/assets/space/tilemap-oil.png b/assets/space/tilemap-oil.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1ded0fee9c83734de9077c33d241769fc03256 GIT binary patch literal 12197 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 Q_w67RB~8Tw1Eto&W#< literal 0 HcmV?d00001 diff --git a/components/position.go b/components/position.go index f9b5d2f..8abef8e 100644 --- a/components/position.go +++ b/components/position.go @@ -115,3 +115,8 @@ func (tile *Position) Intersects(moving *Position, velocity *Velocity) (bool, *P return false, nil } + +func (tile *Position) Intersecting(position *Position, velocity *Velocity) bool { + is := tile.Rect.Bounds().Intersect(position.Rect.Bounds()) + return is != image.ZR +} diff --git a/grid/collider.go b/grid/collider.go index de2f661..38a19ab 100644 --- a/grid/collider.go +++ b/grid/collider.go @@ -3,6 +3,8 @@ package grid import ( "openquell/components" . "openquell/config" + + "log/slog" ) // Check a collision on the grid. We check if the entity in question @@ -24,8 +26,8 @@ func (grid *Grid) CheckGridCollision( } else { ok, tilepos := grid.GetSolidNeighborPosition(position, velocity, true) if ok { - // slog.Debug("HaveSolidNeighbor", "ok", ok, "tilepos", - // tilepos.Point(), "playerpos", playerposition) + slog.Debug("(3) HaveSolidNeighbor", "tilepos", + tilepos.String(), "playpos", position.String()) intersects, newpos := tilepos.Intersects(position, velocity) if intersects { respond_solid(position, velocity, newpos) @@ -44,6 +46,66 @@ func (grid *Grid) GetSolidNeighborPosition( return false, nil } + // set to true if we are already on the last tile in the current + // direction, i.e. on the edge of the grid + edge := true + moving := position.GetMoved(velocity) + + neighborpos := position.Point() + if velocity.Direction == East || velocity.Direction == South { + // FIXES snapin to down+right, but now top+left fail. Only in + // these cases we need to look at the neighbor in the future + // position where we will be when we move forward. I don't + // know why it is like this, in fact it doesn't really make + // any sense. But it works, so I'll keep it that way for the + // moment. + neighborpos = moving.Point() + } + + switch velocity.Direction { + case East: + if neighborpos.X < grid.TilesX { + neighborpos.X++ + edge = false + } + case West: + if neighborpos.X > 0 { + neighborpos.X-- + edge = false + } + case South: + if neighborpos.Y < grid.TilesY { + neighborpos.Y++ + edge = false + } + case North: + if neighborpos.Y > 0 { + neighborpos.Y-- + edge = false + } + } + + newpos := components.NewPosition(neighborpos, grid.Tilesize) + + slog.Debug("SolidNeighbor?", "player", position.Point(), + "neighbor", neighborpos, "edge", edge, "neighbor-solid", + grid.Map[neighborpos].Solid, "newpos", newpos.Point()) + if !edge && grid.Map[neighborpos].Solid { + return true, newpos + } + + return false, nil +} + +func (grid *Grid) OrigGetSolidNeighborPosition( + position *components.Position, + velocity *components.Velocity, + solid bool) (bool, *components.Position) { + + if !solid { + return false, nil + } + // set to true if we are already on the last tile in the current // direction, i.e. on the edge of the grid edge := true @@ -74,9 +136,9 @@ func (grid *Grid) GetSolidNeighborPosition( newpos := components.NewPosition(neighborpos, grid.Tilesize) - // slog.Debug("SolidNeighbor?", "player", position.Point(), - // "neighbor", neighborpos, "edge", edge, "neighbor-solid", - // grid.Map[neighborpos].Solid, "newpos", newpos.Point()) + slog.Debug("SolidNeighbor?", "player", position.Point(), + "neighbor", neighborpos, "edge", edge, "neighbor-solid", + grid.Map[neighborpos].Solid, "newpos", newpos.Point()) if !edge && grid.Map[neighborpos].Solid { return true, newpos } diff --git a/systems/player_system.go b/systems/player_system.go index f4f7025..6264fd5 100644 --- a/systems/player_system.go +++ b/systems/player_system.go @@ -1,6 +1,7 @@ package systems import ( + "fmt" "log/slog" "openquell/components" . "openquell/components" @@ -9,6 +10,7 @@ import ( "openquell/observers" "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/ebitenutil" "github.com/hajimehoshi/ebiten/v2/inpututil" "github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/generic" @@ -46,6 +48,7 @@ func PlayerBumpWallResponder( vel *components.Velocity, newpos *components.Position) { + slog.Debug("(2) PlayerBumpWallResponder", "old", pos.String(), "new", newpos.String()) pos.Set(newpos) vel.Change(Stop) } @@ -67,12 +70,16 @@ func (system PlayerSystem) Update() error { continue } - // check if the user alters or initiates movement + // check if the user alters or initiates movement, only + // changes player direction system.CheckMovement(playerposition, velocity, player) // check if player collides with walls or edges - system.GridContainer.Grid.CheckGridCollision( - playerposition, velocity, PlayerBumpEdgeResponder, PlayerBumpWallResponder) + if velocity.Moving() { + slog.Debug("(2) checking grid collision") + system.GridContainer.Grid.CheckGridCollision( + playerposition, velocity, PlayerBumpEdgeResponder, PlayerBumpWallResponder) + } if count > 1 { // check if player collides with another player, fuse them if any @@ -99,7 +106,11 @@ func (system PlayerSystem) Update() error { query = system.Selector.Query(system.World) for query.Next() { playerposition, velocity, _, _ := query.Get() - playerposition.Move(velocity) + oldpos := playerposition.String() + if velocity.Moving() { + playerposition.Move(velocity) + slog.Debug("(4) moving player", "old", oldpos, "new", playerposition.String()) + } } // we may have lost players, remove them here @@ -124,6 +135,8 @@ func (system *PlayerSystem) Draw(screen *ebiten.Image) { op.GeoM.Translate(float64(pos.X), float64(pos.Y)) screen.DrawImage(sprite.Image, op) + + ebitenutil.DebugPrintAt(screen, pos.String(), pos.X, pos.Y) // print player pos } } @@ -196,6 +209,9 @@ func (system *PlayerSystem) CheckMovement( player.LoopCount = 0 observer.AddMove() } + } else { + fmt.Println("------------------------") + slog.Debug("(1) player is at", "current", position.String()) } }