package elements import ( "ducky/gamedata" "image/color" "math" "github.com/hajimehoshi/ebiten/v2" "golang.org/x/exp/rand" ) const ( sliderWidth = 640 / 5 sliderHeight = 480 easeValue = 16 ) type Slider struct { Sprite *ebiten.Image position gamedata.Coordinates targetposition gamedata.Coordinates cycle int callback func() called bool color color.Color } func NewSlider() *Slider { slider := &Slider{ Sprite: ebiten.NewImage(sliderWidth, sliderHeight), called: false, color: color.RGBA{ R: uint8(rand.Intn(256)) & 0xff, G: uint8(rand.Intn(256)) & 0xff, B: uint8(rand.Intn(256)) & 0xff, A: 0xff, }, } return slider } func (s *Slider) Update() { dx := s.targetposition.X - s.position.X dy := s.targetposition.Y - s.position.Y deltapos := math.Sqrt(dx*dx + dy*dy) if deltapos > 0.5 { s.position.X = s.position.X + dx/easeValue s.position.Y = s.position.Y + dy/easeValue } else { if s.callback != nil && !s.called { s.callback() s.called = true } } s.cycle++ } func (s *Slider) Draw() { s.Sprite.Clear() s.Sprite.Fill(s.color) } func (s *Slider) GetPosition() gamedata.Coordinates { return s.position } func (s *Slider) SetPosition(pos gamedata.Coordinates) { s.position = pos } func (s *Slider) SetTargetPosition(pos gamedata.Coordinates) { s.targetposition = pos } func (s *Slider) SetCallback(f func()) { if f != nil { s.callback = f } } func (s *Slider) Reset() { s.called = false }