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.Action
 25}{
 26	Movement: input.NewAction(),
 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.ActionBufferSystem{})
 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(width, height int, sto warehouse.Storage) error {
 68	spriteArchetype, err := sto.NewOrExistingArchetype(
 69		input.Components.ActionBuffer,
 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.ActionBuffer,
 78		spatial.NewPosition(255, 20),
 79		client.NewSpriteBundle().
 80			AddSprite("images/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.ActionBuffer, spatial.Components.Position)
 97	cursor := scene.NewCursor(query)
 98
 99	for range cursor.Next() {
100		pos := spatial.Components.Position.GetFromCursor(cursor)
101		actionBuffer := input.Components.ActionBuffer.GetFromCursor(cursor)
102
103		if stampedMovement, ok := actionBuffer.ConsumeAction(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}