Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --# Main
- -- WaveAfterWave
- displayMode(FULLSCREEN)
- -- Use this function to perform your initial setup
- function setup()
- physics.continuous=true
- ply = Player(vec2(WIDTH/2,HEIGHT/2))
- waves = Waves()
- flv = {vec2(0,0)}
- for i=2,49 do
- flv[i] = vec2((WIDTH/50)*i,math.random(5+i//5,20+i//5))
- end
- flv[50]=vec2(WIDTH,0)
- flm=mesh()
- flm:setColors(140,150,145,255)
- flm.vertices = triangulate(flv)
- floor = physics.body(CHAIN,false,unpack(flv))
- floor.mask = {1}
- floor.categories = {2}
- walls = physics.body(CHAIN,false,vec2(0,0),vec2(0,HEIGHT),vec2(WIDTH,HEIGHT),vec2(WIDTH,0))
- fps = 1
- tchs = {}
- end
- function touched(t)
- if ply:jtoucht(t) and t.state == BEGAN then
- table.insert(tchs,{ply,t,"joy"})
- elseif ply:btoucht(t) and t.state == BEGAN then
- table.insert(tchs,{ply,t,"btn"})
- end
- for k,v in pairs(tchs) do
- tchs[k][2]=t
- v[1]:touched(v)
- if v[2].state == ENDED then
- table.remove(tchs,k)
- end
- end
- end
- -- This function gets called once every frame
- function draw()
- -- This sets a dark background color
- background(151, 151, 198, 255)
- -- This sets the line thickness
- strokeWidth(5)
- fps=fps*0.95+DeltaTime*0.05
- -- Do your drawing here
- flm:draw()
- waves:draw()
- waves:waveCollide(ply)
- ply:draw()
- text(1/fps,100,100)
- end
- --# Player
- Player = class()
- function Player:init(pos)
- -- you can accept and set parameters here
- --Vector table for body points
- self.mp = pos
- self.alive = true
- self.board = physics.body(POLYGON,vec2(-50,-5),vec2(-50,5),vec2(50,5),vec2(50,-5))
- self.board.position = pos-vec2(0,200)
- self.board.bullet = true
- self.board.type = DYNAMIC
- self.bones = {}
- self.bones[1] = vec2(WIDTH/2,HEIGHT/2)--head
- self.bones[2] = vec2(0,-30)--pelvis
- self.bones[12] = vec2(0,-30)--pelvisright
- self.bones[13] = vec2(0,-30)--pelvisleft
- self.bones[3] = vec2(5,-55)--right knee
- self.bones[4] = vec2(-5,-55)--left knee
- self.bones[5] = vec2(5,-75)--right foot
- self.bones[6] = vec2(-5,-75)--left foot
- self.bones[7] = vec2(0,-5)--shoulder joint
- self.bones[14] = vec2(0,-5)--right shoulder
- self.bones[15] = vec2(0,-5)--left shoulder
- self.bones[8] = vec2(5,-20)--right elbow
- self.bones[9] = vec2(-5,-20)--left elbow
- self.bones[10] = vec2(5,-35)--right hand
- self.bones[11] = vec2(-5,-35)--left hand
- --self.velocity table (if used)
- self.vel = {}
- --Point table for final positions of joints (table of points that gets drawn)
- self.p = {}
- --For all the joints create the table of self.velocity for each joint and the point of each joint
- for i = 1,#self.bones do
- self.vel[i] = vec2(0,0)
- self.p[i] = pos+self.bones[i]
- end
- self.tch=nil
- self.joy = Joystick(vec2(120,100))
- end
- function Player:kill()
- if self.alive then
- for k,v in pairs(self.vel) do
- self.vel[k] = self.board.linearVelocity/32
- end
- end
- self.alive=false
- end
- function Player:jtoucht(t)
- if vec2(t.x,t.y):dist(vec2(120,100))<80 then
- return true
- end
- return false
- end
- function Player:btoucht(t)
- if vec2(t.x,t.y):dist(vec2(WIDTH-120,100))<80 then
- return true
- end
- return false
- end
- function Player:draw()
- local grav = vec2(0,-0.1)
- --Localise tableself.bones, call it v for the drawing
- self.board.angularVelocity = self.board.angularVelocity+(0-self.board.angle)*0.025
- local v =self.bones
- if td ~= nil then
- self.vel[1] = self.vel[1] + (self.mp-v[1]):normalize()*(vec2(td.x,td.y):dist(v[1])/40)
- self.vel[1] = self.vel[1] * 0.85
- else
- if v[1].y < 10 then
- v[1].y = 10
- self.vel[1] = vec2()
- else
- self.vel[1] = self.vel[1] + grav*5
- end
- self.vel[1] = vec2(self.vel[1].x*0.98,self.vel[1].y*0.95)
- end
- --if self.alive then
- --Create spacing between elbows,hands and knees
- if self.bones[3]:dist(self.bones[4]) < 15 then
- self.bones[3] =self.bones[3]+(self.bones[3]-self.bones[4]):normalize()*1
- self.bones[4] =self.bones[4]+(self.bones[3]-self.bones[4]):normalize()*-1
- self.vel[3] = self.vel[3]+grav
- self.vel[4] = self.vel[4]+grav
- end
- if self.bones[9]:dist(self.bones[8]) < 15 then
- self.bones[8] =self.bones[8]+(self.bones[8]-self.bones[9]):normalize()*1
- self.bones[9] =self.bones[9]+(self.bones[8]-self.bones[9]):normalize()*-1
- self.vel[8] = self.vel[8]+grav
- self.vel[9] = self.vel[9]+grav
- end
- if self.bones[10]:dist(self.bones[11]) < 20 then
- self.bones[10] =self.bones[10]+(self.bones[10]-self.bones[11]):normalize()*1
- self.bones[11] =self.bones[11]+(self.bones[10]-self.bones[11]):normalize()*-1
- self.vel[10] = self.vel[10]+grav
- self.vel[11] = self.vel[11]+grav
- end
- --end
- for i=1,#self.bones do
- local vi = v[i]
- if i > 1 then
- if vi.y < 10 then
- self.bones[i].y = 10
- self.vel[i] = self.vel[i] + vec2(0,0.1)
- else
- self.vel[i] = self.vel[i] + grav*5
- self.vel[i] = self.vel[i]*0.9
- end
- end
- end
- if self.alive then
- local pos,ang = self.board.position,math.rad(self.board.angle)
- local pdtl,pdtr = pos+vec2(-15,0):rotate(ang),pos+vec2(15,0):rotate(ang)
- self.vel[1] = ((pos+vec2(0,80):rotate(ang)-self.bones[1])-self.vel[1]/60)
- self.vel[2] = ((pos+vec2(0,50):rotate(ang)-self.bones[2])-self.vel[2]/60)/5
- self.vel[5]=(pdtr-self.bones[5]):normalize()
- self.vel[6]=(pdtl-self.bones[6]):normalize()
- self.vel[3]=(pos+vec2(15,20):rotate(ang)-self.bones[3]):normalize()
- self.vel[4]=(pos+vec2(-15,20):rotate(ang)-self.bones[4]):normalize()
- self.vel[10]=((pos+vec2(45,60):rotate(ang))-self.bones[10])/10
- self.vel[11]=((pos+vec2(-45,60):rotate(ang))-self.bones[11])/10
- self.vel[8]=((pos+vec2(20,50):rotate(ang))-self.bones[8])/10
- self.vel[9]=((pos+vec2(-20,50):rotate(ang))-self.bones[9])/10
- self.bones[5]=pdtr
- self.bones[6]=pdtl
- self.bones[1] =self.bones[1] + self.vel[1]
- self.bones[2] =self.bones[1]+(self.bones[2]-self.bones[1]):normalize()*30 + self.vel[2]
- self.bones[3] =self.bones[2]+(self.bones[3]-self.bones[2]):normalize()*25 + self.vel[3]
- self.bones[4] =self.bones[2]+(self.bones[4]-self.bones[2]):normalize()*25 + self.vel[4]
- self.bones[3] =self.bones[5]+(self.bones[3]-self.bones[5]):normalize()*20 + self.vel[3]
- self.bones[4] =self.bones[6]+(self.bones[4]-self.bones[6]):normalize()*20 + self.vel[4]
- self.bones[5] =self.bones[3]+(self.bones[5]-self.bones[3]):normalize()*20 + self.vel[5]
- self.bones[6] =self.bones[4]+(self.bones[6]-self.bones[4]):normalize()*20 + self.vel[6]
- self.bones[7] =self.bones[1]+(self.bones[2]-self.bones[1]):normalize()*5
- self.bones[8] =self.bones[7]+(self.bones[8]-self.bones[7]):normalize()*15 + self.vel[8]
- self.bones[9] =self.bones[7]+(self.bones[9]-self.bones[7]):normalize()*15 + self.vel[9]
- self.bones[10] =self.bones[8]+(self.bones[10]-self.bones[8]):normalize()*15 + self.vel[10]
- self.bones[11] =self.bones[9]+(self.bones[11]-self.bones[9]):normalize()*15 + self.vel[11]
- else
- self.bones[1] =self.bones[1] + self.vel[1]
- self.bones[2] = self.bones[1]+(self.bones[2]-self.bones[1]):normalize()*30 +self.vel[2]
- self.bones[3] = self.bones[2]+(self.bones[3]-self.bones[2]):normalize()*25 +self.vel[3]
- self.bones[4] = self.bones[2]+(self.bones[4]-self.bones[2]):normalize()*25 +self.vel[4]
- self.bones[5] = self.bones[3]+(self.bones[5]-self.bones[3]):normalize()*20 +self.vel[5]
- self.bones[6] = self.bones[4]+(self.bones[6]-self.bones[4]):normalize()*20 +self.vel[6]
- self.bones[7] = self.bones[1]+(self.bones[2]-self.bones[1]):normalize()*5
- self.bones[8] = self.bones[7]+(self.bones[8]-self.bones[7]):normalize()*20 +self.vel[8]
- self.bones[9] = self.bones[7]+(self.bones[9]-self.bones[7]):normalize()*20 +self.vel[9]
- self.bones[10] = self.bones[8]+(self.bones[10]-self.bones[8]):normalize()*15 +self.vel[10]
- self.bones[11] = self.bones[9]+(self.bones[11]-self.bones[9]):normalize()*15 +self.vel[11]
- end
- --Create and update all joint positions and create *bones*
- --Draw the body
- pushStyle()
- strokeWidth(5)
- stroke(200,200,200,255)
- line(v[1].x,v[1].y,v[2].x,v[2].y)
- line(v[2].x,v[2].y,v[3].x,v[3].y)
- line(v[2].x,v[2].y,v[4].x,v[4].y)
- line(v[3].x,v[3].y,v[5].x,v[5].y)
- line(v[4].x,v[4].y,v[6].x,v[6].y)
- line(v[7].x,v[7].y,v[8].x,v[8].y)
- line(v[7].x,v[7].y,v[9].x,v[9].y)
- line(v[8].x,v[8].y,v[10].x,v[10].y)
- line(v[9].x,v[9].y,v[11].x,v[11].y)
- ellipse(v[1].x,v[1].y,20)
- strokeWidth(10)
- local pos,ang = self.board.position,self.board.angle
- local pdtl,pdtr = pos+vec2(-50,0):rotate(math.rad(ang)),pos+vec2(50,0):rotate(math.rad(ang))
- line(pdtl.x,pdtl.y,pdtr.x,pdtr.y)
- fill(100,100)
- ellipse(WIDTH-100,100,160)
- self.joy:draw()
- if self.tch and self.alive then
- self.board:applyForce(vec2(self.joy.dis.x*10):rotate(math.rad(self.board.angle)))
- end
- popStyle()
- end
- function Player:touched(td)
- local typ,t=td[3],td[2]
- if typ == "btn" and t.state == BEGAN and self.tch then
- ply.board.linearVelocity=(vec2(0,400))
- end
- if typ=="joy" then
- self.joy:touched(t)
- end
- end
- --# Waves
- Waves = class()
- function Waves:init(x)
- -- you can accept and set parameters here
- self.parts = {}
- self.rangers = {}
- self.m = mesh()
- for i=1,100 do
- self.parts[i]={}
- self.rangers[i] = nil
- self.parts[i].pos = vec2()
- --self.parts[i].r = self.m:addRect(1,1,1,1)
- end
- end
- function Waves:waveCollide(ply)
- for k,v in pairs(self.parts) do
- if math.abs(ply.board.x-v.pos.x)<120 then
- self.rangers[k] = physics.raycast(vec2(v.pos.x,0),v.pos,1)
- end
- end
- end
- function Waves:draw()
- local wh = WIDTH/(#self.parts-1)
- local mv = {}
- mv[0]=vec2(0,0)
- local ptch = false
- for k,v in pairs(self.parts) do
- v.pos = vec2((k-1)*wh,math.sin(k*0.1+ElapsedTime)*50+(100+k*0.75))
- --self.m:setRect(v.r,v.pos.x,v.pos.y/2,wh,v.pos.y)
- local rc = self.rangers[k]
- if rc then
- local bd = rc.body
- bd:applyForce(-rc.normal*(1-rc.fraction)*70-vec2(0,bd:getLinearVelocityFromWorldPoint(rc.point).y/20),rc.point)
- ptch = true
- --self.m:setRect(v.r,v.pos.x,v.pos.y*0.5*rc.fraction,wh,v.pos.y*rc.fraction)
- mv[k]=vec2(v.pos.x,v.pos.y*rc.fraction)
- --bd:applyForce(vec2(Gravity.x*10,0))
- if not self.rangers[k-1] then
- for i=k-1,k-10,-1 do
- local p = self.parts[i]
- if not self.rangers[i] and p and mv[i+1] then
- mv[i]=vec2(p.pos.x,(p.pos.y+mv[i+1].y)/2)
- end
- end
- end
- if not self.rangers[k+1] then
- for i=k+1,k+10 do
- local p = self.parts[i]
- if not self.rangers[i] and p and mv[i-1] then
- mv[i]=vec2(p.pos.x,(p.pos.y+mv[i-1].y)/2)
- end
- end
- end
- if ply.alive and ply.board.x<WIDTH*0.3 then
- bd.linearVelocity = vec2(bd.linearVelocity.x+(WIDTH*0.5-bd.x)/400,bd.linearVelocity.y)
- end
- if rc.fraction<0.05 or (bd.angle<-90 or bd.angle>90) then
- ply:kill()
- end
- else
- if not mv[k] then
- mv[k]=v.pos
- end
- end
- end
- table.insert(mv,vec2(WIDTH,0))
- table.insert(mv,vec2(0,0))
- ply.tch = ptch
- self.m.vertices = triangulate(mv)
- self.m:setColors(50,50,255,150)
- self.m:draw()
- end
- function Waves:touched(touch)
- -- Codea does not automatically call this method
- end
- --# JoyStick
- Joystick = class()
- function Joystick:init(pos)
- -- you can accept and set parameters here
- self.pos = pos
- self.tpos = vec2()
- self.hpos = nil
- self.dis = vec2()
- --self.id = random(100000000,999999999)
- end
- function Joystick:draw()
- pushStyle()
- if not self.hpos then
- tint(255,80)
- else
- tint(255,160)
- self.dis = (self.hpos-self.pos)/80
- if self.hpos:dist(self.pos)>0 then
- self.tpos = self.dis:normalize()*(math.min(self.hpos:dist(self.pos),80))
- end
- end
- sprite("Documents:flatdark",self.pos.x,self.pos.y,160,160)
- sprite("Documents:flatjoy",self.pos.x+self.tpos.x,self.pos.y+self.tpos.y,80,80)
- popStyle()
- end
- function Joystick:stop()
- self.hpos = nil
- self.tpos = vec2()
- self.dis = vec2()
- end
- function Joystick:getValue()
- return self.dis
- end
- function Joystick:holding()
- return self.hpos ~= nil
- end
- function Joystick:toucht(t)
- if not t then return self.hpos ~= nil end
- local p = vec2(t.x,t.y)
- if p:dist(self.pos)<86 or self.hpos then
- return true
- end
- return false
- end
- function Joystick:touched(t)
- local p = vec2(t.x,t.y)
- --print(p:dist(self.pos))
- if t.state == BEGAN and p:dist(self.pos)<86 then
- self.hpos = p
- end
- if t.state == MOVING and self.hpos then
- self.hpos = p
- end
- if t.state == ENDED then
- self.hpos = nil
- self.tpos = vec2()
- self.dis = vec2()
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement