Touch

Instructions

  • Tap to move sprite
touch.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)
 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}