monkey2 icon indicating copy to clipboard operation
monkey2 copied to clipboard

Physics request: allow pausing [update: with solution]

Open DruggedBunny opened this issue 7 years ago • 2 comments

I'm trying to find a way to pause the physics simulation, but it looks like at present I'm going to have to iterate through all bodies and set their velocities/torques manually (and store these so I can un-pause!).

While digging around, I found this solution by another project using Bullet.

Little bit later: this seems to work with minor hacking to world.monkey2 as below:

	Property TimeScale:Float ()
		Return timescale
		Setter (new_timescale:Float)
			timescale = new_timescale
	End
	' (Private)
	Field timescale:Float = 1.0

	...

	Method Update( elapsed:Float )
		
		resetCollisions()
		
		_btworld.stepSimulation( elapsed,_scene.MaxSubSteps,timescale * 1.0/_scene.UpdateRate )

... then in my game I just call:

		If Keyboard.KeyHit (Key.P)
			Game.GameScene.World.TimeScale = Not Game.GameScene.World.TimeScale
		Endif

... and it pauses/unpauses nicely. Can even do super slowmo and that seems to work well too!

		If Keyboard.KeyHit (Key.Minus)
			Game.GameScene.World.TimeScale = Game.GameScene.World.TimeScale * 0.5
		Endif

(Actually, looks like I need to store timescale before pausing, as Not timescale always restores to 1.0 regardless of reduced scale before Not timescale.)

DruggedBunny avatar Sep 19 '18 13:09 DruggedBunny

I've tweaked UpdateRate so setting it to 0 can be used to pause updates, instead of just causing a divide by 0! eg:

If Keyboard.KeyHit(Key.Space) _scene.UpdateRate=_scene.UpdateRate ? 0 Else 60

I do like the TimeScale idea but will need to give it a bit more testing before adding it.

On Thu, Sep 20, 2018 at 1:38 AM DruggedBunny [email protected] wrote:

I'm trying to find a way to pause the physics simulation, but it looks like at present I'm going to have to iterate through all bodies and set their velocities/torques manually (and store these so I can un-pause!).

While digging around, I found this solution https://github.com/armory3d/armory/issues/755#issuecomment-403943912 by another project using Bullet.

Little bit later: this seems to work with minor hacking to world.monkey2 as below:

Property TimeScale:Float () Return timescale Setter (new_timescale:Float) timescale = new_timescale End ' (Private) Field timescale:Float = 1.0

...

Method Update( elapsed:Float )

  resetCollisions()
  
  _btworld.stepSimulation( elapsed,_scene.MaxSubSteps,timescale * 1.0/_scene.UpdateRate )

... then in my game I just call:

  If Keyboard.KeyHit (Key.P)
  	Game.GameScene.World.TimeScale = Not Game.GameScene.World.TimeScale
  Endif

... and it pauses/unpauses nicely. Can even do super slowmo and that seems to work well too!

  If Keyboard.KeyHit (Key.Minus)
  	Game.GameScene.World.TimeScale = Game.GameScene.World.TimeScale * 0.5
  Endif

(Actually, looks like I need to store timescale before pausing, as Not timescale always restores to 1.0 regardless of reduced scale before Not timescale.)

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/blitz-research/monkey2/issues/426, or mute the thread https://github.com/notifications/unsubscribe-auth/ADU3Qp2H-iq7nQEr4VCOyOIjtiuGdxFNks5ucki5gaJpZM4WwL_c .

blitz-research avatar Sep 22 '18 02:09 blitz-research

OK, cool... I have been using the timescale thing to pause (though now sidetracked into writing an audio mixer thing so I can pause/resume all channels in the correct state), and to slow the scene down on dying, and it does seem fine -- my explosions seem to work exactly the same on hitting terrain, for example, just in cool slo-mo. I noticed anything above 1.0 is capped at 1.0, so seems to accept 0.0 - 1.0 only, but it's definitely a nice effect to have.

DruggedBunny avatar Sep 22 '18 10:09 DruggedBunny