added explicit insert/draw mode, left mouse by default moves canvas

This commit is contained in:
2024-06-06 19:13:07 +02:00
parent ab22e0f4e2
commit 9adc7ddbdc
3 changed files with 57 additions and 32 deletions

View File

@@ -76,7 +76,10 @@ While it runs, there are a couple of commands you can use:
* page up: speed up * page up: speed up
* page down: slow down * page down: slow down
* Mouse wheel: zoom in or out * Mouse wheel: zoom in or out
* move mouse while middle mouse button pressed: move canvas * move mouse while left mouse button pressed: move canvas
* i: enter "insert" (draw) mode: use left mouse to set cells alife and right
button to dead. Leave with "space". While in insert mode, use middle mouse
button to drag grid.
* r: reset to 1:1 zoom * r: reset to 1:1 zoom
* escape: open menu * escape: open menu
* s: save game state to file (can be loaded with -l) * s: save game state to file (can be loaded with -l)

View File

@@ -15,24 +15,24 @@ import (
// all the settings comming from commandline, but maybe tweaked later from the UI // all the settings comming from commandline, but maybe tweaked later from the UI
type Config struct { type Config struct {
Width, Height, Cellsize, Density int // measurements Width, Height, Cellsize, Density int // measurements
ScreenWidth, ScreenHeight int ScreenWidth, ScreenHeight int
TPG int // ticks per generation/game speed, 1==max TPG int // ticks per generation/game speed, 1==max
Debug, Empty, Invert, Paused, Markmode bool // game modi Debug, Empty, Invert, Paused, Markmode, Drawmode bool // game modi
ShowEvolution, ShowGrid, RunOneStep bool // flags ShowEvolution, ShowGrid, RunOneStep bool // flags
Rule *Rule // which rule to use, default: B3/S23 Rule *Rule // which rule to use, default: B3/S23
RLE *rle.RLE // loaded GOL pattern from RLE file RLE *rle.RLE // loaded GOL pattern from RLE file
Statefile string // load game state from it if non-nil Statefile string // load game state from it if non-nil
StateGrid *Grid // a grid from a statefile StateGrid *Grid // a grid from a statefile
Wrap bool // wether wraparound mode is in place or not Wrap bool // wether wraparound mode is in place or not
ShowVersion bool ShowVersion bool
UseShader bool // to use a shader to render alife cells UseShader bool // to use a shader to render alife cells
Restart, RestartGrid, RestartCache bool Restart, RestartGrid, RestartCache bool
StartWithMenu bool StartWithMenu bool
Zoomfactor int Zoomfactor int
ZoomOutFactor int ZoomOutFactor int
InitialCamPos []float64 InitialCamPos []float64
DelayedStart bool // if true game, we wait. like pause but program induced DelayedStart bool // if true game, we wait. like pause but program induced
// for internal profiling // for internal profiling
ProfileFile string ProfileFile string

View File

@@ -48,7 +48,7 @@ type ScenePlay struct {
MarkDone bool // true when mouse1 released, copy cells between Mark+Point MarkDone bool // true when mouse1 released, copy cells between Mark+Point
Mark, Point image.Point // area to marks+save Mark, Point image.Point // area to marks+save
RunOneStep bool // mutable flags from config RunOneStep bool // mutable flags from config
TPG int TPG int // current game speed (ticks per game)
} }
func NewPlayScene(game *Game, config *Config) Scene { func NewPlayScene(game *Game, config *Config) Scene {
@@ -188,6 +188,11 @@ func (scene *ScenePlay) CheckInput() {
scene.Config.Paused = true scene.Config.Paused = true
} }
if inpututil.IsKeyJustPressed(ebiten.KeyI) {
scene.Config.Drawmode = true
scene.Config.Paused = true
}
if scene.Config.Markmode { if scene.Config.Markmode {
return return
} }
@@ -196,16 +201,6 @@ func (scene *ScenePlay) CheckInput() {
scene.Config.TogglePaused() scene.Config.TogglePaused()
} }
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
scene.ToggleCellOnCursorPos(Alive)
scene.Config.Paused = true // drawing while running makes no sense
}
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonRight) {
scene.ToggleCellOnCursorPos(Dead)
scene.Config.Paused = true // drawing while running makes no sense
}
if inpututil.IsKeyJustPressed(ebiten.KeyPageDown) { if inpututil.IsKeyJustPressed(ebiten.KeyPageDown) {
if scene.TPG < 120 { if scene.TPG < 120 {
scene.TPG++ scene.TPG++
@@ -233,6 +228,22 @@ func (scene *ScenePlay) CheckInput() {
} }
} }
func (scene *ScenePlay) CheckDrawingInput() {
if scene.Config.Drawmode {
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
scene.ToggleCellOnCursorPos(Alive)
}
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonRight) {
scene.ToggleCellOnCursorPos(Dead)
}
if inpututil.IsKeyJustPressed(ebiten.KeyEscape) {
scene.Config.Drawmode = false
}
}
}
// Check dragging input. move the canvas with the mouse while pressing // Check dragging input. move the canvas with the mouse while pressing
// the middle mouse button, zoom in and out using the wheel. // the middle mouse button, zoom in and out using the wheel.
func (scene *ScenePlay) CheckDraggingInput() { func (scene *ScenePlay) CheckDraggingInput() {
@@ -240,13 +251,19 @@ func (scene *ScenePlay) CheckDraggingInput() {
return return
} }
dragbutton := ebiten.MouseButtonLeft
if scene.Config.Drawmode {
dragbutton = ebiten.MouseButtonMiddle
}
// move canvas // move canvas
if scene.Dragging && !ebiten.IsMouseButtonPressed(ebiten.MouseButton1) { if scene.Dragging && !ebiten.IsMouseButtonPressed(dragbutton) {
// release // release
scene.Dragging = false scene.Dragging = false
} }
if !scene.Dragging && ebiten.IsMouseButtonPressed(ebiten.MouseButton1) { if !scene.Dragging && ebiten.IsMouseButtonPressed(dragbutton) {
// start dragging // start dragging
scene.Dragging = true scene.Dragging = true
scene.LastCursorPos[0], scene.LastCursorPos[1] = ebiten.CursorPosition() scene.LastCursorPos[0], scene.LastCursorPos[1] = ebiten.CursorPosition()
@@ -408,6 +425,7 @@ func (scene *ScenePlay) Update() error {
} }
scene.CheckInput() scene.CheckInput()
scene.CheckDrawingInput()
scene.CheckDraggingInput() scene.CheckDraggingInput()
scene.CheckMarkInput() scene.CheckMarkInput()
@@ -519,6 +537,10 @@ func (scene *ScenePlay) DrawDebug(screen *ebiten.Image) {
paused = "-- mark --" paused = "-- mark --"
} }
if scene.Config.Drawmode {
paused = "-- insert --"
}
x, y := ebiten.CursorPosition() x, y := ebiten.CursorPosition()
debug := fmt.Sprintf( debug := fmt.Sprintf(
DEBUG_FORMAT, DEBUG_FORMAT,