I’ve had an idea for a battleground game with destructible terrain, but I want to find out how I can fix this issue with overlapping vertices: http://www.youtube.com/watch?v=HxOsTPAQ_-Q
Here’s the code:
--# Main
-- destructable
-- Use this function to perform your initial setup
function setup()
ter = Terrain(vec2(WIDTH/2,HEIGHT/4),vec2(WIDTH,HEIGHT/2))
end
function touched(t)
ter:touched(t)
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(5)
-- Do your drawing here
ter:draw()
end
--# Terrain
Terrain = class()
function Terrain:init(pos,size)
self.pos = pos
self.size = size
local verts = {}
for x=1,20 do
table.insert(verts,vec2(pos.x-size.x/2+(size.x/20)*x,pos.y+size.y/2))
end
for y=1,20 do
table.insert(verts,vec2(pos.x+size.x/2,pos.y+size.y/2-(size.y/20)*y))
end
for x=1,20 do
table.insert(verts,vec2(pos.x+size.x/2-(size.x/20)*x,pos.y-size.y/2))
end
for y=1,20 do
table.insert(verts,vec2(pos.x-size.x/2,pos.y-size.y/2+(size.y/20)*y))
end
self.verts = verts
self.m = mesh()
self.m:setColors(255,255,255,255)
self.m.vertices = triangulate(verts)
end
function Terrain:draw()
self.m:draw()
end
function Terrain:touched(t)
local p,s = self.pos,self.size
local tp = vec2(t.x,t.y)
local sp = #self.verts
for i=1,sp do
local sv = self.verts[i]
if sv:dist(tp) < 60 then
local dir = (sv-tp):normalize()*20
self.verts[i] = self.verts[i] + dir
end
end
for i=2,sp do
local sv = self.verts[i]
local svi = self.verts[i-1]
if not sv then return end
if sv:dist(svi)>60 then
local d = (sv+svi)/2
if d.x > p.x-s.x/2 and d.x < p.x+s.x/2 and d.y < p.y+s.y/2 and d.y > p.y-s.y/2 then
table.insert(self.verts,i,d)
else
table.remove(self.verts,i)
end
end
if sv:dist(svi)<20 then
table.remove(self.verts,i)
end
end
self.m.vertices = triangulate(self.verts)
end