Mouse

Instructions

  • Click to move sprite
mouse.go
  1package main
  2
  3import (
  4 "embed"
  5 "log"
  6 "math"
  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 Movement input.Input
 25}{
 26 Movement: input.NewInput(),
 27}
 28
 29func lerp(start, end, t float64) float64 {
 30 return start + t*(end-start)
 31}
 32
 33func main() {
 34 client := coldbrew.NewClient(
 35  640,
 36  360,
 37  10,
 38  10,
 39  10,
 40  assets,
 41 )
 42 client.SetTitle("Capturing Mouse Inputs")
 43 err := client.RegisterScene(
 44  "Example Scene",
 45  640,
 46  360,
 47  exampleScenePlan,
 48  []coldbrew.RenderSystem{},
 49  []coldbrew.ClientSystem{},
 50  []blueprint.CoreSystem{
 51   &inputSystem{},
 52  },
 53 )
 54 if err != nil {
 55  log.Fatal(err)
 56 }
 57 client.RegisterGlobalRenderSystem(coldbrew_rendersystems.GlobalRenderer{})
 58 client.RegisterGlobalClientSystem(coldbrew_clientsystems.InputBufferSystem{})
 59 client.ActivateCamera()
 60 receiver, _ := client.ActivateReceiver()
 61 receiver.RegisterMouseButton(ebiten.MouseButtonLeft, actions.Movement)
 62 if err := client.Start(); err != nil {
 63  log.Fatal(err)
 64 }
 65}
 66
 67func exampleScenePlan(height, width int, sto warehouse.Storage) error {
 68 spriteArchetype, err := sto.NewOrExistingArchetype(
 69  input.Components.InputBuffer,
 70  spatial.Components.Position,
 71  client.Components.SpriteBundle,
 72 )
 73 if err != nil {
 74  return err
 75 }
 76 err = spriteArchetype.Generate(1,
 77  input.Components.InputBuffer,
 78  spatial.NewPosition(255, 20),
 79  client.NewSpriteBundle().
 80   AddSprite("sprite.png", true),
 81 )
 82 if err != nil {
 83  return err
 84 }
 85 return nil
 86}
 87
 88type inputSystem struct {
 89 LastMovementX float64
 90 LastMovementY float64
 91 HasTarget     bool
 92}
 93
 94func (sys *inputSystem) Run(scene blueprint.Scene, dt float64) error {
 95 query := warehouse.Factory.NewQuery().
 96  And(input.Components.InputBuffer, spatial.Components.Position)
 97 cursor := scene.NewCursor(query)
 98
 99 for range cursor.Next() {
100  pos := spatial.Components.Position.GetFromCursor(cursor)
101  inputBuffer := input.Components.InputBuffer.GetFromCursor(cursor)
102
103  if stampedMovement, ok := inputBuffer.ConsumeInput(actions.Movement); ok {
104   sys.LastMovementX = float64(stampedMovement.X)
105   sys.LastMovementY = float64(stampedMovement.Y)
106   sys.HasTarget = true
107  }
108
109  if sys.HasTarget {
110   dx := sys.LastMovementX - pos.X
111   dy := sys.LastMovementY - pos.Y
112   distance := math.Sqrt(dx*dx + dy*dy)
113
114   if distance < 5 {
115    sys.HasTarget = false
116   } else {
117    lerpFactor := 0.05
118    pos.X = lerp(pos.X, sys.LastMovementX, lerpFactor)
119    pos.Y = lerp(pos.Y, sys.LastMovementY, lerpFactor)
120   }
121  }
122 }
123
124 return nil
125}