need to open a door

Blitz3D Forums/Blitz3D Beginners Area/need to open a door

Hello All.

I have just purchaced blitz 3d & have been playn around with the demo for a while but haven't realy done any programing since the days of the good old C64.

I am trying to make a door slide open & can't quite figure it out. I have managed to make it open although i can't move the camera around when the door opens. I know the reason why it is doing this. Can anyone help me make the door open while i can still move the camera around.

Any help would be appreciated.

here is the code

Graphics3D 800,600,0,1

SetBuffer BackBuffer()


Global door
Global cam_col=1
Global room_col=2
Global door_col=3

Collisions Cam_col,room_col,2,2
Collisions cam_col,door_col,2,2

light=CreateLight()

room=LoadMesh ("cube1.b3d")
PositionEntity room,0,-100,0
EntityType room,room_col

door=LoadMesh ("door.b3d")
PositionEntity door,0,-100,200
ScaleEntity door,1,1,.3
EntityType door,door_col

campivot=CreatePivot()
EntityType campivot,cam_col
EntityRadius campivot,3

camera=CreateCamera(campivot)
PositionEntity camera,0,50,0
EntityType camera,cam_col

While Not KeyDown (1)

TranslateEntity campivot,0,-.5,0

If KeyDown (203)
TurnEntity campivot,0,1,0
ElseIf KeyDown (205)
TurnEntity campivot,0,-1,0
End If
If KeyDown (208)
TurnEntity camera,1,0,0 ElseIf KeyDown (200)
TurnEntity camera,-1,0,0
EndIf
If KeyDown (30)
MoveEntity campivot,0,0,1
ElseIf KeyDown (44)
MoveEntity campivot,0,0,-1
EndIf

If EntityCollided (campivot,door_col)
timer=MilliSecs()
While MilliSecs() <timer+2000
MoveEntity door,0,+1,0
UpdateWorld
RenderWorld 2
Flip
Wend
EndIf

UpdateWorld

RenderWorld
Flip

Wend

One method, a simple method, is at the end of your little loop for opening the door (after wend), would be to change the entitytype of the door to zero, basically :

EntityType door,0

This would remove it from all collision checking and allow the game to ignore that door from that point on.

One point I notice though is that having a separate while/wend loop within the main while/wend loop just for opening a door is not the way I would have gone about doing this. For example, if you had various particle effects flying about they would suddenly cease updating, unless you call your functions to 'updatestuff' in the other loop as well.

Thanks Matty.

Yeah. I knew that the loop inside the main loop is what's causing the problem of not being able to move the camera as the door was opening.

What would be the best way to open the door without having a loop within the main loop?
I am just playing around with things at the moment & at the same time learning how to program.

Okay, (just taking a brief moment during half-time) -

It all depends on what you are trying to do, in terms of how you go about solving this problem.

I'll give you a way which is similar to how I do it in my current games.

In the example I give I will try to use obviously named variables and will avoid using types/arrays and other code that beginners can struggle with at first (I'm assuming you are a beginner - I apologise if I'm wrong):




;Outside of your main loop, when you load your level, place doors etc you might set a variable like this:

DoorState = 0 ; 0 = closed, 1 = opening, 2 = open, 3 = closing
DoorAngle# = 0.0 ;door swings between an angle of 90 degrees about a pivot point you would place at the door hinge.
DoorTimeToRemainOpen = 3000 ;milliseconds
; then inside your main loop
REPEAT ;game loop



Moveyourcamera, and everything else.....here

SELECT DoorState ;if you have multiple doors you are going to need to store each door's doorstate, and other properties somehow, the easiest way is with TYPEs - when you get used to them,

CASE 0 ;closed

IF 'collided with door' THEN DoorState = 1;your current collision method seems fine so use that...
;okay we've collided with a closed door, so it is time to set it to 'opening'

CASE 1 ;opening
	TURNENTITY DoorEnt,0,1,0
	DoorAngle=ENTITYYAW(DoorEnt)
	IF DoorAngle >= 90 then ROTATEENTITY DoorEnt,0,90,0 :DoorState = 2:ENTITYTYPE DoorEnt,0:DoorClosingTime=Millisecs()+DoorTimetoRemainOpen


CASE 2 ;open
	If Millisecs() > DoorClosingtime then DoorState = 3		

CASE 3 ;closing
	TurnEntity DoorEnt,0,-1,0
	DoorAngle=EntityYaw(DoorEnt)
	If DoorAngle <=0 then RotateEntity DoorEnt,0,0,0:DoorState=0:EntityType DoorEnt,DOORTYPE ;whatever you have set your door collision type number to


