KaoSDlanor

basicSim update

Jun 30th, 2013
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.38 KB | None | 0 0
  1. emulationSpeed=3000
  2. frameskip=100
  3. G=6.67384*10^-11 --N(m/kg)^2
  4. obj_mt={}
  5.  
  6. obj_mt.compare=function(self,obj)
  7.     if self.pos and obj.pos then
  8.         return ((obj.pos[1]-self.pos[1])^2+(obj.pos[2]-self.pos[2])^2)^0.5,math.atan2(obj.pos[2]-self.pos[2],obj.pos[1]-self.pos[1]),math.atan2(self.newVel[2]-(obj.vel[2] or obj.newVel[2]),self.newVel[1]-(obj.vel[1] or obj.newVel[1]))
  9.     end
  10. end
  11.  
  12. obj_mt.finishUpdateV=function(self)
  13.     for i=1,2 do
  14.         if (self.pos[i]<=self.radius and self.newVel[i]<0) or (self.pos[i]+self.radius>=love.graphics[i==1 and "getWidth" or "getHeight"]() and self.newVel[i]>0) then
  15.             self.newVel[i]=-self.newVel[i]*0.8
  16.         end
  17.         self.vel[i]=self.newVel[i] or self.vel[i]
  18.     end
  19. end
  20.  
  21. obj_mt.updateV=function(self,nSpeed)
  22.     if type(self.mass)=="number" then
  23.         for k,v in pairs(tObj) do
  24.             self:finishUpdateV()
  25.         end
  26.         for k,v in pairs(tObj) do
  27.             local dist,ang,vAng=self:compare(v)
  28.             if v~=self and type(v.mass)=="number" and type(dist)=="number" then
  29.                 if dist>self.radius+v.radius then
  30.                     local nForce=(G*self.mass*v.mass)/dist^2
  31.                     local xF,yF=math.cos(ang)*nForce,math.sin(ang)*nForce
  32.                     self.newVel[1]=self.newVel[1]+xF*(nSpeed or 1)/self.mass
  33.                     self.newVel[2]=self.newVel[2]+yF*(nSpeed or 1)/self.mass
  34.                 elseif math.abs((vAng-ang+math.pi)%(2*math.pi)-math.pi)<=math.pi/2 then
  35.                     local combinedXVel,combinedYVel=(self.newVel[1]+v.vel[1])/2,(self.newVel[2]+v.vel[2])/2
  36.                     local relativeVel=((self.newVel[1]-v.vel[1])^2+(self.newVel[2]-v.vel[2])^2)^0.5
  37.                     local velTowardsObj,velLeftObj=math.cos(ang-vAng)*relativeVel,math.sin(ang-vAng)*relativeVel
  38.                     self.newVel[1]=(math.cos(ang+math.pi)*velTowardsObj+math.cos(ang-math.pi/2)*velLeftObj)/2*0.8+combinedXVel
  39.                     self.newVel[2]=(math.sin(ang+math.pi)*velTowardsObj+math.sin(ang-math.pi/2)*velLeftObj)/2*0.8+combinedYVel
  40.                 end
  41.             end
  42.         end
  43.     end
  44. end
  45.  
  46. obj_mt.updateP=function(self,nSpeed)
  47.     self:finishUpdateV()
  48.     self.pos[1]=(self.newPos[1] or self.pos[1])+self.vel[1]*(nSpeed or 1)
  49.     self.pos[2]=(self.newPos[1] or self.pos[2])+self.vel[2]*(nSpeed or 1)
  50. end
  51.  
  52. function love.load()
  53.     _elapsed=0
  54.     tObj=setmetatable({},{
  55.         __newindex=function(self,index,value)
  56.             rawset(self,index,type(value)=="table" and setmetatable(value,{__index=function(self,index) return obj_mt[index] end}) or value)
  57.         end
  58.     })
  59.  
  60.     tObj[1]={pos={100,100},vel={},mass=500000,radius=10,col={255,0,0},newPos={},newVel={0.0002,0}}
  61.     tObj[2]={pos={100,200},vel={},mass=500000,radius=10,col={0,255,0},newPos={},newVel={-0.0002,0}}
  62.     tObj[3]={pos={150,200},vel={},mass=500000,radius=10,col={0,0,255},newPos={},newVel={0.00005,0}}
  63.     --tObj[4]={pos={150,500},vel={},mass=500000,radius=5,col={255,0,255},newPos={},newVel={0.00005,0}}
  64. end
  65.  
  66. function love.update(dt)
  67.     if not bPaused then
  68.         _elapsed=_elapsed+dt
  69.         for k,v in pairs(tObj) do
  70.             v:updateV(frameskip)
  71.         end
  72.         for k,v in pairs(tObj) do
  73.             v:updateP(frameskip)
  74.         end
  75.     end
  76. end
  77.  
  78. function printLine(sText)
  79.     sText=tostring(sText)
  80.     if type(sText)=="string" then
  81.         love.graphics.print(sText,0,at)
  82.     end
  83.     at=at+12
  84. end
  85.  
  86. function love.draw()
  87.     at=0
  88.     love.graphics.setColor(255,255,255)
  89.     printLine(math.floor(_elapsed),0,0)
  90.     for k,v in pairs(tObj) do
  91.         if v.col and #v.col==3 then
  92.             love.graphics.setColor(unpack(v.col))
  93.         else
  94.             love.graphics.setColor(255,255,255)
  95.         end
  96.         love.graphics.circle("fill",v.pos[1],v.pos[2],v.radius,v.radius*math.pi)
  97.     end
  98. end
  99.  
  100. function love.run()
  101.  
  102.     math.randomseed(os.time())
  103.     math.random() math.random()
  104.  
  105.     if love.load then love.load(arg) end
  106.  
  107.     local dt = 0
  108.  
  109.     -- Main loop time.
  110.     while true do
  111.         -- Process events.
  112.         if love.event then
  113.             love.event.pump()
  114.             for e,a,b,c,d in love.event.poll() do
  115.                 if e == "quit" then
  116.                     if not love.quit or not love.quit() then
  117.                         if love.audio then
  118.                             love.audio.stop()
  119.                         end
  120.                         return
  121.                     end
  122.                 end
  123.                 love.handlers[e](a,b,c,d)
  124.             end
  125.         end
  126.  
  127.         -- Update dt, as we'll be passing it to update
  128.         if love.timer then
  129.             love.timer.step()
  130.             dt = love.timer.getDelta()
  131.         end
  132.  
  133.         -- Call update and draw
  134.         if love.update then
  135.             for run=1,math.floor(emulationSpeed/frameskip) do
  136.                 love.update(dt*frameskip/emulationSpeed)
  137.             end
  138.         end -- will pass 0 if love.timer is disabled
  139.         if love.graphics then
  140.             love.graphics.clear()
  141.             if love.draw then love.draw() end
  142.         end
  143.         if love.timer then love.timer.sleep(0.001) end
  144.         if love.graphics then love.graphics.present() end
  145.     end
  146. end
Advertisement
Add Comment
Please, Sign In to add comment