entity pick

Blitz3D Forums/Blitz3D Beginners Area/entity pick

How do you tell whether a particular entity is picked or not? I tried doing this but it doesn't work.

EntityPickMode e\shape,1


If weaponout=1
picked=CameraPick(camera,378,278)
If picked<>0 Then
makehole(hole,holes)
makespark(spark,sparks)
EndIf

If picked=1
ShowEntity ball
EntityShininess ball,1
EntityColor ball,200,0,0
ScaleEntity ball,1,1,1
PositionEntity ball,PickedX(),PickedY(),PickedZ(),True
EntityType ball,1
Animate ball,3,.2
UpdateWorld()
EndIf
EndIf

try EntityPickMode e\shape,2

also, why are you giving absolute coordinates to camerapick, try using MouseX and MouseY ?

also, why are you giving absolute coordinates to camerapick, try using MouseX and MouseY ?


That would only apply if he's picking at the mouse pointer position. If he's picking at the position of a stationary crosshair, for example, and using a fixed viewport size, using absolute coordinates should be no problem.

true... however, if no entity is at those coords the pick won't work.

Also, just noticed, this is wrong:

if picked = 1

camerapick returns an object handle, or 0

Yes, use

If Picked or If Picked > 0

Why are you calling update world conditionally? This should be in your main render loop.

The variable e\shape is assigned to a sphere (eventually to be replaced with a model) in a separate function. I tried setting its pickmode to -2 and the environments pickmode to 2 like this:

Function
e\shape=createsphere()
EntityPickMode e\shape,-2
EntityPickMode city1,2
blah blah blah
End Function

Function
If weaponout=1
picked=CameraPick(camera,378,278)
If picked>0 Then
makehole(hole,holes)
makespark(spark,sparks)
EndIf

If picked<0
ShowEntity ball
EntityShininess ball,1
EntityColor ball,200,0,0
ScaleEntity ball,1,1,1
PositionEntity ball,PickedX(),PickedY(),PickedZ(),True
EntityType ball,1
Animate ball,3,.2
EndIf
EndIf
End Function

I still get no response when I shoot the sphere.

you want picked > 0

oops you have that... not sure.

post entire code

Picked can never be < 0 as it will either return 0 or an integer reference to the picked mesh.

You can't set the pickmode to -2 as this is not a recognised option. The mode must be > 0 for this to work.

Post some working code and someone will fix it for you.

Stevie

This code works, I need to generate the "blood sphere" at the location of the picked sphere but I can only seem to pick the environment.

Graphics3D 800,600,32,1
Dither True
AntiAlias True
BackBuffer()


Type enemy
Field X
Field Y
Field Z
Field shape
End Type

Global pistolselected=0
Global Gravity# = -.5
Global WalkSpeed#=.5
Global FlyMode=0
Global weaponout=0
Global pistolammo=15
Global CamPivot = CreatePivot( )
Global Camera = CreateCamera( )
PositionEntity CamPivot,1010,50,1010
EntityType CamPivot, 1
EntityRadius CamPivot, 3
EntityType Camera, 1
EntityRadius Camera, 2
Global pistol=CreateCylinder()
EntityParent pistol,camera
PositionEntity pistol,EntityX(Camera)+1.5,EntityY(Camera)-2,EntityZ(Camera)+2
RotateEntity pistol,100,0,0
HideEntity pistol
Global muzzleglow2=CreateLight(pistol)
LightRange muzzleglow2,.0005
HideEntity muzzleglow2
LightColor muzzleglow2,255,255,0

Global t=0

Collisions 1,2,2,3

Function Loadlevel1()

light=CreateLight(2)
PositionEntity light,600,100,600
RotateEntity light,90,0,0
LightColor light,100,255,255

terrain=CreateTerrain(32)
PositionEntity terrain,0,-.02,0
ScaleEntity terrain,50,20,50
EntityType terrain,2
EntityPickMode terrain,2

city1=CreateCube()
PositionEntity city1,1000,1.5,1000
EntityType city1,2
EntityPickMode city1,2
ScaleEntity city1,50,20,50

enemies=0

SeedRnd 4

Repeat
e.enemy=New enemy
e\x=Rnd(1,1000)
e\y=4
e\z=Rnd(1,1000)
e\shape=CreateSphere()
PositionEntity e\shape,e\x,e\y,e\z
ScaleEntity e\shape,4,4,4
EntityType e\shape,3
EntityPickMode e\shape,3
enemies=enemies+1
Until enemies=10

CameraRange Camera,.2,1000
CameraFogMode Camera,1
CameraFogRange Camera,.2,999
CameraFogColor Camera,19,164,149
CameraClsColor Camera,0,255,255

