I was experimenting with repeating gestures (inspired by Blek) and I was able to get repeating gestures pretty easily. However, when I went to get them to bounce off of walls I ran into a problem. I know I am missing something obvious, and was wondering if you guys have any ideas. Here’s the code:
-- Gesture
-- Use this function to perform your initial setup
function setup()
points = {}
locked = false
parameter.watch("#points")
parameter.watch("locked")
parameter.watch("1/DeltaTime")
end
-- This function gets called once every frame
function draw()
-- This sets a dark background color
background(255, 255, 255, 255)
-- This sets the line thickness
strokeWidth(5) stroke(0)
if locked then
local c = points[#points].changed
local d = points[#points].dir
if c then d = d * -1 end
local change = (points[2].p - points[1].p)
local newPoint = points[#points].p + change * d
if newPoint.x >= WIDTH or newPoint.x <= 0 or newPoint.y >= HEIGHT or newPoint.y <= 0 then
newPoint = points[#points].p - change
d = d * -1
c = true
end
table.insert(points, { p = newPoint, dir = d, changed = c })
table.remove(points, 1)
end
for i = 1, #points - 1 do
local p = points[i].p
local p2 = points[i + 1].p
line(p.x, p.y, p2.x, p2.y)
end
end
function touched(t)
local tPoint = vec2(t.x, t.y)
if not locked then
table.insert(points, { p = tPoint, dir = 1 })
end
if t.state == ENDED then
locked = true
end
end
hello @jakattack. I am sorry i didnt try to find the bug in your code, i just rewrote it in ‘my style’ to do what i think you want to do. It is often easier to rewrite something rather that to understand someone else’s thinking. Here it is:
[edit] i’ve removed a couple unnecessary lines. By the way, this little problem and solution you have posted is quite interesting (i mean how you managed to make the line propagate)
-- Gesture
-- Use this function to perform your initial setup
function setup()
points = {}
drawPoints = {}
locked = false
parameter.watch("#points")
parameter.watch("locked")
parameter.watch("1/DeltaTime")
end
-- This function gets called once every frame
function draw()
-- This sets a dark background color
background(255, 255, 255, 255)
-- This sets the line thickness
strokeWidth(5) stroke(0)
if locked then
local change = (points[2].p - points[1].p)
local newPoint = points[#points].p + change
table.insert(points, { p = newPoint })
table.remove(points, 1)
local x,y = newPoint.x % (2*WIDTH), newPoint.y % (2*HEIGHT)
if x>WIDTH then x = WIDTH*2 - x
elseif x <0 then x = -x
end
if y>HEIGHT then y = HEIGHT*2 - y
elseif y<0 then y=-y
end
table.insert(drawPoints, { p = vec2(x,y) })
table.remove(drawPoints, 1)
end
for i = 1, #drawPoints - 1 do
local p1 = drawPoints[i].p
local p2 = drawPoints[i + 1].p
line(p1.x, p1.y, p2.x, p2.y)
end
end
function touched(t)
local tPoint = vec2(t.x, t.y)
if not locked then
table.insert(points, { p = tPoint })
table.insert(drawPoints, { p = tPoint })
end
if t.state == ENDED then
locked = true
end
end
(It seems the parameter panel does not show up in the video).
I have implemented multiple gestures with bouncing off walls or screen wraparound. I am currently working on making the ‘wriggles’ interact with each other and also with physics bodies. As a working title i thought to call it ‘Wriggle Room’. A work in progress and lots of fun!
--# Main
-- Gesture
-- Use this function to perform your initial setup
function setup()
parameter.watch("1/DeltaTime")
wriggles = {}
end
function draw()
background(255, 255, 255, 255)
strokeWidth(5)
for i, wriggle in ipairs(wriggles) do
wriggle:draw()
end
end
function touched(t)
if t.state == BEGAN then
table.insert(wriggles, Wriggle())
end
for i, wriggle in ipairs(wriggles) do
if not wriggle.locked then
wriggle:touched(t)
end
end
end
--# Wriggle
Wriggle = class()
function Wriggle:init(x)
self.points = {}
self.drawPoints = {}
self.locked = false
self.colour = color(math.random(1, 255), math.random(1, 255), math.random(1, 255))
end
function Wriggle:draw()
stroke(self.colour)
if self.locked then
local change = (self.points[2].p - self.points[1].p)
local newPoint = self.points[#self.points].p + change
table.insert(self.points, { p = newPoint })
table.remove(self.points, 1)
local x,y = newPoint.x % (2 * WIDTH), newPoint.y % (2 * HEIGHT)
if x > WIDTH then
x = WIDTH * 2 - x
elseif x < 0 then
x = -x
end
if y > HEIGHT then
y = HEIGHT * 2 - y
elseif y < 0 then
y = -y
end
table.insert(self.drawPoints, { p = vec2(x,y) })
table.remove(self.drawPoints, 1)
end
for i = 1, #self.drawPoints - 1 do
local p1 = self.drawPoints[i].p
local p2 = self.drawPoints[i + 1].p
line(p1.x, p1.y, p2.x, p2.y)
end
end
function Wriggle:touched(t)
local tPoint = vec2(t.x, t.y)
table.insert(self.points, { p = tPoint })
table.insert(self.drawPoints, { p = tPoint })
if t.state == ENDED then
self.locked = true
end
end
--# Main
-- Gesture
-- Use this function to perform your initial setup
function setup()
parameter.watch("1/DeltaTime")
wriggles = {}
end
function draw()
background(255, 255, 255, 255)
strokeWidth(5)
for i, wriggle in ipairs(wriggles) do
wriggle:draw()
end
end
function touched(t)
if t.state == BEGAN then
table.insert(wriggles, Wriggle())
end
for i, wriggle in ipairs(wriggles) do
if not wriggle.locked then
wriggle:touched(t)
end
end
end
--# Wriggle
Wriggle = class()
function Wriggle:init(x)
self.points = {}
self.drawPoints = {}
self.locked = false
self.r=math.random(255)
self.g=math.random(255)
self.b=math.random(255)
end
function Wriggle:draw()
if self.locked then
local change = (self.points[2].p - self.points[1].p)
local newPoint = self.points[#self.points].p + change
table.insert(self.points, { p = newPoint })
table.remove(self.points, 1)
local x,y = newPoint.x % (2 * WIDTH), newPoint.y % (2 * HEIGHT)
if x > WIDTH then
x = WIDTH * 2 - x
elseif x < 0 then
x = -x
end
if y > HEIGHT then
y = HEIGHT * 2 - y
elseif y < 0 then
y = -y
end
table.insert(self.drawPoints, { p = vec2(x,y) })
table.remove(self.drawPoints, 1)
end
for i = 1, #self.drawPoints - 1 do
stroke(self.r,self.g,self.b,(i/#self.drawPoints)*255)
local p1 = self.drawPoints[i].p
local p2 = self.drawPoints[i + 1].p
line(p1.x, p1.y, p2.x, p2.y)
end
end
function Wriggle:touched(t)
local tPoint = vec2(t.x, t.y)
table.insert(self.points, { p = tPoint })
table.insert(self.drawPoints, { p = tPoint })
if t.state == ENDED then
self.locked = true
end
end