Analog Stick

So I haven’t really posted anything I’ve created on the forum yet, so I thought I should already. This is an analog stick class that I made for use in various games since it’s become a common control device in mobile games. Feel free to edit/optimize it or change the styling to fit your needs.

AnalogStick = class()

function AnalogStick:init(x, y)
    self.center = vec2(x, y)
    self.backboardSize = 150
    self.backboardRadius = self.backboardSize/2
    self.capSize = 80
    self.grabbed = false
    self.capPos = vec2(self.center.x, self.center.y)
    self.dragDist = 0
end

function AnalogStick:draw()
    pushStyle()
    
    fill(210, 208, 208, 255)
    stroke(164, 158, 158, 255)
    
    ellipse(self.center.x, self.center.y, self.backboardSize)
    
    fill(159, 150, 150, 255)
    stroke(121, 119, 119, 255)
    
    ellipse(self.capPos.x, self.capPos.y, self.capSize)
    
    popStyle()
end

function AnalogStick:touched(touch)
    self.dragDist = self.center:dist(vec2(touch.x, touch.y))
    
    if touch.state ~= ENDED and self.dragDist <= self.backboardRadius then
        self.capPos = vec2(touch.x, touch.y)
        self.grabbed = true
        
        return {mag = self.dragDist/self.backboardRadius, angle = math.deg(math.atan(self.capPos.x-self.center.x, self.capPos.y-self.center.y))}
        
    elseif touch.state == MOVING and self.grabbed == true and self.dragDist > self.backboardRadius then
        -- VVV Learn about this more VVV
        k = self.backboardRadius/self.center:dist(vec2(touch.x, touch.y))
        self.capPos = self.center+k*(vec2(touch.x, touch.y)-self.center)
        self.grabbed = true
        
        return {mag = 1, angle = math.deg(math.atan(self.capPos.x-self.center.x, self.capPos.y-self.center.y))}
        
    else
        self.capPos = vec2(self.center.x, self.center.y)
        self.grabbed = false
        self.dragDist = 0
        
        return {mag = 0, angle = 0}
    end
end

Ok, thanks @dave1707

@captsmitty77 When you post code, put 3 ~'s on a line before and after the code so it shows properly.

@captsmitty77 - thanks for sharing.

you are more like to get people trying your code if you can provide a simple example using it, so they can see how it works. A little video sometimes helps too.

Also, you might find the angleBetween function useful, which can be used to get the angle between two vec2’s.

Thanks for the advice @Ignatz. I’ll check out angleBetween also