Add --spawn flag

This allows users to specify where the player should spawn.
This commit is contained in:
Trevor Slocum 2021-12-09 19:43:15 -08:00
parent 4292c9cca6
commit 639b0b8ab1
10 changed files with 612 additions and 569 deletions

View File

@ -7,6 +7,10 @@ This game was created for the [Metroidvania Month 14 Game Jam](https://itch.io/j
## Play
### Browser
[**Play in your browser**](https://rocketnine.itch.io/monovania?secret=monovania)
### Compile
**Note:** You will need to install the dependencies listed for [your platform](https://github.com/hajimehoshi/ebiten/blob/main/README.md#platforms).

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,11 @@ package main
import (
"flag"
"strconv"
"strings"
"code.rocketnine.space/tslocum/monovania/component"
"code.rocketnine.space/tslocum/monovania/engine"
"code.rocketnine.space/tslocum/monovania/world"
"github.com/hajimehoshi/ebiten/v2"
)
@ -13,8 +17,10 @@ import (
func parseFlags() {
var (
fullscreen bool
spawn string
)
flag.BoolVar(&fullscreen, "fullscreen", false, "run in fullscreen mode")
flag.StringVar(&spawn, "spawn", "", "spawn X,Y position")
flag.BoolVar(&world.World.CanDoubleJump, "doublejump", false, "start with double jump ability")
flag.BoolVar(&world.World.CanLevitate, "levitate", false, "start with levitate ability")
flag.IntVar(&world.World.Debug, "debug", 0, "print debug information")
@ -23,4 +29,21 @@ func parseFlags() {
if fullscreen {
ebiten.SetFullscreen(true)
}
if spawn != "" {
spawnSplit := strings.Split(spawn, ",")
if len(spawnSplit) == 2 {
spawnX, err := strconv.Atoi(spawnSplit[0])
if err != nil {
panic(err)
}
spawnY, err := strconv.Atoi(spawnSplit[1])
if err != nil {
panic(err)
}
world.World.SpawnX, world.World.SpawnY = float64(spawnX), float64(spawnY)
position := engine.Engine.Component(world.World.Player, component.PositionComponentID).(*component.PositionComponent)
position.X, position.Y = world.World.SpawnX, world.World.SpawnY
}
}
}

View File

@ -76,15 +76,16 @@ type game struct {
// NewGame returns a new isometric demo game.
func NewGame() (*game, error) {
g := &game{
camScale: 4,
playerX: 7,
playerY: 14,
op: &ebiten.DrawImageOptions{},
camScale: 4,
playerX: 7,
playerY: 14,
audioContext: audio.NewContext(sampleRate),
op: &ebiten.DrawImageOptions{},
}
g.audioContext = audio.NewContext(sampleRate)
const numEntities = 30000
engine.Engine.Preallocate(numEntities)
// TODO replace with fs embed
g.changeMap("map/m1.tmx")
world.World.Player = entity.NewPlayer(world.World.SpawnX, world.World.SpawnY)

6
go.mod
View File

@ -3,7 +3,7 @@ module code.rocketnine.space/tslocum/monovania
go 1.17
require (
code.rocketnine.space/tslocum/gohan v0.0.0-20211208035702-62caf1bdd237
code.rocketnine.space/tslocum/gohan v0.0.0-20211210034951-3c7785e5e57f
github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776
github.com/hajimehoshi/ebiten/v2 v2.2.3
github.com/lafriks/go-tiled v0.5.0
@ -15,8 +15,8 @@ require (
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211204153444-caad923f49f4 // indirect
github.com/hajimehoshi/oto/v2 v2.1.0-alpha.4 // indirect
github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240 // indirect
golang.org/x/exp v0.0.0-20211207001050-4f2595aad9e7 // indirect
golang.org/x/exp v0.0.0-20211209182145-6e94b45d164d // indirect
golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect
golang.org/x/sys v0.0.0-20211209171907-798191bca915 // indirect
)

12
go.sum
View File

@ -1,5 +1,5 @@
code.rocketnine.space/tslocum/gohan v0.0.0-20211208035702-62caf1bdd237 h1:bkA0C05c44k4jUxBhPHw+OKQzaYiv5xssz12CQ35alI=
code.rocketnine.space/tslocum/gohan v0.0.0-20211208035702-62caf1bdd237/go.mod h1:nOvFBFvFPl5sDtkMy2Fn/7QZcWq5RE98/mK+INLqIWg=
code.rocketnine.space/tslocum/gohan v0.0.0-20211210034951-3c7785e5e57f h1:stxIGII7DonP7xIsUaEthEj5j3JNnMzVek5fK9hRAMU=
code.rocketnine.space/tslocum/gohan v0.0.0-20211210034951-3c7785e5e57f/go.mod h1:nOvFBFvFPl5sDtkMy2Fn/7QZcWq5RE98/mK+INLqIWg=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -38,8 +38,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
golang.org/x/exp v0.0.0-20211207001050-4f2595aad9e7 h1:8+tNCYevFo8rmzPdpdYIPSoKyiJtBzYwQt+yHF+dAm8=
golang.org/x/exp v0.0.0-20211207001050-4f2595aad9e7/go.mod h1:b9TAUYHmRtqA6klRHApnXMnj+OyLce4yF5cZCUbk2ps=
golang.org/x/exp v0.0.0-20211209182145-6e94b45d164d h1:kyDnjigapVz/aaGinVfqN3EK7SGZrOCNjcYuf5to0KE=
golang.org/x/exp v0.0.0-20211209182145-6e94b45d164d/go.mod h1:b9TAUYHmRtqA6klRHApnXMnj+OyLce4yF5cZCUbk2ps=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@ -72,8 +72,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E=
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0=
golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=

View File

@ -1,11 +1,13 @@
package system
import (
"log"
"time"
"code.rocketnine.space/tslocum/gohan"
"code.rocketnine.space/tslocum/monovania/asset"
"code.rocketnine.space/tslocum/monovania/component"
"code.rocketnine.space/tslocum/monovania/engine"
"code.rocketnine.space/tslocum/monovania/world"
"github.com/fogleman/ease"
"github.com/hajimehoshi/ebiten/v2"
@ -50,6 +52,12 @@ func (s *playerMoveSystem) Update(ctx *gohan.Context) error {
world.World.NoClip = !world.World.NoClip
return nil
}
if ebiten.IsKeyPressed(ebiten.KeyControl) && inpututil.IsKeyJustPressed(ebiten.KeyX) {
position := engine.Engine.Component(s.player, component.PositionComponentID).(*component.PositionComponent)
world.World.SpawnX, world.World.SpawnY = position.X, position.Y-12
log.Printf("Spawn point set to %.0f,%.0f", world.World.SpawnX, world.World.SpawnY)
return nil
}
moveSpeed := 0.1
maxSpeed := 0.5

View File

@ -258,6 +258,8 @@ func (s *MovementSystem) Update(ctx *gohan.Context) error {
bullet := ctx.Entity != world.World.Player
// TODO apply left and right X collision adjustments (too large, can hang entirely off edge of cliff)
onLadder := -1
playerRect := image.Rect(int(position.X), int(position.Y), int(position.X)+16, int(position.Y)+16)
for i, rect := range s.ladderRects {

View File

@ -68,8 +68,7 @@ func (s *RenderSystem) renderSprite(x float64, y float64, offsetx float64, offse
// Skip drawing off-screen tiles.
drawX, drawY := s.levelCoordinatesToScreen(x, y)
padding := float64(TileWidth) * 2
w, h := sprite.Size()
width, height := float64(w), float64(h)
width, height := float64(TileWidth), float64(TileWidth)
left := drawX
right := drawX + width
top := drawY

View File

@ -55,7 +55,7 @@ func (s *RenderDebugTextSystem) Draw(ctx *gohan.Context, screen *ebiten.Image) e
s.debugImg.Clear()
s.op.GeoM.Reset()
s.op.GeoM.Scale(2, 2)
ebitenutil.DebugPrint(s.debugImg, fmt.Sprintf("POS %.0f,%.0f\nVEL %.2f,%.2f\nENT %d\nUPD %d\nDRA %d\nTPS %0.0f\nFPS %0.0f", position.X, position.Y, velocity.X, velocity.Y, engine.Engine.ActiveEntities(), engine.Engine.UpdatedEntities(), engine.Engine.DrawnEntities(), ebiten.CurrentTPS(), ebiten.CurrentFPS()))
ebitenutil.DebugPrint(s.debugImg, fmt.Sprintf("POS %.0f,%.0f\nVEL %.2f,%.2f\nENT %d\nUPD %d\nDRA %d\nTPS %0.0f\nFPS %0.0f", position.X, position.Y, velocity.X, velocity.Y, engine.Engine.CurrentEntities(), engine.Engine.CurrentUpdates(), engine.Engine.CurrentDraws(), ebiten.CurrentTPS(), ebiten.CurrentFPS()))
screen.DrawImage(s.debugImg, s.op)
return nil
}