Skip to content

Commit

Permalink
Added escape key as mouse mode toggle to make it easier to exit game
Browse files Browse the repository at this point in the history
- updated readme with new controls and new screenshot
  • Loading branch information
harbdog committed May 29, 2022
1 parent b6249ec commit 215b64b
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 8 deletions.
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ To install and run from source the following are required:
* `[path/to/raycaster-go]$ go run raycast.go`

## Controls
* Use the mouse to rotate and pitch view
* Move and strafe using WASD or Arrow Keys
* Press `Escape` key to toggle mouse cursor capture (or hold `CTRL`)
* Move the mouse to rotate and pitch view
* Move and strafe using `WASD` or `Arrow Keys`
* Hold `Shift` key to move faster
* Hold `ALT` key to enter mouse move mode (vertical mouse moves position instead of pitch)
* Click left mouse button to spawn projectile
* Hold `C` key for crouch position
* Hold Spacebar for jump position
* Hold `CTRL` key to release mouse cursor capture
* While mouse cursor released, left/right mouse click currently used for visual/console debugging
* Hold `Z` key for prone position
* Hold `Spacebar` for jump position
49 changes: 46 additions & 3 deletions engine/game.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,12 @@ type Game struct {
//--define camera and renderer--//
camera *raycaster.Camera

mouseMode raycaster.MouseMode
mouseX, mouseY int
mouseMode raycaster.MouseMode
mouseModeToggle bool
mouseX, mouseY int

// keep track of certain key presses for debounce protection
debouncedKeys map[ebiten.Key]int

crosshairs *model.Crosshairs

Expand Down Expand Up @@ -121,6 +125,8 @@ func NewGame() *Game {
g.mouseMode = raycaster.MouseModeMove
g.mouseX, g.mouseY = math.MinInt32, math.MinInt32

g.debouncedKeys = make(map[ebiten.Key]int, 8)

//--init camera and renderer--//
g.camera = raycaster.NewCamera(g.width, g.height, texWidth, g.mapObj, g.slices, g.levels, g.floorLvl, g.spriteLvls, g.tex)
g.camera.SetFloorTexture(getTextureFromFile("floor.png"))
Expand Down Expand Up @@ -453,6 +459,30 @@ func (g *Game) Update() error {
return nil
}

func (g *Game) debounceInput(key ebiten.Key, duration int) {
g.debouncedKeys[key] = duration
}

func (g *Game) updatedDebounces() {
for key, duration := range g.debouncedKeys {
duration--
g.debouncedKeys[key] = duration

if duration <= 0 {
delete(g.debouncedKeys, key)
}
}
}

func (g *Game) isDebouncedInput(key ebiten.Key) bool {
if value, ok := g.debouncedKeys[key]; ok {
if value > 0 {
return true
}
}
return false
}

func (g *Game) handleInput() {
forward := false
backward := false
Expand All @@ -468,7 +498,20 @@ func (g *Game) handleInput() {
g.player.WeaponCooldown -= 1 / float64(ebiten.MaxTPS())
}

// update any currently debounced inputs
g.updatedDebounces()

switch {
case ebiten.IsKeyPressed(ebiten.KeyEscape):
if g.mouseMode != raycaster.MouseModeCursor {
ebiten.SetCursorMode(ebiten.CursorModeVisible)
g.mouseMode = raycaster.MouseModeCursor
g.mouseModeToggle = true
g.debounceInput(ebiten.KeyEscape, 30)
} else if !g.isDebouncedInput(ebiten.KeyEscape) {
g.mouseModeToggle = false
}

case ebiten.IsKeyPressed(ebiten.KeyControl):
if g.mouseMode != raycaster.MouseModeCursor {
ebiten.SetCursorMode(ebiten.CursorModeVisible)
Expand All @@ -482,7 +525,7 @@ func (g *Game) handleInput() {
g.mouseX, g.mouseY = math.MinInt32, math.MinInt32
}

case g.mouseMode != raycaster.MouseModeLook:
case g.mouseMode != raycaster.MouseModeLook && !g.mouseModeToggle:
ebiten.SetCursorMode(ebiten.CursorModeCaptured)
g.mouseMode = raycaster.MouseModeLook
g.mouseX, g.mouseY = math.MinInt32, math.MinInt32
Expand Down
Binary file modified screenshot.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 215b64b

Please sign in to comment.