Compare commits

...

2 Commits

Author SHA1 Message Date
dd25d217dc updated 2024-04-12 15:09:15 +02:00
a84b8b58e1 fixed snap in bug, started with space themed sprites 2024-04-12 15:08:40 +02:00
7 changed files with 148 additions and 32 deletions

37
TODO.md
View File

@ -1,22 +1,8 @@
## Levels: ## Levels:
- Add shaders for animation (player destruction etc)
- Start New game starts with last played level, better add a Resume - 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. 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 - Turn menu button in hud_system (events in level_scene!) into ebitenui button
- Obstacle don't stop at collectibles - Obstacle don't stop at collectibles
@ -47,19 +33,10 @@
- Add save to disk feature including settings and player - Add save to disk feature including settings and player
accomplishements (FIXME: find the lib, asked in Discord) 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 - Rework sprites (again!) to match stellar background: maybe more
technical tiles and items? Like some robotic setup? technical tiles and items? Like some robotic setup?
- Fix collision snapin: sometimes, when an entity moves to the right
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 +59,17 @@
Collider.IntersectResolve => func(newpos) {player.pos = newpos; player.vel = stop} Collider.IntersectResolve => func(newpos) {player.pos = newpos; player.vel = stop}
- in the end it must be possible to add new entities without the need - 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! 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)

42
assets/space/space.pal Normal file
View File

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

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -115,3 +115,8 @@ func (tile *Position) Intersects(moving *Position, velocity *Velocity) (bool, *P
return false, nil return false, nil
} }
func (tile *Position) Intersecting(position *Position, velocity *Velocity) bool {
is := tile.Rect.Bounds().Intersect(position.Rect.Bounds())
return is != image.ZR
}

View File

@ -3,6 +3,8 @@ package grid
import ( import (
"openquell/components" "openquell/components"
. "openquell/config" . "openquell/config"
"log/slog"
) )
// Check a collision on the grid. We check if the entity in question // Check a collision on the grid. We check if the entity in question
@ -24,8 +26,8 @@ func (grid *Grid) CheckGridCollision(
} else { } else {
ok, tilepos := grid.GetSolidNeighborPosition(position, velocity, true) ok, tilepos := grid.GetSolidNeighborPosition(position, velocity, true)
if ok { if ok {
// slog.Debug("HaveSolidNeighbor", "ok", ok, "tilepos", slog.Debug("(3) HaveSolidNeighbor", "tilepos",
// tilepos.Point(), "playerpos", playerposition) tilepos.String(), "playpos", position.String())
intersects, newpos := tilepos.Intersects(position, velocity) intersects, newpos := tilepos.Intersects(position, velocity)
if intersects { if intersects {
respond_solid(position, velocity, newpos) respond_solid(position, velocity, newpos)
@ -44,6 +46,66 @@ func (grid *Grid) GetSolidNeighborPosition(
return false, nil 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 // set to true if we are already on the last tile in the current
// direction, i.e. on the edge of the grid // direction, i.e. on the edge of the grid
edge := true edge := true
@ -74,9 +136,9 @@ func (grid *Grid) GetSolidNeighborPosition(
newpos := components.NewPosition(neighborpos, grid.Tilesize) newpos := components.NewPosition(neighborpos, grid.Tilesize)
// slog.Debug("SolidNeighbor?", "player", position.Point(), slog.Debug("SolidNeighbor?", "player", position.Point(),
// "neighbor", neighborpos, "edge", edge, "neighbor-solid", "neighbor", neighborpos, "edge", edge, "neighbor-solid",
// grid.Map[neighborpos].Solid, "newpos", newpos.Point()) grid.Map[neighborpos].Solid, "newpos", newpos.Point())
if !edge && grid.Map[neighborpos].Solid { if !edge && grid.Map[neighborpos].Solid {
return true, newpos return true, newpos
} }

View File

@ -1,6 +1,7 @@
package systems package systems
import ( import (
"fmt"
"log/slog" "log/slog"
"openquell/components" "openquell/components"
. "openquell/components" . "openquell/components"
@ -9,6 +10,7 @@ import (
"openquell/observers" "openquell/observers"
"github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
"github.com/hajimehoshi/ebiten/v2/inpututil" "github.com/hajimehoshi/ebiten/v2/inpututil"
"github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/ecs"
"github.com/mlange-42/arche/generic" "github.com/mlange-42/arche/generic"
@ -46,6 +48,7 @@ func PlayerBumpWallResponder(
vel *components.Velocity, vel *components.Velocity,
newpos *components.Position) { newpos *components.Position) {
slog.Debug("(2) PlayerBumpWallResponder", "old", pos.String(), "new", newpos.String())
pos.Set(newpos) pos.Set(newpos)
vel.Change(Stop) vel.Change(Stop)
} }
@ -67,12 +70,16 @@ func (system PlayerSystem) Update() error {
continue 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) system.CheckMovement(playerposition, velocity, player)
// check if player collides with walls or edges // check if player collides with walls or edges
system.GridContainer.Grid.CheckGridCollision( if velocity.Moving() {
playerposition, velocity, PlayerBumpEdgeResponder, PlayerBumpWallResponder) slog.Debug("(2) checking grid collision")
system.GridContainer.Grid.CheckGridCollision(
playerposition, velocity, PlayerBumpEdgeResponder, PlayerBumpWallResponder)
}
if count > 1 { if count > 1 {
// check if player collides with another player, fuse them if any // 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) query = system.Selector.Query(system.World)
for query.Next() { for query.Next() {
playerposition, velocity, _, _ := query.Get() 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 // 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)) op.GeoM.Translate(float64(pos.X), float64(pos.Y))
screen.DrawImage(sprite.Image, op) 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 player.LoopCount = 0
observer.AddMove() observer.AddMove()
} }
} else {
fmt.Println("------------------------")
slog.Debug("(1) player is at", "current", position.String())
} }
} }