Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- emulationSpeed=3000
- frameskip=100
- G=6.67384*10^-11 --N(m/kg)^2
- obj_mt={}
- obj_mt.compare=function(self,obj)
- if self.pos and obj.pos then
- 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]))
- end
- end
- obj_mt.finishUpdateV=function(self)
- for i=1,2 do
- 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
- self.newVel[i]=-self.newVel[i]*0.8
- end
- self.vel[i]=self.newVel[i] or self.vel[i]
- end
- end
- obj_mt.updateV=function(self,nSpeed)
- if type(self.mass)=="number" then
- for k,v in pairs(tObj) do
- self:finishUpdateV()
- end
- for k,v in pairs(tObj) do
- local dist,ang,vAng=self:compare(v)
- if v~=self and type(v.mass)=="number" and type(dist)=="number" then
- if dist>self.radius+v.radius then
- local nForce=(G*self.mass*v.mass)/dist^2
- local xF,yF=math.cos(ang)*nForce,math.sin(ang)*nForce
- self.newVel[1]=self.newVel[1]+xF*(nSpeed or 1)/self.mass
- self.newVel[2]=self.newVel[2]+yF*(nSpeed or 1)/self.mass
- elseif math.abs((vAng-ang+math.pi)%(2*math.pi)-math.pi)<=math.pi/2 then
- local combinedXVel,combinedYVel=(self.newVel[1]+v.vel[1])/2,(self.newVel[2]+v.vel[2])/2
- local relativeVel=((self.newVel[1]-v.vel[1])^2+(self.newVel[2]-v.vel[2])^2)^0.5
- local velTowardsObj,velLeftObj=math.cos(ang-vAng)*relativeVel,math.sin(ang-vAng)*relativeVel
- self.newVel[1]=(math.cos(ang+math.pi)*velTowardsObj+math.cos(ang-math.pi/2)*velLeftObj)/2*0.8+combinedXVel
- self.newVel[2]=(math.sin(ang+math.pi)*velTowardsObj+math.sin(ang-math.pi/2)*velLeftObj)/2*0.8+combinedYVel
- end
- end
- end
- end
- end
- obj_mt.updateP=function(self,nSpeed)
- self:finishUpdateV()
- self.pos[1]=(self.newPos[1] or self.pos[1])+self.vel[1]*(nSpeed or 1)
- self.pos[2]=(self.newPos[1] or self.pos[2])+self.vel[2]*(nSpeed or 1)
- end
- function love.load()
- _elapsed=0
- tObj=setmetatable({},{
- __newindex=function(self,index,value)
- rawset(self,index,type(value)=="table" and setmetatable(value,{__index=function(self,index) return obj_mt[index] end}) or value)
- end
- })
- tObj[1]={pos={100,100},vel={},mass=500000,radius=10,col={255,0,0},newPos={},newVel={0.0002,0}}
- tObj[2]={pos={100,200},vel={},mass=500000,radius=10,col={0,255,0},newPos={},newVel={-0.0002,0}}
- tObj[3]={pos={150,200},vel={},mass=500000,radius=10,col={0,0,255},newPos={},newVel={0.00005,0}}
- --tObj[4]={pos={150,500},vel={},mass=500000,radius=5,col={255,0,255},newPos={},newVel={0.00005,0}}
- end
- function love.update(dt)
- if not bPaused then
- _elapsed=_elapsed+dt
- for k,v in pairs(tObj) do
- v:updateV(frameskip)
- end
- for k,v in pairs(tObj) do
- v:updateP(frameskip)
- end
- end
- end
- function printLine(sText)
- sText=tostring(sText)
- if type(sText)=="string" then
- love.graphics.print(sText,0,at)
- end
- at=at+12
- end
- function love.draw()
- at=0
- love.graphics.setColor(255,255,255)
- printLine(math.floor(_elapsed),0,0)
- for k,v in pairs(tObj) do
- if v.col and #v.col==3 then
- love.graphics.setColor(unpack(v.col))
- else
- love.graphics.setColor(255,255,255)
- end
- love.graphics.circle("fill",v.pos[1],v.pos[2],v.radius,v.radius*math.pi)
- end
- end
- function love.run()
- math.randomseed(os.time())
- math.random() math.random()
- if love.load then love.load(arg) end
- local dt = 0
- -- Main loop time.
- while true do
- -- Process events.
- if love.event then
- love.event.pump()
- for e,a,b,c,d in love.event.poll() do
- if e == "quit" then
- if not love.quit or not love.quit() then
- if love.audio then
- love.audio.stop()
- end
- return
- end
- end
- love.handlers[e](a,b,c,d)
- end
- end
- -- Update dt, as we'll be passing it to update
- if love.timer then
- love.timer.step()
- dt = love.timer.getDelta()
- end
- -- Call update and draw
- if love.update then
- for run=1,math.floor(emulationSpeed/frameskip) do
- love.update(dt*frameskip/emulationSpeed)
- end
- end -- will pass 0 if love.timer is disabled
- if love.graphics then
- love.graphics.clear()
- if love.draw then love.draw() end
- end
- if love.timer then love.timer.sleep(0.001) end
- if love.graphics then love.graphics.present() end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment