|
source_type - collision type of the moving entities to be checked destination_type - collision type of the entities they collide with method - collision detection method 1: ellipsoid-to-ellipsoid 2: ellipsoid-to-polygon 3: ellipsoid-to-box response - what the source entity does when a collision occurs 1: stop 2: slide - full sliding collision 3: slide, but never slide down slopes |
|
Registers a collision pair: entities of one collision type will collide with entities of another. This command only sets up the rule - the actual checking and response happen inside UpdateWorld, each time you call it. Collision types are just numbers you invent and hand out with EntityType: give the player type 1, the scenery type 2, then Collisions 1,2,2,2 makes the player slide along the level like a proper walking character. Collision checking is always ellipsoid-to-something, so every source entity needs an EntityRadius. What the destination needs depends on the method: ellipsoid-to-ellipsoid (1) needs destinations with an EntityRadius too; ellipsoid-to-box (3) needs destinations with an EntityBox; ellipsoid-to-polygon (2) needs nothing extra - the destination's actual mesh triangles are used. The response decides what the mover does on contact: stop dead (1), slide along the obstacle (2), or slide without ever being pushed down a slope (3). The pair is one-way: sources are tested as they move, so give the moving things the source role. An entity that did not move this step triggers no collisions of its own - though it still records being hit by movers. Registering the same source/destination pair again does nothing: the first method and response stick until you wipe the registered pairs with ClearCollisions and register afresh. See also: EntityType, EntityRadius, EntityBox, UpdateWorld, ClearCollisions, CountCollisions. |
; Collisions Example
; ------------------
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
; Collision type ids
type_player=1
type_scenery=2
; NOTE: fixed overhead camera - the arrow keys steer the PLAYER, not the camera
camera=CreateCamera()
PositionEntity camera,0,13,-13
RotateEntity camera,45,0,0
light=CreateLight()
RotateEntity light,60,30,0
floor=CreatePlane()
EntityColor floor,70,110,70
; The player ball is the collision SOURCE, so it needs an ellipsoid radius
player=CreateSphere()
EntityColor player,220,60,60
PositionEntity player,0,1,-4
EntityRadius player,1
EntityType player,type_player
; Three crates. They are given radius AND box data so that every collision
; method has the information it needs on the destination side.
crate1=CreateCube()
ScaleEntity crate1,1.2,1.2,1.2
PositionEntity crate1,-4,1.2,4
EntityColor crate1,200,160,60
EntityType crate1,type_scenery
EntityRadius crate1,1.7
EntityBox crate1,-1.2,-1.2,-1.2,2.4,2.4,2.4
crate2=CreateCube()
ScaleEntity crate2,1.2,1.2,1.2
PositionEntity crate2,0,1.2,4
EntityColor crate2,200,160,60
EntityType crate2,type_scenery
EntityRadius crate2,1.7
EntityBox crate2,-1.2,-1.2,-1.2,2.4,2.4,2.4
crate3=CreateCube()
ScaleEntity crate3,1.2,1.2,1.2
PositionEntity crate3,4,1.2,4
EntityColor crate3,200,160,60
EntityType crate3,type_scenery
EntityRadius crate3,1.7
EntityBox crate3,-1.2,-1.2,-1.2,2.4,2.4,2.4
method=2
response=2
method_name$="ellipsoid-to-polygon"
response_name$="slide"
While Not KeyDown(1)
; Arrow keys steer the player ball
If KeyDown(200) Then MoveEntity player,0,0,0.1
If KeyDown(208) Then MoveEntity player,0,0,-0.1
If KeyDown(203) Then MoveEntity player,-0.1,0,0
If KeyDown(205) Then MoveEntity player,0.1,0,0
; M cycles the collision method, R cycles the response
If KeyHit(50)
method=method+1
If method>3 Then method=1
If method=1 Then method_name$="ellipsoid-to-ellipsoid"
If method=2 Then method_name$="ellipsoid-to-polygon"
If method=3 Then method_name$="ellipsoid-to-box"
EndIf
If KeyHit(19)
response=response+1
If response>3 Then response=1
If response=1 Then response_name$="stop"
If response=2 Then response_name$="slide"
If response=3 Then response_name$="slide, but never down slopes"
EndIf
; The star of the show: register collisions between the two types
Collisions type_player,type_scenery,method,response
; UpdateWorld performs the collision checks and responses
UpdateWorld
RenderWorld
Text 0,0,"Arrow keys: drive the ball M: method R: response Esc: exit"
Text 0,20,"Collisions type_player,type_scenery,"+method+","+response
Text 0,40,"Method "+method+": "+method_name$+" Response "+response+": "+response_name$
Text 0,60,"Brush a crate corner with each method - sphere, exact mesh or box"
Flip
Wend
End