For #1 split the gameplay loop up from the key processor. Non-blocking channels proof of concept.

This commit is contained in:
Sacha Ligthert 2023-11-12 12:55:09 +01:00
parent 9c1a9fc83d
commit 1f58fa5dbd
2 changed files with 65 additions and 23 deletions

82
game.go
View File

@ -7,6 +7,13 @@ import (
"github.com/gdamore/tcell/v2" "github.com/gdamore/tcell/v2"
) )
const (
Left = iota
Right
Up
Down
)
func initilize() (tcell.Screen, tcell.Style, error) { func initilize() (tcell.Screen, tcell.Style, error) {
style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset) style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
@ -31,7 +38,7 @@ func quit(screen tcell.Screen) {
} }
} }
func game_director(screen tcell.Screen, style tcell.Style) { func game_director(screen tcell.Screen, style tcell.Style, keypresses chan int) {
//var score int //var score int
//var scoreCounter int = 1 //var scoreCounter int = 1
@ -47,22 +54,61 @@ func game_director(screen tcell.Screen, style tcell.Style) {
var snakex int = 3 var snakex int = 3
var snakey int = 12 var snakey int = 12
//var lastpress int
for { for {
// Clean the screen // Clean the screen
screen.Clear() screen.Clear()
drawBox(screen, 0, 0, x-1, y-1, style)
updateScore(screen, style, snakex)
select {
case press := <-keypresses:
if press == Left {
snakex--
} else if press == Right {
snakex++
} else if press == Up {
snakey--
} else if press == Down {
snakey++
}
case <-time.After(1 * time.Second):
snakex++
}
//updateSnakePos(&snakex, &snakey)
drawSnake(screen, style, snakex, snakey)
// Draw the screen
screen.Show()
if snakex > 75 {
return
}
time.Sleep(500 * time.Millisecond)
}
}
func keyboardProcessor(screen tcell.Screen, keypresses chan int) {
defer close(keypresses)
for {
// Poll for an event // Poll for an event
ev := screen.PollEvent() ev := screen.PollEvent()
// Fetch the type, and check if any other actions are required. // Fetch the type, and check if any other actions are required.
switch ev := ev.(type) { switch ev := ev.(type) {
case *tcell.EventResize: //case *tcell.EventResize:
x, y := screen.Size() // x, y := screen.Size()
drawBox(screen, 0, 0, x-1, y-1, style) // drawBox(screen, 0, 0, x-1, y-1, style)
updateScore(screen, style, snakex) // updateScore(screen, style, snakex)
screen.Sync() // screen.Sync()
case *tcell.EventKey: case *tcell.EventKey:
//fmt.Println("Key: ",ev.Rune()) //fmt.Println("Key: ",ev.Rune())
if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC { if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
@ -73,24 +119,16 @@ func game_director(screen tcell.Screen, style tcell.Style) {
screen.Sync() screen.Sync()
} else if ev.Rune() == 'C' || ev.Rune() == 'c' { } else if ev.Rune() == 'C' || ev.Rune() == 'c' {
screen.Clear() screen.Clear()
} else if ev.Key() == tcell.KeyLeft {
keypresses <- Left
} else if ev.Key() == tcell.KeyRight {
keypresses <- Right
} else if ev.Key() == tcell.KeyDown {
keypresses <- Down
} else if ev.Key() == tcell.KeyUp {
keypresses <- Up
} }
default:
time.Sleep(500 * time.Millisecond)
} }
drawBox(screen, 0, 0, x-1, y-1, style)
updateScore(screen, style, snakex)
updateSnakePos(&snakex, &snakey)
drawSnake(screen, style, snakex, snakey)
// Draw the screen
screen.Show()
if snakex > 75 {
return
}
} }
} }

View File

@ -6,12 +6,16 @@ import (
func main() { func main() {
// Create a channel to push key-presses through
keypresses := make(chan int)
screen, style, err := initilize() screen, style, err := initilize()
if err != nil { if err != nil {
log.Fatalln("Initlization error: ", err) log.Fatalln("Initlization error: ", err)
} }
game_director(screen, style) go game_director(screen, style, keypresses)
keyboardProcessor(screen, keypresses)
quit(screen) quit(screen)