game.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "github.com/gdamore/tcell/v2"
  6. )
  7. func gameinit() {
  8. game, err := initialize()
  9. if err != nil {
  10. log.Fatalln("Initilization error: ", err)
  11. }
  12. go gameDirector(&game)
  13. keyboardProcessor(&game)
  14. // Quit the screen
  15. quit(&game)
  16. // Give closure
  17. fmt.Println("You get rekt lol.")
  18. }
  19. func initialize() (Game, error) {
  20. var err error
  21. screen, err := tcell.NewScreen()
  22. if err != nil {
  23. log.Println("Error creating screen: ", err)
  24. }
  25. err = screen.Init()
  26. if err != nil {
  27. log.Fatalln("Error initializing screen: ", err)
  28. }
  29. style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
  30. game := Game{
  31. screen: screen,
  32. style: style,
  33. keypresses: make(chan int),
  34. player: Player{
  35. position: Position{
  36. x: 40,
  37. y: 12,
  38. },
  39. moves: 0,
  40. teleports: 0,
  41. },
  42. // robots: []Robot, // I need this maybe
  43. // trash: []Position, // I will need this
  44. gameover: 0,
  45. }
  46. return game, err
  47. }
  48. func gameDirector(game *Game) {
  49. defer quit(game)
  50. for {
  51. // Clean the screen
  52. game.screen.Clear()
  53. // Draw starter conditions
  54. game.drawBox(game)
  55. game.drawPlayer(game)
  56. game.drawCoords(game)
  57. // Draw robots??
  58. // Draw the screen
  59. game.screen.Show()
  60. // Process input
  61. game.movePlayer(game, <-game.keypresses)
  62. }
  63. }
  64. func keyboardProcessor(game *Game) {
  65. defer close(game.keypresses)
  66. for {
  67. // Poll for an event
  68. ev := game.screen.PollEvent()
  69. // Fetch the type, and check if any other actions are required.
  70. switch ev := ev.(type) {
  71. case *tcell.EventKey:
  72. // Keys to bug out
  73. if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
  74. return
  75. // Screen management
  76. } else if ev.Key() == tcell.KeyCtrlL {
  77. game.screen.Sync()
  78. // Player Movement
  79. } else if ev.Rune() == 'q' {
  80. game.keypresses <- upleft
  81. } else if ev.Rune() == 'e' {
  82. game.keypresses <- upright
  83. } else if ev.Rune() == 'z' {
  84. game.keypresses <- downleft
  85. } else if ev.Rune() == 'c' {
  86. game.keypresses <- downright
  87. } else if ev.Key() == tcell.KeyUp || ev.Rune() == 'w' {
  88. game.keypresses <- Up
  89. } else if ev.Key() == tcell.KeyRight || ev.Rune() == 'd' {
  90. game.keypresses <- Right
  91. } else if ev.Key() == tcell.KeyDown || ev.Rune() == 's' || ev.Rune() == 'x' {
  92. game.keypresses <- Down
  93. } else if ev.Key() == tcell.KeyLeft || ev.Rune() == 'a' {
  94. game.keypresses <- Left
  95. // Teleport the player
  96. } else if ev.Rune() == 't' {
  97. game.keypresses <- teleport
  98. }
  99. }
  100. if game.gameover != 0 {
  101. return
  102. }
  103. }
  104. }
  105. func quit(game *Game) {
  106. maybePanic := recover()
  107. game.screen.Fini()
  108. if maybePanic != nil {
  109. panic(maybePanic)
  110. }
  111. }