END-SELECT


updateworld
renderworld
flip



UNTIL KEYDOWN(1) ;end of game loop





Very much a beginner.
Gota start somewhere.

Thanks heaps.

here is what i came up with before. Got the door to open it just wouldn't stop opening.

______________________________________________________

Graphics3D 800,600,0,1

SetBuffer BackBuffer()

Global campivot
Global cam_col=1
Global room_col=2
Global door_col=3
Global door
Global door_open = False
Global door_y

Collisions Cam_col,room_col,2,2
Collisions cam_col,door_col,2,2

light=CreateLight()

room=LoadMesh ("cube1.b3d")
PositionEntity room,0,-100,0
EntityType room,room_col

door=LoadMesh ("door.b3d")
PositionEntity door,0,-100,200
ScaleEntity door,1,1,.3
EntityType door,door_col

campivot=CreatePivot()
EntityType campivot,cam_col
EntityRadius campivot,4

camera=CreateCamera(campivot)
PositionEntity camera,EntityX(campivot),50,EntityZ(campivot)
EntityType camera,cam_col

Function opendoor()
If door_open=False dy=0
If EntityCollided (campivot,door_col) door_open=True
timer=MilliSecs()
dy=1
If door_open=True
MoveEntity door,0,dy,0
If MilliSecs() = Timer +2000 Then door_open = False
EndIf
End Function


While Not KeyDown (1)

TranslateEntity campivot,0,-.5,0

If KeyDown (203)
TurnEntity campivot,0,1,0
ElseIf KeyDown (205)
TurnEntity campivot,0,-1,0
End If
If KeyDown (208)
TurnEntity camera,1,0,0
ElseIf KeyDown (200)
TurnEntity camera,-1,0,0
EndIf
If KeyDown (30)
MoveEntity campivot,0,0,1
ElseIf KeyDown (44)
MoveEntity campivot,0,0,-1
EndIf
opendoor()

UpdateWorld

RenderWorld
Flip

Wend

End
_____________________________________________________

Will go over your code & see how i go, probably tomorow.

Thanks again

I simply added a variable that told if the door had already been open

also Please use code code or codebox

Graphics3D 800,600,0,1

SetBuffer BackBuffer()

Global campivot
Global cam_col=1
Global room_col=2
Global door_col=3
Global door
Global door_open = False
Global door_y
Global door_opened = False

Collisions Cam_col,room_col,2,2
Collisions cam_col,door_col,2,2

light=CreateLight()

room=LoadMesh ("cube1.b3d")
PositionEntity room,0,-100,0
EntityType room,room_col

door=LoadMesh ("door.b3d")
PositionEntity door,0,-100,200
ScaleEntity door,1,1,.3
EntityType door,door_col

campivot=CreatePivot()
EntityType campivot,cam_col
EntityRadius campivot,4

camera=CreateCamera(campivot)
PositionEntity camera,EntityX(campivot),50,EntityZ(campivot)
EntityType camera,cam_col

Function opendoor()
If door_open=False dy=0
If EntityCollided (campivot,door_col) door_open=True
timer=MilliSecs()
dy=1
If door_open=True And door_opened = False Then
	MoveEntity door,0,dy,0
	If MilliSecs() = Timer +2000 Then
		door_open = False
		door_opened = True
	EndIf
EndIf
End Function 


While Not KeyDown (1)

TranslateEntity campivot,0,-.5,0

If KeyDown (203)
TurnEntity campivot,0,1,0
ElseIf KeyDown (205)
TurnEntity campivot,0,-1,0
End If
If KeyDown (208)
TurnEntity camera,1,0,0 
ElseIf KeyDown (200)
TurnEntity camera,-1,0,0
EndIf
If KeyDown (30)
MoveEntity campivot,0,0,1
ElseIf KeyDown (44)
MoveEntity campivot,0,0,-1
EndIf
opendoor()

UpdateWorld

RenderWorld
Flip

Wend

End



Gday & thanks for the help.
I have just tried your code Nate but the door still keeps moving. I found some code in the archives for doors i think i will study them as well & try the way Matty sugested.
All help is much appreiciated. Will use code boxes from now on. I didn't know how to do before.

sorry I could not test my code because I didn't have time

No worries. I apreciate the time taken to help & offer sugestions.

Hmm It works for me did you set door_opened as a global variable?

Does this work??

