reposition entity on trigger hit

Blitz3D Forums/Blitz3D Programming/reposition entity on trigger hit

I suppose this is kind of like a portals problem. But it really isn't.

I have a snall FPS. I have a pair of switch entitys (cubes) that when HIT hide and show various levels of the game. You go from outside to inside here.

Trigger 1 is just inside the old church... when you hit it you hear a door slam sound and the mesh is changed. You don't see the mesh change but it does.

This works FINE.

On the crypt level there is a second trigger that teleports you back outside to the start point (for now) It hides all the crypt stuff and replaces the ground plane.

This ALMOST works fine.

It hides and shows all that it is supposed to show.

BUT it won't reposition the camera entity. The camera stays where it was when it hit the second switch.

I have tried telling it to move the camera before it does anythig else.

I have tried setting up a variable that would move the camera from withon the body of the main program.

I am stumped... Why won't the camera move to the new location?

-RZ

I'll bet your camera has collisions applied, right?

PositionEntity still lets collisions happen.

try a "ResetEntity camera" after you've repositioned the camera..

resetentity does reset the collisions... but the camera will not reposition... I can't figure out a teleport effect.

OK collisions ar counted for the camera. Do you think I need to count them for a player entity and try to move that and make the camera a child of the player? Would repositioning a player be easier?

I did this simple code to illustrate... BUT the simple code works...
; TELEPORT THINGEE
; Ralph Dunn
; -------------------

Graphics3D 800,600
SetBuffer BackBuffer()
SeedRnd (MilliSecs())

campiv = CreatePivot()
Global camera = CreateCamera(campiv)
floorpivot=CreatePivot()
PositionEntity camera,0,12,0
CameraRange camera,.1,2500
CameraFogRange camera,25,1300
EntityRadius camera,5,49
EntityType camera,1
Global windnoise
; --------------

HidePointer

;setup lighting
light=CreateLight()
RotateEntity light,45,45,0
AmbientLight 48,48,48    ; was 32,32,32
flash=CreateLight(2)
PositionEntity flash,0,60,0
PointEntity flash,camera
EntityParent flash,camera


;create cloud planes
cloud=LoadTexture( "textures\cloud_2.bmp",3)
ScaleTexture cloud,1000,1000
p=CreatePlane()
EntityTexture p,cloud
EntityFX p,1
PositionEntity p,0,900,0
p=CopyEntity( p )
RotateEntity p,0,0,180

;create ground plane in case someone goes off map
tex=LoadTexture( "textures\mossyground1.jpg",3 )
ScaleTexture tex,128,128
p2=CreatePlane()
EntityTexture p2,tex
EntityBlend p2,1
EntityAlpha p2,.75
PositionEntity p2,0,1,0
EntityFX p2,1
EntityType p2,2

; OK we make some teleport points

Global trigger1 = CreateSphere(8)
PositionEntity trigger1,10,10,10
ScaleEntity trigger1,8,8,8
EntityAlpha trigger1,.65
EntityType trigger1,3
EntityColor trigger1,255,1,1

Global trigger2 = CreateSphere(8)
PositionEntity trigger2,20,10,1000
ScaleEntity trigger2,8,8,8
EntityAlpha trigger2,.65
EntityType trigger2,4
EntityColor trigger2,1,255,1

Global thing = CreateCube()
PositionEntity thing,100,10,100
ScaleEntity thing,8,8,8
EntityType thing,2
EntityColor thing,120,1,149

; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

CameraFogColor camera, 1,1,1
CameraFogMode camera,1

Collisions 1,2,2,2
Collisions 1,3,2,2
Collisions 1,4,2,2
Collisions 3,1,2,2
Collisions 4,1,2,2

While Not KeyDown( 1 )

check_collide

  mxs#=MouseXSpeed()/4
  mys#=MouseYSpeed()/4
  xa#=(xa#-mxs#)Mod 360
  ya#=(ya#+mys#)Mod 360 
;limit up and down looking
	If ya#>=90 Then ya#=90 
    If ya#<= -89 Then ya#= -89

  MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
  RotateEntity camera,ya#,xa#,0
    



If KeyDown( 205 )=True Then RotateEntity camera,0,-5,0
If KeyDown( 203 )=True Then RotateEntity camera,0,+5,0
If KeyDown( 208 )=True Then MoveEntity camera,0,0,-5
If KeyDown( 200 )=True Then MoveEntity camera,0,0,5

x#=EntityX(camera)
y#=EntityY(camera)
z#=EntityZ(camera)

; ---- HOW TO USE GRAVITY

y#=y#-8

; ------------------

PositionEntity camera,x#,y#,z#


UpdateWorld()

RenderWorld()

Text 0,0,"Use cursor keys to move about the terrain [ESC] to quit"
Text 0,10,"Jumpflag:"+jumpflag
Text 0,30,"X: "+x#
Text 100,30,"Y: "+y#
Text 200,30,"Z: "+z#

Flip

Wend

End

Function check_collide()

	If EntityCollided(camera,3) Then
		ResetEntity camera
		PositionEntity camera,20,20,1050
		;MoveEntity camera,20,20,1010
	EndIf
	
		If EntityCollided(camera,4) Then
		ResetEntity camera
		PositionEntity camera,20,20,20
		;MoveEntity camera,20,20,1010
	EndIf

End Function
I can't explain it... HERE the command POSITIONENTITY works... but HERE...
(this is a biggie)
; Gnash v1.alpha
; Ralph Dunn
; June 10, 2004
; starting to come together
; -------------------

Graphics3D 800,600
SetBuffer BackBuffer()
SeedRnd (MilliSecs())

campiv = CreatePivot()
Global camera = CreateCamera(campiv)
floorpivot=CreatePivot()
PositionEntity camera,1466,200,410  ; 600,440,2000 - BUILDING 1466,200,410 - PAD
CameraRange camera,.1,1500
CameraFogRange camera,10,1300
EntityRadius camera,8,41
EntityType camera,1
Global gun_timer=MilliSecs() ; timer to track the difference in millisecs
Global gun_time=750 ; time in milliseconds that the gun will fire
Global ammo
Global DUDE

; --------------

HidePointer

;setup lighting
light=CreateLight()
RotateEntity light,45,45,0
AmbientLight 32,32,32   ; was 32,32,32

; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= SOUND
; Load Sound for backmusic
Global windnoise=LoadSound("media/windlow.ogg")
LoopSound windnoise
Global wind=LoadSound("media/windy1.ogg")
LoopSound wind
firebow=LoadSound("media/click1.wav")
Global doorx=LoadSound("media/metaldoor.wav")
Global walk=LoadSound("media/walk2.ogg")
SoundPitch walk,18000
LoopSound walk
play_walk=PlaySound(walk)

; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= MAP

Global terr=LoadTerrain("textures\hmap_1024.bmp")
ScaleEntity terr,25,400,25
PositionEntity terr,-20*512,0,-20*512
EntityFX terr,1
EntityType terr,2	;Load terrain

;apply textures To terrain	
tex1=LoadTexture( "textures\coolgrass1.bmp",1 )
ScaleTexture tex1,10,10
tex2=LoadTexture( "textures\lmap_256.bmp" ) ; i like a nice set of colors
ScaleTexture tex2,TerrainSize(terr),TerrainSize(terr)
EntityTexture terr,tex1,0,0
EntityTexture terr,tex2,0,1

; Draw the Aimpoint where the TEXT goes or you never see it
aim=LoadImage("textures\aimpoint3.png")


;create cloud planes
cloud=LoadTexture( "textures\cloud_2.bmp",3)
ScaleTexture cloud,1000,1000
p=CreatePlane()
EntityTexture p,cloud
EntityFX p,1
PositionEntity p,0,900,0
p=CopyEntity( p )
RotateEntity p,0,0,180

;create water plane
tex=LoadTexture( "textures\wawa1.bmp",3 )
ScaleTexture tex,128,128
Global w=CreatePlane()
EntityTexture w,tex
EntityBlend w,1
EntityAlpha w,.75
PositionEntity w,0,39,0
EntityFX w,1
;EntityType p,2


; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ENTITYS

;cool castle
Global castle=LoadMesh( "textures\tower1.b3d" )
PositionEntity castle,418,125,809
EntityFX castle,0
EntityType castle,2
UpdateNormals castle
TurnEntity castle,0,164,0
ScaleEntity castle,18,30,18

; GREAT HALL
Global ghall=LoadMesh( "textures\great_hall.b3d" )
PositionEntity ghall,3179,260,2458
EntityFX ghall,0
EntityType ghall,2
UpdateNormals ghall
TurnEntity ghall,0,164,0
ScaleEntity ghall,15,15,15

; CRYPT
Global crypt=LoadMesh( "textures\portal2.b3d" )
PositionEntity crypt,1835,399,2872
EntityFX crypt,0
EntityType crypt,2
UpdateNormals crypt
TurnEntity crypt,0,0,0
ScaleEntity crypt,15,15,15

; SWITCH
Global switch=LoadMesh( "textures\trigger1.b3d" )
PositionEntity switch,1835,399,2872
EntityFX switch,0
EntityAlpha switch,0
UpdateNormals switch
EntityType switch,4
TurnEntity switch,0,0,0
ScaleEntity switch,15,15,15


; CRYPT2
Global crypt2=LoadMesh( "textures\portal4.b3d" )
PositionEntity crypt2,1835,399,2872
EntityFX crypt2,0
EntityType crypt2,2
UpdateNormals crypt2
TurnEntity crypt2,0,0,0
ScaleEntity crypt2,15,15,15
HideEntity crypt2


; CRYPT3
Global crypt3=LoadMesh( "textures\crypt4.b3d" )
PositionEntity crypt3,1835,399,2872
EntityFX crypt3,0
EntityType crypt3,2
UpdateNormals crypt3
TurnEntity crypt3,0,0,0
ScaleEntity crypt3,15,15,15
HideEntity crypt3


;DOCK
Global dock=LoadMesh( "textures\dock_old.b3d" )
PositionEntity dock,950,80,116
EntityFX dock,0
EntityType dock,2
UpdateNormals dock
TurnEntity dock,0,180,0
ScaleEntity dock,18,18,18

;TELEPORT PAD
pad=LoadMesh( "textures\teleportpad1.b3d" )
PositionEntity pad,1466,150,410
EntityFX pad,0
EntityType pad,2
UpdateNormals pad
TurnEntity pad,0,0,0
ScaleEntity pad,5,5,5

Global pad2=LoadMesh( "textures\teleportpad1.b3d" )
PositionEntity pad2,949,-86,1949
EntityType pad2,2
UpdateNormals pad2
ScaleEntity pad2,5,5,5

; PAD 2 Trigger
Global switch2=LoadMesh( "textures\trigger1.b3d" )
PositionEntity switch2,950,-60,1949
EntityFX switch2,0
EntityAlpha switch2,1 ; was 0
UpdateNormals switch2
EntityType switch2,5
ScaleEntity switch2,25,25,25
HideEntity switch2


;WALL
Global wall=LoadMesh( "textures\gate3.b3d" )
PositionEntity wall,1190,175,837
EntityFX wall,0
EntityType wall,2
UpdateNormals wall
;TurnEntity wall,0,164,0
ScaleEntity wall,18,30,18

; PORTAL
Global portal=LoadMesh( "textures\0portal.b3d" )
PositionEntity portal,725,250,1957
EntityFX portal,0
EntityType portal,2
UpdateNormals portal
TurnEntity portal,0,0,0
ScaleEntity portal,25,25,25
EntityPickMode portal,1

;lil dingy
Global boat=LoadMesh( "textures\smallboat.b3d" )
PositionEntity boat,74,3,-267
EntityFX boat,0
EntityType boat,2
UpdateNormals boat
TurnEntity boat,0,0,0
ScaleEntity boat,2,2,2

;ladder
Global ladder=LoadMesh( "textures\ladder_1.b3d" )
PositionEntity ladder,570,251,2022
EntityFX ladder,0
EntityType ladder,2
EntityPickMode ladder,3
UpdateNormals ladder
TurnEntity ladder,0,180,0
ScaleEntity ladder,7,7,7

;DOOR animated
Global Adoor=LoadAnimMesh( "textures\adoor1.b3d" )
PositionEntity Adoor,850,252,2180 ; 252
EntityFX Adoor,0
EntityType Adoor,2	
EntityPickMode Adoor,2
EntityRadius Adoor,10
UpdateNormals Adoor
TurnEntity Adoor,0,0,0
RotateEntity Adoor,90,0,0
ScaleEntity Adoor,6,8,7
;making new doors
;door2 = CopyMesh(Adoor)
;PositionEntity door2,800,252,2000


; Load Xbow

Global gun=LoadAnimMesh("textures\xbow3.b3d",camera)
ScaleEntity gun,.8,.8,.8
PositionEntity gun,-.1,-4,8

; load xbow ammo
Global bolt=LoadMesh("textures\bolt6.b3d",gun)
;PositionEntity bolt,.26,-4,9
HideEntity bolt
; create a type
Type bullet
	Field entity
	Field speed#
	Field range
	Field pivot
End Type

; HEALTHwidget
Global health=LoadMesh("textures\healthbar2.b3d",camera)
ScaleEntity health,.5,.5,.5
PositionEntity health,-4,-2,4

CameraFogColor camera, 2, 2, 2
CameraFogMode camera,1


Collisions 1,2,2,3
Collisions 2,1,2,3
Collisions 4,1,2,2
Collisions 5,1,2,2
Collisions 1,4,2,2
Collisions 1,5,2,2

ammo = 100

jumpflag=False

j#=1
PlaySound windnoise
PlaySound wind
healthy#=1
current = MilliSecs()

chnWalk=PlaySound (mov)
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX   HERE
While Not KeyDown( 1 )


volume_walk=0
ChannelVolume play_walk,volume_walk

x#=EntityX(camera)
y#=EntityY(camera)
z#=EntityZ(camera)
; ---- HOW TO USE GRAVITY

y#=y#-8

PositionEntity camera,x#,y#,z#


  mxs#=MouseXSpeed()/4
  mys#=MouseYSpeed()/4
  xa#=(xa#-mxs#)Mod 360
  ya#=(ya#+mys#)Mod 360 
;limit up and down looking
	If ya#>=90 Then ya#=90 
    If ya#<= -89 Then ya#= -89

  MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
  RotateEntity camera,ya#,xa#,0
    
; -------------------------------------------------------------------------------------


If KeyDown (209)=True Then healthy#=healthy#-.1: ScaleEntity health,healthy#,.5,.5
If KeyDown (201)=True Then healthy#=healthy#+.1: ScaleEntity health,healthy#,.5,.5
If KeyDown( 205 )=True Then RotateEntity camera,0,-5,0
If KeyDown( 203 )=True Then RotateEntity camera,0,+5,0
If KeyDown( 208 )=True Then 
	MoveEntity camera,0,0,-5 
	volume_walk = 1
	ChannelVolume play_walk,volume_walk
EndIf
If KeyDown( 200 )=True Then 
	MoveEntity camera,0,0,+5
	volume_walk = 1
	ChannelVolume play_walk,volume_walk
EndIf
; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Bullet code by Ross C
If MouseDown(1) And MilliSecs()>gun_time+gun_timer Then
	ammo = ammo-1
	If ammo<0 Goto carryon
		Animate gun,3
		PlaySound firebow
		gun_timer=MilliSecs() ; reset the timer
		create_bullet(gun); call function to create a bullet. Pass across the gun entity to the function
						  ; so the bullet can come from the guns position
	End If
.carryon
If ammo < 0 Then ammo = 0

check_collide()	

