Title here
Summary here
Instructions
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}