Graphics3D 800,600,0,1

SetBuffer BackBuffer()

Global campivot
Global cam_col=1
Global room_col=2
Global door_col=3
Global door
Global door_open = False
Global door_y
Global door_opened = False
Global firsttime = 0
Collisions Cam_col,room_col,2,2
Collisions cam_col,door_col,2,2

light=CreateLight()

room=LoadMesh ("cube1.b3d")
PositionEntity room,0,-100,0
EntityType room,room_col

door=LoadMesh ("door.b3d")
PositionEntity door,0,-100,200
ScaleEntity door,1,1,.3
EntityType door,door_col

campivot=CreatePivot()
EntityType campivot,cam_col
EntityRadius campivot,4

camera=CreateCamera(campivot)
PositionEntity camera,EntityX(campivot),50,EntityZ(campivot)
EntityType camera,cam_col

Function opendoor()
If door_open=False dy=0
If EntityCollided (campivot,door_col)
	door_open=True
	firsttime = firsttime + 1
	
	If Firsttime = 1 Then timer=MilliSecs()
EndIf
dy=1
If door_open=True And door_opened = False Then
	MoveEntity door,0,dy,0
	If MilliSecs() => Timer +2000 Then
		door_open = False
		door_opened = True
	EndIf
EndIf
End Function 


While Not KeyDown (1)

TranslateEntity campivot,0,-.5,0

If KeyDown (203)
TurnEntity campivot,0,1,0
ElseIf KeyDown (205)
TurnEntity campivot,0,-1,0
End If
If KeyDown (208)
TurnEntity camera,1,0,0 
ElseIf KeyDown (200)
TurnEntity camera,-1,0,0
EndIf
If KeyDown (30)
MoveEntity campivot,0,0,1
ElseIf KeyDown (44)
MoveEntity campivot,0,0,-1
EndIf
opendoor()

UpdateWorld

RenderWorld
Flip

Wend

End


Nope door dosn't move. I set door_opened as global but still keps moving. ????

Ok i got the door to open using this code
Graphics3D 800,600,0,1

SetBuffer BackBuffer()

Global campivot
Global cam_col=1
Global room_col=2
Global door_col=3
Global door
Global door_open = False
Global door_y
Global door_opened = False

Collisions Cam_col,room_col,2,2
Collisions cam_col,door_col,2,2

doorstate = 0 ; 0=door closed, 1=door opening, 2=door open, 3=door closing
doormove# = 0 
doortimeopen = 2000 ; time door stays open


light=CreateLight()

room=LoadMesh ("cube1.b3d")
PositionEntity room,0,-100,0
EntityType room,room_col

door=LoadMesh ("door.b3d")
PositionEntity door,0,-100,200
ScaleEntity door,1,1,.3
EntityType door,door_col

campivot=CreatePivot()
EntityType campivot,cam_col
EntityRadius campivot,4

camera=CreateCamera(campivot)
PositionEntity camera,EntityX(campivot),50,EntityZ(campivot)
EntityType camera,cam_col	


Repeat

	TranslateEntity campivot,0,-.5,0

	If KeyDown (203)
				TurnEntity campivot,0,1,0
		ElseIf KeyDown (205)
				TurnEntity campivot,0,-1,0
				End If
		If KeyDown (208)
				TurnEntity camera,1,0,0				 
		ElseIf KeyDown (200)
				TurnEntity camera,-1,0,0
				EndIf
		If KeyDown (30)
				MoveEntity campivot,0,0,1
		ElseIf KeyDown (44)
				MoveEntity campivot,0,0,-1
				EndIf
				
Select doorstate
	Case 0
		If EntityCollided (campivot,door_col) Then doorstate =1
	Case 1 ;door opening
		MoveEntity door,0,1,0
		doormove =EntityY(door)
		If doormove >= 50 Then MoveEntity door,0,0,0 :doorstate =2 EntityType door, 0:doorclosetime=MilliSecs()+doortimeopen
	Case 2 ;open
		If MilliSecs > doorclosetime Then doorstate=3
	Case 3 ;closeing
		MoveEntity door,0,-1,0
		doormove =EntityY(door)
		If doormove <= 0 Then MoveEntity door,0,0,0:doorstate=0:EntityType door,3
End Select

UpdateWorld

RenderWorld
Flip



now just got to get it to shut. I will play around with it & see what i can do.

don't worrie. I fixed it, it was the () after the millisecs i missed.
Thanks once again for all the help. :)

You're welcome Good luck :)