Quellcode durchsuchen

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

Sacha Ligthert vor 2 Jahren
Ursprung
Commit
1f58fa5dbd
2 geänderte Dateien mit 65 neuen und 23 gelöschten Zeilen
  1. 60 22
      game.go
  2. 5 1
      main.go

+ 60 - 22
game.go

@@ -7,6 +7,13 @@ import (
 	"github.com/gdamore/tcell/v2"
 )
 
+const (
+	Left = iota
+	Right
+	Up
+	Down
+)
+
 func initilize() (tcell.Screen, tcell.Style, error) {
 	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 scoreCounter int = 1
@@ -47,22 +54,61 @@ func game_director(screen tcell.Screen, style tcell.Style) {
 
 	var snakex int = 3
 	var snakey int = 12
+	//var lastpress int
 
 	for {
 
 		// Clean the screen
 		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
 		ev := screen.PollEvent()
 
 		// Fetch the type, and check if any other actions are required.
 		switch ev := ev.(type) {
-		case *tcell.EventResize:
-			x, y := screen.Size()
-			drawBox(screen, 0, 0, x-1, y-1, style)
-			updateScore(screen, style, snakex)
-			screen.Sync()
+		//case *tcell.EventResize:
+		//	x, y := screen.Size()
+		//	drawBox(screen, 0, 0, x-1, y-1, style)
+		//	updateScore(screen, style, snakex)
+		//	screen.Sync()
 		case *tcell.EventKey:
 			//fmt.Println("Key: ",ev.Rune())
 			if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
@@ -73,24 +119,16 @@ func game_director(screen tcell.Screen, style tcell.Style) {
 				screen.Sync()
 			} else if ev.Rune() == 'C' || ev.Rune() == 'c' {
 				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
 		}
-
 	}
 
 }

+ 5 - 1
main.go

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