Based on http://gamedevelopment.tutsplus.com/tutorials/creating-dynamic-2d-water-effects-in-unity--gamedev-14143 which I came across via @andymac3d’s blog I’ve implemented the first bit in Codea. Touch the screen to create a wave.
-- waves
--by West
--based on http://gamedevelopment.tutsplus.com/tutorials/creating-dynamic-2d-water-effects-in-unity--gamedev-14143
-- Use this function to perform your initial setup
function setup()
numwatersprings=150
water={}
border=10
for i=1,numwatersprings do
table.insert(water,{x=border+i*(WIDTH-2*border)/numwatersprings,y=HEIGHT/2,vel=0,acc=0})
end
parameter.number("springconstant",0.01,0.1,0.02)
parameter.number("damping",0.01,0.1,0.04)
parameter.number("spread",0.01,0.1,0.01)
parameter.integer("neighbours",5,20,9)
leftDeltas={}
rightDeltas={}
baseheight=HEIGHT/2
left=100
bottom=50
end
-- This function gets called once every frame
function draw()
-- This sets a dark background color
background(40, 40, 50)
-- This sets the line thickness
strokeWidth(2)
if CurrentTouch.state==BEGAN then
local nearestspring=math.floor(numwatersprings*CurrentTouch.x/WIDTH)
if nearestspring==0 then nearestspring=1 end
water[nearestspring].y=(CurrentTouch.y)
end
--calculate the new position of each water spring element
for u,w in pairs(water) do
force = springconstant * (w.y - baseheight) + w.vel*damping
w.acc = -force
w.y = w.y + w.vel
w.vel = w.vel + w.acc
end
--let each spring affect its neighbours
for j=1,neighbours do
for i=1,numwatersprings do
if (i > 1) then
leftDeltas[i] = spread * (water[i].y - water[i-1].y);
water[i-1].vel = water[i-1].vel + leftDeltas[i];
end
if (i < numwatersprings - 1) then
rightDeltas[i] = spread * (water[i].y - water[i+1].y);
water[i+1].vel=water[i+1].vel + rightDeltas[i];
end
end
end
for i=1,numwatersprings do
if (i > 1) then
water[i-1].y =water[i-1].y+ leftDeltas[i];
end
if (i < numwatersprings- 1) then
water[i+1].y=water[i+1].y + rightDeltas[i];
end
end
--draw the water line
for i=1,numwatersprings-1 do
line(water[i].x,water[i].y,water[i+1].x,water[i+1].y)
end
end