AI and collisions

Blitz3D Forums/Blitz3D Programming/AI and collisions

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Just wrote this, hope it is of some use. It dosnt use blitz collision system, but a simple math rutine instead:

Graphics3D 800,600,16,2

cam=CreateCamera()
RotateEntity cam,90,0,0
PositionEntity cam,0,50,0

;create player entity
player=CreateSphere()

;create 10 randomly positioned creatures, with random velocity aswell
For n=1 To 10
	creaturenew(Rnd(-20,20),0,Rnd(-20,20),Rnd(0.1,0.5))
Next

Repeat
	
	;make the creatures home in on player
	creatureupdate(EntityX(player),EntityY(player),EntityZ(player))
	
	;control player with mouse
	PositionEntity player,MouseX()/10-30,0,-MouseY()/10+30
	
	RenderWorld
	
	Text 400,0,"Control player with mouse",1,0
	Text 400,20,"Creatures will not slide into each other",1,0
	
	
	
	Flip
	
	
Until KeyDown(1)
End

Type creature

Field e ;entity

Field vel# ;velocity

End Type

Function CreatureNew(x#,y#,z#,vel#)
	
	c.creature=New creature
	
	c\e=CreateCube()
	
	c\vel=vel
	
	PositionEntity c\e,x,y,z
	
End Function

Function CreatureUpdate(x#,y#,z#,size#=2) ;size is 2 here as a created cube is 2 units wide
	
	For c.creature=Each creature
	
		;vector to x,y,z
		
		dx#=(x-EntityX(c\e))
		dy#=(y-EntityY(c\e))
		dz#=(z-EntityZ(c\e))
		
		;length of vector
		
		l#=Sqr(dx*dx+dy*dy+dz*dz)
		
		;make the vector a unit vector, length = 1
		
		dx=dx/l
		dy=dy/l
		dz=dz/l
		
		TranslateEntity c\e,dx*c\vel,dy*c\vel,dz*c\vel
		
		For cc.creature=Each creature
			
			;do not test against it self
			If cc<>c
			
				;vector to another enemy
				dx#=(EntityX(cc\e)-EntityX(c\e))
				dy#=(EntityY(cc\e)-EntityY(c\e))
				dz#=(EntityZ(cc\e)-EntityZ(c\e))
				
				;length of vector
				
				l#=Sqr(dx*dx+dy*dy+dz*dz)
				
				
				;enemies collide if they er within range:
				
				If l<size
					
					;make the vector a unit vector, length = 1
					
					dx=dx/l
					dy=dy/l
					dz=dz/l
					
					TranslateEntity c\e,-dx*c\vel,-dy*c\vel,-dz*c\vel
					
				EndIf
					
			EndIf
			
		Next
		
	Next
	
End Function