summaryrefslogtreecommitdiff
path: root/src/ui/joystick.moon
diff options
context:
space:
mode:
authorAlexander M Pickering <alex@cogarr.net>2025-01-09 18:11:46 -0600
committerAlexander M Pickering <alex@cogarr.net>2025-01-09 18:11:46 -0600
commitdecb72f936060a65bff18e9cbf33642ea3a71cd0 (patch)
tree3b07bb1bfc1e4f0e39ec4ff8e0c243cd4fab0d61 /src/ui/joystick.moon
parent726876d42270f8974fd495be91127ea7585472ff (diff)
downloadggj25-decb72f936060a65bff18e9cbf33642ea3a71cd0.tar.gz
ggj25-decb72f936060a65bff18e9cbf33642ea3a71cd0.tar.bz2
ggj25-decb72f936060a65bff18e9cbf33642ea3a71cd0.zip
Work
Diffstat (limited to 'src/ui/joystick.moon')
-rw-r--r--src/ui/joystick.moon98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/ui/joystick.moon b/src/ui/joystick.moon
new file mode 100644
index 0000000..168e18b
--- /dev/null
+++ b/src/ui/joystick.moon
@@ -0,0 +1,98 @@
+
+color = require("color")
+window = require("window")
+
+circle_cache = setmetatable({},{__mode: "v"})
+hollow_circle = (x,y,radius, thickness, color) ->
+ key = string.format("%d\0%d\0%d\0%d",x,y,radius, thickness)
+ if circle_cache[key]
+ return circle_cache[key]
+ arr = {}
+ segments = 60
+ step = (2*math.pi) / segments
+ for i = 0,2*math.pi, step
+ arr[#arr+1] = vec2(i+step, 1)
+ arr[#arr+1] = vec2(i, 1)
+ arr[#arr+1] = vec2(i+step,0)
+ arr[#arr+1] = vec2(i+step,0)
+ arr[#arr+1] = vec2(i,1)
+ arr[#arr+1] = vec2(i,0)
+ circle = am.use_program(am.program([[
+ precision highp float;
+ attribute vec2 index;
+ uniform float thickness;
+ uniform float radius;
+ uniform mat4 MV;
+ uniform mat4 P;
+ void main() {
+ float distance = thickness * index[1];
+ vec2 vert = vec2(cos(index[0]) * (radius - distance), sin(index[0]) * (radius - distance));
+ gl_Position = P * MV * vec4(vert, 0.0, 1.0);
+ }
+ ]],[[
+ precision mediump float;
+ uniform vec4 color;
+ void main() {
+ gl_FragColor = color;
+ }
+ ]]))\append(am.bind({
+ MV: mat4(
+ 1, 0, 0, 0
+ 0, 1, 0, 0
+ 0, 0, 1, 0
+ x, y, 0, 1
+ )
+ thickness: thickness
+ radius: radius
+ index: am.vec2_array(arr)
+ color: color
+ })\append(am.draw("triangles")))
+ circle_cache[key] = circle
+ circle
+
+class Joystick
+ --am.sprite() only works once the window is created
+ @initalized = false
+ @initalize: =>
+ @hollow_circle = am.group!
+ step = 0.5
+ thickness = 0.02
+ lastpoint = vec2(1,0)
+ print("color.am_color.background is:", color.am_color.background)
+ for k,v in pairs(color.am_color)
+ print(k,":",v)
+ highlight_start = (5/8) * math.pi
+ highlight_end = (7/8) * math.pi
+ shadow_start = (3/2) * math.pi
+ shadow_end = 2 * math.pi
+ for i = 0,2*math.pi,step
+ nextpoint = vec2(math.cos(i), math.sin(i))
+ @hollow_circle\append(am.line(lastpoint + vec2(1,1), nextpoint + vec2(1,1), thickness, color.am_color.outline))
+ --@hollow_circle\append(am.line(lastpoint, nextpoint, thickness, color.am_color.background))
+ lastpoint = nextpoint
+ @hollow_circle\append(am.line(lastpoint, vec2(1,0), thickness * 2, color.am_color.outline))
+ @hollow_circle\append(am.line(lastpoint,vec2(1,0), thickness, color.am_color.background))
+ @initalized = true
+ new: (x,y,r)=>
+ if not @@initalized
+ @@initalize!
+ @node = am.group!
+ position = am.translate(x,y)\tag("position")
+ @node\append(position)
+ --position\append(am.circle(vec2(x,y), r, color.am_color.background))
+ @stick_pos = am.translate(0,0)\tag("stick")
+ position\append(
+ @stick_pos\append(
+ am.circle(vec2(0,0), r/9, color.am_color.outline)\append(
+ am.circle(vec2(0,0), r/10, color.am_color.background)\append(
+ am.circle(vec2(-r/60,r/60),r/15, color.am_color.foreground)\append(
+ am.circle(vec2(5,-5),r/13, color.am_color.background)
+ )))))
+ --position\append(am.scale(r,r)\append(@@hollow_circle))
+ --position\append(am.circle(vec2(x,y),r)\append(am.blend("subtract")\append(am.circle(vec2(x,y),r-10))))
+ position\append(hollow_circle(x,y,r,8,color.am_color.outline))
+ position\append(hollow_circle(x,y,r-math.sqrt(2),5,color.am_color.background))
+ fire: (tbl) =>
+ print("Fired",tbl)
+
+Joystick