PhysicsBodyIsAwake ( body )

Parameters

body - physics-body handle returned by CreatePhysicsBody

Description

Returns True while a body is awake and actively simulating.

To save CPU, Box3D puts dynamic bodies to sleep once they have been nearly still (below roughly 0.05 metres per second) for a little while. Sleeping bodies cost almost nothing and wake automatically when something touches them or when you apply a force, an impulse or a new velocity.

This query lets you piggyback on that logic: skip per-body game logic for props that are asleep, wait for a tower of crates to settle before scoring the throw, or tint debug visuals by sleep state to see what the simulation is really spending time on.


See also: StepPhysics, PhysicsBodyVelocity, PhysicsBodyForce, PhysicsBodyImpulse.

Example

; PhysicsBodyIsAwake Example
; --------------------------

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2

camera=CreateCamera()
PositionEntity camera,0,3,-9

light=CreateLight()
RotateEntity light,45,-30,0
AmbientLight 50,50,50

; Independent Box3D world with Earth-like gravity
world=CreatePhysicsWorld()
PhysicsGravity world,0,-9.81,0

; Blue static ground slab
ground=CreateCube()
ScaleEntity ground,4,0.5,4
PositionEntity ground,0,-0.5,0,True
EntityColor ground,80,160,255
ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC)
ground_shape=PhysicsBodyBox(ground_body,8,1,8,0)

; Ball dropped from above - it settles, then falls asleep
ball=CreateSphere()
ScaleEntity ball,0.5,0.5,0.5
PositionEntity ball,0,3,0,True
EntityColor ball,255,120,70
ball_body=CreatePhysicsBody(world,ball,PHYSICS_DYNAMIC)
ball_shape=PhysicsBodySphere(ball_body,1,1)
PhysicsShapeRestitution ball_shape,0.3

While Not KeyDown(1)

    ; Space kicks the ball, which also wakes a sleeping body
    If KeyHit(57) Then PhysicsBodyImpulse ball_body,0,2,0

    ; Advance the Box3D simulation by one 60 Hz step
    StepPhysics world,1.0/60.0,4

    ; Poll the sleep state and colour the ball to match
    awake=PhysicsBodyIsAwake(ball_body)
    If awake Then EntityColor ball,255,120,70 Else EntityColor ball,150,150,150

    ; Arrow keys move the camera
    If KeyDown(200) Then MoveEntity camera,0,0,0.1
    If KeyDown(208) Then MoveEntity camera,0,0,-0.1
    If KeyDown(203) Then TurnEntity camera,0,1,0
    If KeyDown(205) Then TurnEntity camera,0,-1,0

    RenderWorld

    Text 0,0,"Arrow keys: move camera   Space: wake the ball   Esc: exit"
    If awake
        Text 0,20,"PhysicsBodyIsAwake = "+awake+"   (orange = simulating)"
    Else
        Text 0,20,"PhysicsBodyIsAwake = "+awake+"   (grey = asleep, let it settle)"
    EndIf

    Flip

Wend

FreePhysicsWorld world
FreeEntity ball
FreeEntity ground
End

Index