Advertisement
Guest User

Untitled

a guest
Apr 16th, 2015
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.36 KB | None | 0 0
  1.  
  2. --# Main
  3. -- PhysicsButton
  4.  
  5. -- Use this function to perform your initial setup
  6. function setup()
  7. pb = PhysicsButton(vec2(WIDTH/2,HEIGHT/2+200),
  8. readImage("Cargo Bot:Title Large Crate 1"),function() print("hit") end)
  9. end
  10.  
  11.  
  12. function angleOfPoint(pt)
  13. return math.deg(math.atan2(pt.y,pt.x))
  14. end
  15.  
  16. function touched(t)
  17. pb:touched(t)
  18. end
  19. -- This function gets called once every frame
  20. function draw()
  21. -- This sets a dark background color
  22. background(40, 40, 50)
  23.  
  24. -- This sets the line thickness
  25. strokeWidth(5)
  26.  
  27. -- Do your drawing here
  28. pb:draw()
  29. fill(255)
  30. text(math.ceil(1/DeltaTime),100,100)
  31. end
  32.  
  33.  
  34. --# PhysicsButton
  35. PhysicsButton = class()
  36.  
  37. function PhysicsButton:init(pos,img,callback)
  38. -- you can accept and set parameters here
  39. local w,h = img.width,img.height
  40. self.w,self.h = w,h
  41. local verts = {vec2(-w/2,-h/2),vec2(-w/2,h/2),vec2(w/2,h/2),vec2(w/2,-h/2)}
  42. self.anc = physics.body(CIRCLE,10)
  43. self.anc.sensor = true
  44. self.anc.position = pos
  45. self.anc.type = STATIC
  46. self.btn = physics.body(POLYGON,unpack(verts))
  47. self.btn.position = pos+vec2(0,-300)
  48. self.btn.linearVelocity=vec2(math.random(-20,20)*20)
  49. self.btn.gravityScale = 1
  50. self.rj = physics.joint(ROPE,self.anc,self.btn,self.anc.position,self.btn.position+vec2(0,h/2.05),
  51. self.anc.position:dist(self.btn.position+vec2(0,h/2.05)))
  52. self.length = self.anc.position:dist(self.btn.position+vec2(0,h/2.05))
  53. self.rope = Roped(self.rj,8)
  54. self.rj.maxLength = math.huge
  55. self.cb = callback
  56. self.img = img
  57. self.m = mesh()
  58. self.r = self.m:addRect(pos.x,pos.y,w,h)
  59. self.m.texture = img
  60. self.hpd = nil
  61. self.hang = nil
  62. self.finished = nil
  63. end
  64.  
  65. function PhysicsButton:draw()
  66. if self.finished then
  67. if self.btn then
  68. self.btn:destroy()
  69. self.anc:destroy()
  70. self.m:clear()
  71. self.m = nil
  72. self.anc = nil
  73. self.btn = nil
  74. end
  75. return
  76. end
  77. --Equation----------
  78. local b,bl,bp,ap = self.btn,self.btn.linearVelocity,self.btn.position,self.anc.position
  79. local blp = self.btn:getLinearVelocityFromWorldPoint(bp)
  80. local ba = bp+vec2(0,self.h/2.05):rotate(math.rad(b.angle))
  81. local stiffness = 1
  82. local strength = 1
  83. if ba:dist(ap)>self.length then
  84. local dp = ap+(ba-ap):normalize()*(self.length)
  85. local dl = (dp-ba):normalize()
  86. self.btn:applyForce(b.mass*(((dp-ba)*36)*strength-(dl:dot(vec2(blp.x,blp.y))*dl*0.5))*stiffness-bl/36,ba)
  87. end
  88. --------------------
  89. if self.held and self.hang then
  90. --self.btn:applyForce((self.held-self.btn.position)*10-self.btn.linearVelocity/10,self.held)
  91. local pos = (self.btn.position+(self.hpd):rotate(math.rad(self.btn.angle-self.hang)))
  92. self.btn:applyLinearImpulse(self.btn.mass*((self.held-pos)*16-self.btn.linearVelocity)/64,
  93. pos)
  94. end
  95. self.rope:draw()
  96. self.m:setRect(self.r,bp.x,bp.y,self.w,self.h,math.rad(self.btn.angle))
  97. self.m:draw()
  98. end
  99.  
  100. function PhysicsButton:touched(t)
  101. local p = vec2(t.x,t.y)
  102. if t.state == BEGAN and self.btn:testPoint(p) then
  103. self.held = p
  104. self.hang = self.btn.angle
  105. self.tap = p
  106. self.hpd = (p-self.btn.position)
  107. elseif t.state == BEGAN then
  108. self.held = p
  109. self.hang = nil
  110. end
  111. if self.held then
  112. self.held = p
  113. if self.tap and p:dist(self.tap)>8 then self.tap = nil end
  114. end
  115. if t.state == ENDED then
  116. if self.tap then
  117. self.cb()
  118. self.finished = true
  119. end
  120. self.held = nil
  121. self.hang = nil
  122. self.hpd = nil
  123. self.tap = nil
  124. end
  125. end
  126.  
  127.  
  128. Roped = class()
  129.  
  130. function Roped:init(joint,segamnt)
  131. -- you can accept and set parameters here
  132. -- local joint = joint.j
  133. local pos1,pos2 = joint.anchorA,joint.anchorB
  134. --self.id = level.ropes:amount() + 1
  135. self.joint = joint
  136. self.p1 = pos1
  137. self.p2 = pos2
  138. self.m = mesh()
  139. self.m.texture = readImage("Cargo Bot:Claw Arm")
  140. self.r = {}
  141. self.dst = pos1:dist(pos2)*0.8
  142. self.segamnt = segamnt
  143. self.prevnt = DeltaTime
  144. self.seglen = self.dst/segamnt
  145. self.segtbl = {}
  146. for i=1,segamnt do
  147. self.segtbl[i] = {}
  148. self.segtbl[i].pos = pos1+(pos2-pos1):normalize()*self.seglen*i
  149. self.segtbl[i].prev = self.segtbl[i].pos
  150. self.segtbl[i].next = self.segtbl[i].pos +vec2(0,0)
  151. self.segtbl[i].ang = 0
  152. self.r[i] = self.m:addRect(self.segtbl[i].pos.x,self.segtbl[i].pos.y,5,self.seglen)
  153. end
  154. self.r[segamnt+1] = self.m:addRect(self.p2.x,self.p2.y,5,self.seglen)
  155. self.i = 0
  156. end
  157.  
  158. function Roped:draw()
  159. self.p1 = self.joint.anchorA
  160. self.p2 = self.joint.anchorB
  161. local p,dpos,len,va,da,ea,vb,db,eb,grav,stiffness,dt,nt,np,delta
  162. local vd,vdl,diff
  163. grav,stiffness,nt = vec2(0,0.1),0.01,DeltaTime
  164. local segamnt = self.segamnt
  165. local segtbl = self.segtbl
  166. local maxl = self.seglen
  167. local prevpos = vec2()
  168. local nextpos = vec2()
  169. local pos = vec2()
  170. local segi = nil
  171. for i=1,segamnt do
  172. segi = segtbl[i]
  173. pos = segi.pos
  174. if i==1 then
  175. prevpos = self.p1
  176. nextpos = segtbl[i+1].pos
  177. elseif i==segamnt then
  178. prevpos = segtbl[i-1].pos
  179. nextpos = self.p2
  180. else
  181. prevpos = segtbl[i-1].pos
  182. nextpos = segtbl[i+1].pos
  183. end
  184. if not pos or not prevpos or not nextpos then return end
  185. va = (pos-prevpos)
  186. da = (maxl-va:len())/va:len()
  187. ea = va:len()-maxl
  188. vb = (pos-nextpos)
  189. db = (maxl-vb:len())/vb:len()
  190. eb = vb:len()-maxl
  191. dt = (va*stiffness*da+vb*stiffness*db)
  192. if dt:len() > 0 then
  193. np = (pos-segtbl[i].prev) *(nt/self.prevnt) +(dt)*nt*nt
  194. segi.pos = segi.pos + np
  195. end
  196. if i == segamnt then
  197. vd = self.p2-segi.pos
  198. vdl = vd:len()
  199. diff = vdl-maxl
  200. vd = vd:normalize()
  201. if vd:len()>0 then
  202. segtbl[i].pos = segtbl[i].pos + vd*diff*0.5
  203. end
  204. end
  205. if i > 1 then
  206. vd = segtbl[i].pos-segtbl[i-1].pos
  207. vdl = vd:len()
  208. diff = vdl-maxl
  209. vd = vd:normalize()
  210. if vd:len()>0 then
  211. segi.pos = segi.pos - vd*diff*0.5
  212. segtbl[i-1].pos = segtbl[i-1].pos + vd*diff*0.5
  213. end
  214. elseif i==1 then
  215. vd = segi.pos-self.p1
  216. vdl = vd:len()
  217. diff = vdl-maxl
  218. vd = vd:normalize()
  219. if vd:len()>0 then
  220. segi.pos = segi.pos - vd*diff*0.5
  221. end
  222. end
  223.  
  224. segi.prev = pos+grav
  225. pos = segi.pos
  226. self.prevnt = DeltaTime
  227. segtbl[i].ang = math.rad(angleOfPoint(pos-prevpos))+math.pi/2
  228. dpos = (prevpos+pos)/2
  229. len = (prevpos:dist(pos))
  230. self.m:setRect(self.r[i],dpos.x,dpos.y,10,len,segtbl[i].ang)
  231. end
  232. self.segtbl = segtbl
  233. p = segtbl[segamnt].pos
  234. dpos = p-(p-self.p2)*0.5
  235. len = (p:dist(self.p2))
  236. self.m:setRect(self.r[segamnt+1],dpos.x,dpos.y,10,len,math.rad(angleOfPoint(p-self.p2))-math.pi/2)
  237. self.m:draw()
  238. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement