multiple copies bouncing off each other?
Blitz3D Forums/Blitz3D Programming/multiple copies bouncing off each other?
| ||
| does anyone have some code in which I can get multiple instances of an asteroid to bounce off each other? This is my code so far: Graphics3D 640,480,16,1 SetBuffer BackBuffer() SeedRnd (MilliSecs()) camera=CreateCamera () mainlight=CreateLight() LightColor mainlight,255,255,10 sublight=CreateLight() LightColor sublight,-255,-255,-255 indlight=CreateLight() LightColor indlight,255,0,255 point=CreatePivot() PositionEntity camera,0,100,0 PositionEntity mainlight,0,0,100 PositionEntity sublight,0,5,-0 PositionEntity indlight,0,0,-100 PositionEntity point,0,0,0 PointEntity camera,point PointEntity mainlight,point PointEntity sublight,point PointEntity indlight,point CameraViewport camera,0,0,viewx,viewy Const viewx=800,viewy=600 Type asteroid Field aster Field x# Field y# Field z# Field speedx# Field speedz# Field spin# Field life Field distance# End Type ;rockskin=LoadTexture("images/rocktext.bmp") rock=LoadMesh("images/rock1a.3ds") HideEntity rock For n=0 To 9 ast.asteroid=New asteroid ast\aster=CopyEntity(rock) ast\x#=Rnd(-50,50) ast\y#=0 ast\z#=Rnd(-50,50) ast\speedx#=Rnd(-.2,.2) ast\speedz#=Rnd(-.2,.2) ast\spin# = Rnd(-0.5,0.5) ast\life=5 PositionEntity ast\aster,ast\x#,ast\y#,ast\z# RotateEntity ast\aster,0,Rnd(0,359),0 ScaleEntity ast\aster,.5,.5,.5 mark=mark+1 Next ;Main Loop----------------- While Not KeyHit(1) ;Cls asteroidism() UpdateWorld RenderWorld Flip Wend End Function asteroidism() For ast.asteroid=Each asteroid TurnEntity ast\aster,ast\spin#,ast\spin#,ast\spin# TranslateEntity ast\aster,ast\speedx#,0,ast\speedz# If EntityZ#(ast\aster)>100 PositionEntity ast\aster,ast\x#,ast\y#,-100 EndIf If EntityX#(ast\aster)>120 PositionEntity ast\aster,-120,ast\y#,ast\z# EndIf If EntityZ#(ast\aster)<-100 PositionEntity ast\aster,ast\x#,ast\y#,100 EndIf If EntityX#(ast\aster)<-120 PositionEntity ast\aster,120,ast\y#,ast\z# EndIf Next End Function I can't seem to get it. Any help is of course much appreciated. |
| ||
Here's a crude, but effective way of performing bounce checks.Graphics3D 640,480
SetBuffer BackBuffer()
Collisions 1, 1, 1, 1
SeedRnd (MilliSecs())
camera=CreateCamera ()
mainlight=CreateLight()
LightColor mainlight,255,255,10
sublight=CreateLight()
LightColor sublight,-255,-255,-255
indlight=CreateLight()
LightColor indlight,255,0,255
point=CreatePivot()
PositionEntity camera,0,50,0
PositionEntity mainlight,0,0,100
PositionEntity sublight,0,5,-0
PositionEntity indlight,0,0,-100
PositionEntity point,0,0,0
PointEntity camera,point
PointEntity mainlight,point
PointEntity sublight,point
PointEntity indlight,point
CameraViewport camera,0,0,viewx,viewy
Const viewx=800,viewy=600
Type asteroid
Field PIVOT ; ADDED new field - pivot
Field aster
Field x#
Field y#
Field z#
Field speedx#
Field speedz#
Field spin#
Field life
Field distance#
End Type
;rockskin=LoadTexture("images/rocktext.bmp")
rock=LoadMesh("images/rock1a.3ds")
EntityType rock, 1
HideEntity rock
For n=0 To 9
ast.asteroid=New asteroid
ast\PIVOT = CreatePivot()
ast\aster=CopyEntity(rock, ast\PIVOT)
ast\x#=Rnd(-50,50)
ast\y#=0
ast\z#=Rnd(-50,50)
ast\speedx#=Rnd(-.2,.2)
ast\speedz#=Rnd(-.2,.2)
ast\spin# = Rnd(-0.5,0.5)
ast\life=5
PositionEntity ast\PIVOT,ast\x#,ast\y#,ast\z#
RotateEntity ast\PIVOT,0,Rnd(0,359),0
ScaleEntity ast\aster,.5,.5,.5
mark=mark+1
Next
;Main Loop-----------------
While Not KeyHit(1)
;Cls
asteroidism
UpdateWorld
CheckCollisions ; COLLISION CHECKS
RenderWorld
Flip
Wend
End
Function asteroidism()
For ast.asteroid=Each asteroid
TurnEntity ast\aster,ast\spin#,ast\spin#,ast\spin#
MoveEntity ast\PIVOT, 0, 0, ast\speedz#
If EntityZ#(ast\aster)>100
PositionEntity ast\PIVOT,ast\x#,ast\y#,-100
EndIf
If EntityX#(ast\aster)>120
PositionEntity ast\PIVOT,-120,ast\y#,ast\z#
EndIf
If EntityZ#(ast\aster)<-100
PositionEntity ast\PIVOT,ast\x#,ast\y#,100
EndIf
If EntityX#(ast\aster)<-120
PositionEntity ast\PIVOT,120,ast\y#,ast\z#
EndIf
Next
End Function
Function CheckCollisions()
For ast.asteroid = Each asteroid
For I = 1 To CountCollisions(ast\aster)
coll_ent = CollisionEntity(ast\aster, I)
a2.asteroid = GetAsteroid(coll_ent)
; DO NOTHING IF ENTITY WASNT AN ASTEROID
If a2 <> Null
yaw1# = EntityYaw#(ast\PIVOT,1)
yaw2# = EntityYaw#(a2\PIVOT,1)
; A VERY crude bounce mechanism. You'll probably want
; to code a better system.
If yaw1# <= 90
yaw1# = yaw1# + 90
Else
yaw1# = yaw1# - 90
EndIf
If yaw2# <= 90
yaw2# = yaw2# + 90
Else
yaw2# = yaw2# - 90
EndIf
RotateEntity ast\PIVOT, EntityPitch#(ast\PIVOT,1), Yaw1#, EntityRoll#(ast\PIVOT,1)
RotateEntity a2\PIVOT, EntityPitch#(a2\PIVOT,1), Yaw2#, EntityRoll#(a2\PIVOT,1)
EndIf
Next
Next
End Function
Function GetAsteroid.asteroid( mesh )
For ast.asteroid = Each asteroid
If ast\aster = mesh Then Return ast
Next
Return Null
End FunctionNotice first off, that instead of moving the asteroid itself I am moving the pivot it is parented to. I have also replaced TranslateEntity with MoveEntity. The reason for this is to allow the rotation of the pivot itself to dictate the direction of the asteroid. This way, by altering a single value (the pivots Yaw) you can change the direction of the asteroid. |
| ||
| This code doesn't seem to work. It actually seems to lock up my computer. Thanks anyway. |
| ||
| Here's a couple of links that might be useful to you: http://www.blitzbasic.com/codearcs/codearcs.php?code=751 http://www.blitzbasic.com/Community/posts.php?topic=27098 |
| ||
| Are you using it as-is or modifying it to fit your code? I have tested the above code and it works fine on my system. |