If DUDE=1 Then PositionEntity camera,1466,220,410

update_bullet()
;walktimer=MilliSecs() ; timer reset
; =--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-==-=-=-=-=-=-=

If MouseDown(2) = True Then entity = EntityPick(camera,190)
Select entity
			Case Adoor 
				;For hh = 1 To 90
				;RotateEntity Adoor,0,hh,0
				;Next 
				Animate Adoor,3,1
			Default hh=0
			End Select
FlushMouse

If KeyHit( 57 )=True And jumpflag = False
	jumpflag=True
	oldtime=MilliSecs()
EndIf
		If jumpflag = True Then TranslateEntity camera,+0,+9,+0
		 	If MilliSecs()>oldtime+1250 Then jumpflag=False

; ------------------


UpdateWorld()

RenderWorld()

Text 0,0,"Use cursor keys to move about the terrain [ESC] to quit"
Text 0,10,"Jumpflag:"+jumpflag
Text 0,30,"X: "+x#
Text 100,30,"Y: "+y#
Text 200,30,"Z: "+z#

Text 0,50,"Entity: "+PickedEntity()
Text 0,60,"M1"+ MouseHit(1)
Text 0,70,"M2"+MouseHit(2)
;AIMPOINT
DrawImage aim,378,300
heal#=healthy#*100
Text 0,530,"Health: "+heal#
Text 0,90,"Ammo: "+ammo
Text 0,100,"JOP:"+jop

Flip

DUDE=0
Wend

End

Function create_bullet(gun_entity)
	b.bullet=New bullet
	
		temp_x=EntityX(gun_entity,True)
		temp_y=EntityY(gun_entity,True)
		temp_z=EntityZ(gun_entity,True)
		
		b\entity=CopyEntity(bolt) ; copy the main bullet entity , into the type object
		b\pivot=CreatePivot()
		; EntityType b\entity,1
		PositionEntity b\entity,temp_x,temp_y,temp_z
		RotateEntity b\entity,EntityPitch(gun_entity,True),EntityYaw(gun_entity,True),0
		PositionEntity b\pivot,temp_x,temp_y,temp_z
		b\range=300 ; the range of the bullets
		b\speed=18; the speed of the bullets
End Function

Function update_bullet()
	For b.bullet = Each bullet
		MoveEntity b\entity,0,0,b\speed
		If EntityDistance#(b\entity,b\pivot) > b\range Then
			FreeEntity b\entity
			FreeEntity b\pivot
			Delete b.bullet
		End If
	Next
End Function

Function check_collide()

	If EntityCollided(camera,5) Then
		HideEntity switch2
		PositionEntity terr,-20*512,0,-20*512
		ResetEntity camera
		;PositionEntity camera,1466,220,410
		MoveEntity camera,1466,220,410
		ShowEntity w
		DUDE=1
		;playsound whoop
		ShowEntity crypt2
		ShowEntity crypt
		ShowEntity castle
		ShowEntity wall
		ShowEntity portal
		ShowEntity ghall
		HideEntity crypt3
		HideEntity pad2
		
	EndIf

	If EntityCollided(camera,4) Then
		HideEntity switch
		PlaySound doorx
		ShowEntity crypt3
		ShowEntity pad2
		ShowEntity switch2
		HideEntity crypt2
		HideEntity crypt
		HideEntity castle
		HideEntity wall
		HideEntity portal
		HideEntity ghall
		PositionEntity terr,0,-120,0
		HideEntity w
	EndIf

End Function
No joy!!! Why???
-RZ
PS If you want to use ANY part of this code be sure and give Ross, Ross C, Wolron, Neuromancer and Me a nod in the credits! :)

Simply set the entitytype of your camera to 0 immediately prior to teleporting and after teleporting set it back to whatever it was. In otherwords don't check whether the camera collides immediately prior to teleporting but set the collision type for the camera back to what it should be after placing it where you want it.

It was a location problem. The coordinates were not exact... and I do mean exact!!! ALSO I had to move the camera FIRST. My fault.
-RZ