Keyboard

Instructions

  • Click the demo window to activate controls
  • Use WASD or Arrow Keys to move the sprite.
keyboard.go
  1
  2package main
  3
  4import (
  5 "embed"
  6 "log"
  7
  8 "github.com/TheBitDrifter/bappa/blueprint"
  9 "github.com/TheBitDrifter/bappa/blueprint/client"
 10 "github.com/TheBitDrifter/bappa/blueprint/input"
 11 "github.com/TheBitDrifter/bappa/coldbrew"
 12 "github.com/TheBitDrifter/bappa/coldbrew/coldbrew_clientsystems"
 13 "github.com/TheBitDrifter/bappa/coldbrew/coldbrew_rendersystems"
 14 "github.com/TheBitDrifter/bappa/tteokbokki/spatial"
 15
 16 "github.com/TheBitDrifter/bappa/warehouse"
 17 "github.com/hajimehoshi/ebiten/v2"
 18)
 19
 20//go:embed assets/*
 21var assets embed.FS
 22
 23var actions = struct {
 24 Up, Down, Left, Right input.Action
 25}{
 26 Up:    input.NewAction(),
 27 Down:  input.NewAction(),
 28 Left:  input.NewAction(),
 29 Right: input.NewAction(),
 30}
 31
 32func main() {
 33 client := coldbrew.NewClient(
 34  640,
 35  360,
 36  10,
 37  10,
 38  10,
 39  assets,
 40 )
 41
 42 client.SetTitle("Capturing Keyboard Inputs")
 43
 44 err := client.RegisterScene(
 45  "Example Scene",
 46  640,
 47  360,
 48  exampleScenePlan,
 49  []coldbrew.RenderSystem{},
 50  []coldbrew.ClientSystem{},
 51  []blueprint.CoreSystem{
 52   inputSystem{},
 53  },
 54 )
 55 if err != nil {
 56  log.Fatal(err)
 57 }
 58
 59 client.RegisterGlobalRenderSystem(coldbrew_rendersystems.GlobalRenderer{})
 60 client.RegisterGlobalClientSystem(coldbrew_clientsystems.ActionBufferSystem{})
 61 client.ActivateCamera()
 62
 63 receiver, _ := client.ActivateReceiver()
 64
 65 receiver.RegisterKey(ebiten.KeyUp, actions.Up)
 66 receiver.RegisterKey(ebiten.KeyW, actions.Up)
 67
 68 receiver.RegisterKey(ebiten.KeyDown, actions.Down)
 69 receiver.RegisterKey(ebiten.KeyS, actions.Down)
 70
 71 receiver.RegisterKey(ebiten.KeyLeft, actions.Left)
 72 receiver.RegisterKey(ebiten.KeyA, actions.Left)
 73
 74 receiver.RegisterKey(ebiten.KeyRight, actions.Right)
 75 receiver.RegisterKey(ebiten.KeyD, actions.Right)
 76
 77 if err := client.Start(); err != nil {
 78  log.Fatal(err)
 79 }
 80}
 81
 82func exampleScenePlan(width, height int, sto warehouse.Storage) error {
 83 spriteArchetype, err := sto.NewOrExistingArchetype(
 84  input.Components.ActionBuffer,
 85  spatial.Components.Position,
 86  client.Components.SpriteBundle,
 87 )
 88 if err != nil {
 89  return err
 90 }
 91
 92 err = spriteArchetype.Generate(1,
 93  input.Components.ActionBuffer,
 94
 95  spatial.NewPosition(255, 20),
 96  client.NewSpriteBundle().
 97   AddSprite("images/sprite.png", true),
 98 )
 99 if err != nil {
100  return err
101 }
102 return nil
103}
104
105type inputSystem struct{}
106
107func (inputSystem) Run(scene blueprint.Scene, _ float64) error {
108 query := warehouse.Factory.NewQuery().
109  And(input.Components.ActionBuffer, spatial.Components.Position)
110
111 cursor := scene.NewCursor(query)
112
113 for range cursor.Next() {
114  pos := spatial.Components.Position.GetFromCursor(cursor)
115  actionBuffer := input.Components.ActionBuffer.GetFromCursor(cursor)
116
117  if stampedAction, ok := actionBuffer.ConsumeAction(actions.Up); ok {
118   log.Println("Tick", stampedAction.Tick)
119   pos.Y -= 2
120  }
121  if stampedAction, ok := actionBuffer.ConsumeAction(actions.Down); ok {
122   log.Println("Tick", stampedAction.Tick)
123   pos.Y += 2
124  }
125  if stampedAction, ok := actionBuffer.ConsumeAction(actions.Left); ok {
126   log.Println("Tick", stampedAction.Tick)
127   pos.X -= 2
128  }
129  if stampedAction, ok := actionBuffer.ConsumeAction(actions.Right); ok {
130   log.Println("Tick", stampedAction.Tick)
131   pos.X += 2
132  }
133
134 }
135 return nil
136}