| query - query handle |
|
Returns True for a current query handle and False for zero, wrong-kind, freed or stale handles. This validity probe does not raise an error for invalid handles. Query handles are invalidated by FreePhysicsQuery, owning-world destruction, and runtime reset. See also: CreatePhysicsQuery, PhysicsQueryFilter, PhysicsQueryTarget, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit. |
; PhysicsQueryValid Example
; -------------------------
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2
camera=CreateCamera()
PositionEntity camera,0,7,-8
RotateEntity camera,40,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 ring of crates to aim at
For i=1 To 8
crate=CreateCube()
ScaleEntity crate,0.5,0.5,0.5
PositionEntity crate,Cos(i*45)*4,0.5,Sin(i*45)*4
EntityColor crate,255,120,70
crate_body=CreatePhysicsBody(world,crate,PHYSICS_STATIC)
crate_shape=PhysicsBodyBox(crate_body,1,1,1)
Next
; A query object runs searches and keeps a copy of their results
query=CreatePhysicsQuery(world)
; Start aimed at a crate
angle#=45
While Not KeyDown(1)
; A and D sweep the ray around the centre
If KeyDown(30) Then angle=angle+1.5
If KeyDown(32) Then angle=angle-1.5
dx#=Cos(angle)*6
dz#=Sin(angle)*6
; Q frees the query, or creates a new one
If KeyHit(16)
If PhysicsQueryValid(query)
FreePhysicsQuery query
Else
query=CreatePhysicsQuery(world)
EndIf
EndIf
StepPhysics world,1.0/60.0,4
; Only search with a live query
hits=0
If PhysicsQueryValid(query) Then hits=QueryPhysicsRay(query,0,0.5,0,dx,0,dz)
; 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
; Draw the ray from the centre to the first hit, or to its full length
CameraProject camera,0,0.5,0
start_x=ProjectedX()
start_y=ProjectedY()
If hits>0
CameraProject camera,PhysicsQueryX(query,1),PhysicsQueryY(query,1),PhysicsQueryZ(query,1)
Else
CameraProject camera,dx,0.5,dz
EndIf
Line start_x,start_y,ProjectedX(),ProjectedY()
Text 0,0,"Arrow keys: move camera A / D: sweep the ray Q: free / create Esc: exit"
Text 0,20,"PhysicsQueryValid(query) = "+PhysicsQueryValid(query)
Flip
Wend
FreePhysicsWorld world
End