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