While Not KeyHit(1)
controls()
Wend

Return
End Function

Function controls()

Color 255,0,0

If pistolselected=1
WritePixel 355,255,0
EndIf

If KeyDown( 42 ) =1
WalkSpeed# = 1.5
Else
WalkSpeed# = .5
EndIf

If KeyHit(2)
ShowEntity pistol
pistolselected=1
weaponout=1
End If

If FlyMode=0
If KeyDown(17) =1 Then MoveEntity CamPivot, 0, 0, WalkSpeed#
If KeyDown(31) =1 Then MoveEntity CamPivot, 0, 0, 0-WalkSpeed#
PositionEntity Camera, EntityX#( CamPivot ), EntityY#( CamPivot )+8, EntityZ#( CamPivot )
EndIf

If KeyDown(30) =1 Then MoveEntity CamPivot, -1, 0, 0
If KeyDown(32) =1 Then MoveEntity CamPivot, 1, 0, 0

If EntityCollided(CamPivot,2)
Gravity#=0
Else
Gravity#=-.5
EndIf

TranslateEntity CamPivot, 0, Gravity#, 0

TurnEntity CamPivot, 0, 0 -MouseXSpeed(), 0

TurnEntity Camera, MouseYSpeed(), 0, 0

RotateEntity CamPivot, EntityPitch#( CamPivot ), EntityYaw#( CamPivot ), 0

MoveMouse GraphicsWidth()/2, GraphicsHeight()/2

RotateEntity Camera, EntityPitch#( Camera ), EntityYaw#( CamPivot ), 0

If MouseHit(1)And pistolselected=1 And pistolammo>0
createbullet()
pistolammo=pistolammo-1
EndIf

If t=1
Text 0,20,"Enviroment picked"
EndIf

Text 0,40,"Press 1 to pull out pistol, aim with the dot"

Flip

UpdateWorld()

RenderWorld

HideEntity muzzleglow2

Return
ClearCollisions
End Function

Function createbullet( )

If pistolselected=1
ShowEntity muzzleglow2
EndIf

If weaponout=1
picked=CameraPick(camera,378,278)
If picked>1 Then
t=1
EndIf

If picked<2
blood=CreateSphere()
ShowEntity blood
EntityShininess blood,1
EntityColor blood,200,0,0
ScaleEntity blood,1,1,1
PositionEntity blood,PickedX(),PickedY(),PickedZ()
EntityType blood,1
EndIf

EndIf
End Function

not sure exactly what you are trying to achieve as I havent read the entire post, however.

to make an entity NON pickable set entitypickmode to 0
else use entitypickmode,2 for most situations.

example

create a level called level1 and an enemy called enemy.

do your camerapick then

if pick=something non pickable goto endofpick

if pick-level1 then

do something

if pick=enemy
then do something else

.endofpick


to show a sprite where you picked like a bullethole or similar, use something like below to position the sprite
obviously the "whatever" will be referenced as a type for the sprite loaded earlier. Hope this makes some sense.

positionentity whatever,PickedX(),PickedY(),PickedZ()

aligntovector whatever,-PickedNX(),-PickedNY(),-PickedNZ(),3

That's pretty much what I have already, only I don't use a goto. The problem is to tell the difference between the environment and the enemy. Their pickmodes are different, but it always seems to choose the environment. The code works (its only a mock up of first level, the cylinder used to be an animated arm with a handgun, for example) you can run it to see what I mean about the pickmode. The real game also has bullet holes and sparks.

You code is a mess so I've tidied it up a bit. You should really be using indentation to make it more readable. Anyway, this is what you want ( I think ) ..

Graphics3D 800,600,32,1
Dither True
AntiAlias True
BackBuffer()


Type enemy
	Field ID
	Field X
	Field Y
	Field Z
	Field shape 
End Type

Global pistolselected=0
Global Gravity# = -.5 
Global WalkSpeed#=.5 
Global FlyMode=0
Global weaponout=0
Global pistolammo=15
Global CamPivot = CreatePivot( ) 
Global Camera = CreateCamera( )
PositionEntity CamPivot,1010,50,1010 
EntityType CamPivot, 1
EntityRadius CamPivot, 3
EntityType Camera, 1
EntityRadius Camera, 2
Global pistol=CreateCylinder()
EntityParent pistol,camera
PositionEntity pistol,EntityX(Camera)+1.5,EntityY(Camera)-2,EntityZ(Camera)+2 
RotateEntity pistol,100,0,0
HideEntity pistol
Global muzzleglow2=CreateLight(pistol)
LightRange muzzleglow2,.0005 
HideEntity muzzleglow2 
LightColor muzzleglow2,255,255,0

