| world - a current physics world handle |
|
Returns the number of joint overload events copied from the world's most recent StepPhysics. Initially zero. Each joint is reported at most once per step if its solved load reached either enabled threshold. The count and index order remain stable until the next step, including while scripts delete joints. This is an event batch, not the number of joints currently overloaded. Native event order is not an application ordering guarantee. Invalid, stale or wrong-kind handles raise a runtime error. See also: PhysicsJointSpring, PhysicsJointFrame, PhysicsJointThresholds, PhysicsJointEventJoint, StepPhysics. |
; CountPhysicsJointEvents Example
; -------------------------------
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2
camera=CreateCamera()
PositionEntity camera,0,3,-7
RotateEntity camera,20,0,0
light=CreateLight()
RotateEntity light,45,-30,0
AmbientLight 60,60,60
; An independent Box3D world with standard gravity
world=CreatePhysicsWorld()
; Blue static floor
ground=CreateCube()
ScaleEntity ground,6,0.5,6
PositionEntity ground,0,-0.5,0
EntityColor ground,80,160,255
ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC)
ground_shape=PhysicsBodyBox(ground_body,12,1,12)
; A static post, and a door hinged to it on a vertical axis
post=CreateCube()
ScaleEntity post,0.1,1.5,0.1
PositionEntity post,-1.5,1.5,0
EntityColor post,150,150,160
post_body=CreatePhysicsBody(world,post,PHYSICS_STATIC)
post_shape=PhysicsBodyBox(post_body,0.2,3,0.2)
door=CreateCube()
ScaleEntity door,1.2,1.4,0.05
PositionEntity door,-0.2,1.5,0
EntityColor door,255,120,70
door_body=CreatePhysicsBody(world,door,PHYSICS_DYNAMIC)
door_shape=PhysicsBodyBox(door_body,2.4,2.8,0.1)
PhysicsBodyDamping door_body,0,1
hinge=CreatePhysicsHingeJoint(post_body,door_body,-1.4,1.5,0,0,1,0)
; Report overloads above 12 N or 12 N m, for example when the door slams
PhysicsJointThresholds hinge,12,12
SetPhysicsJointTag hinge,7
PhysicsJointLimits hinge,True,-Pi/4,Pi/4
While Not KeyDown(1)
; Space pushes the far edge of the door
If KeyHit(57)
TFormPoint 1,0,0,door,0
PhysicsBodyImpulseAt door_body,0,0,2,TFormedX(),TFormedY(),TFormedZ()
EndIf
StepPhysics world,1.0/60.0,4
; Count the overloads reported by the last step
events=CountPhysicsJointEvents(world)
If events>0 Then total=total+events
; Flash the door red for a moment after each overload event
If CountPhysicsJointEvents(world)>0 Then flash=20
If flash>0
flash=flash-1
EntityColor door,255,40,40
Else
EntityColor door,255,120,70
EndIf
; 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: push Esc: exit"
Text 0,20,"CountPhysicsJointEvents(world) = "+events+" (overloads so far: "+total+")"
Flip
Wend
FreePhysicsWorld world
End