Global city1, terrain, t$

Collisions 1,2,2,3


LoadLevel1()

While Not KeyDown(1)

	Controls()
	
Wend


;=====================================================================================
;=====================================================================================
;=====================================================================================
;=====================================================================================
;=====================================================================================
;=====================================================================================

Function Loadlevel1()

	light=CreateLight(2)
	PositionEntity light,600,100,600
	RotateEntity light,90,0,0 
	LightColor light,100,255,255
	
	terrain=CreateTerrain(32)
	PositionEntity terrain,0,-.02,0
	ScaleEntity terrain,50,20,50
	EntityType terrain,2
	EntityPickMode terrain,2
	
	city1=CreateCube()
	PositionEntity city1,1000,1.5,1000
	EntityType city1,2
	EntityPickMode city1,2
	ScaleEntity city1,50,20,50
	
	SeedRnd 4
	For enemies = 1 To 10
		e.enemy=New enemy
		e\ID = enemies
		e\x=Rnd(1,1000)
		e\y=4
		e\z=Rnd(1,1000)
		e\shape=CreateSphere()
		PositionEntity e\shape,e\x,e\y,e\z
		ScaleEntity e\shape,4,4,4
		EntityType e\shape,3
		EntityRadius e\shape, 4
		EntityPickMode e\shape,1
		NameEntity e\shape, Handle(e)
	Next
	
	CameraRange Camera,.2,1000
	CameraFogMode Camera,1
	CameraFogRange Camera,.2,999
	CameraFogColor Camera,19,164,149
	CameraClsColor Camera,0,255,255
	
End Function

;=====================================================================================
;=====================================================================================
;=====================================================================================

Function controls()
	
	If KeyDown( 42 ) =1 
		WalkSpeed# = 1.5
	Else
		WalkSpeed# = .5
	EndIf
	
	If KeyHit(2)
		ShowEntity pistol
		pistolselected=1
		weaponout=1 
	End If
	
	If FlyMode=0
		If KeyDown(17) =1 Then MoveEntity CamPivot, 0, 0, WalkSpeed# 
		If KeyDown(31) =1 Then MoveEntity CamPivot, 0, 0, 0-WalkSpeed#
		PositionEntity Camera, EntityX#( CamPivot ), EntityY#( CamPivot )+8, EntityZ#( CamPivot )
	EndIf
	
	If KeyDown(30) =1 Then MoveEntity CamPivot, -1, 0, 0
	If KeyDown(32) =1 Then MoveEntity CamPivot, 1, 0, 0 
	
	If EntityCollided(CamPivot,2)
		Gravity#=0
	Else
		Gravity#=-.5 
	EndIf
	
	TranslateEntity CamPivot, 0, Gravity#, 0
	TurnEntity CamPivot, 0, 0 -MouseXSpeed(), 0 
	TurnEntity Camera, MouseYSpeed(), 0, 0
	RotateEntity CamPivot, EntityPitch#( CamPivot ), EntityYaw#( CamPivot ), 0
	MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
	RotateEntity Camera, EntityPitch#( Camera ), EntityYaw#( CamPivot ), 0 
	
	If MouseHit(1) And pistolselected = 1 And pistolammo > 0
		createbullet()
		pistolammo=pistolammo-1
	EndIf

	UpdateWorld()
	RenderWorld()
	
	Color 255,0,255
	Text 0,20,"Picked : "+t$ 
	Text 0,40,"Press 1 to pull out pistol, aim with the dot" 
	
	;dot
	Color 255,0,0
	Rect 378-2,278-2,5,5,0
	
	Flip
	
	HideEntity muzzleglow2 
	
End Function

;=====================================================================================
;=====================================================================================
;=====================================================================================

Function createbullet( )

	ShowEntity muzzleglow2
	
	If weaponout = 1
	
		picked = CameraPick(camera,378,278)
		
		If Picked > 0 

			Select Picked
	
				Case City1
				
					t$ = "City1"
				
				Case Terrain
				
					t$ = "Terrain"
				
				Default
				
					t$ = "Enemy "
	
					blood=CreateSphere()
					ShowEntity blood
					EntityShininess blood,1
					EntityColor blood,200,0,0
					ScaleEntity blood,1,1,1
					PositionEntity blood,PickedX(),PickedY(),PickedZ()
					
					;get picked enemy type
					e.enemy = Object.enemy( EntityName( Picked ) )
					t$ = t$ + e\ID
					
			End Select
			
		Else
		
			t$ = "Nothing"
			
		EndIf
					
	EndIf

End Function 


Thanks. (Sorry about the indenting)