Code: Select all
; Recursive Backtracking maze
; keys
; f2 = CameraRenderMode
; f3 = WorldDebug
;
; pad 8 = MoveCamera
; pad 2 = MoveCamera
; pad 7 = MoveCamera
; pad 1 = MoveCamera
;
; p = debuggger
;
; add = power z
; subtract = power z
;
; pad 9 = power y
; pad 3 = power y
;
; up/left mousekey = forward
;
; down/right mousekey = break/speedup
;
; left/mouse = turn
; right/mouse = turn
;
; page up = pitch
; page down = pitch
;
; delete = roll
; End = roll
;
; c = overview cam
;
; 1 = CameraRange
; 2 = CameraRange
;
; m = make maze
; space = make maze * 300
Declare start_3d()
Declare maze_entitys()
Declare maze_Algorithm()
Declare delete_maze_entitys(x.i,y.i,rx.i,ry.i)
Declare my_vehicle()
Declare loop()
Declare loop2()
Declare OpenWindow_3D(c.i)
If InitEngine3D()=0:End:EndIf
InitSprite()
InitKeyboard()
InitMouse()
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
If Screen3DRequester()=0:End:EndIf
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures/", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures/nvidia", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
CreateMaterial(0,LoadTexture(1,"ground_diffuse.png"))
CreateMaterial(1,LoadTexture(2,"Geebee2.bmp"))
CreateMaterial(2,LoadTexture(3,"nskingr.jpg"))
CreateMaterial(3,LoadTexture(4,"Wood.jpg"))
EnableExplicit
Global.i Dim maze(31,31) ,Dim x(30*30) , Dim y(30*30) , Dim rx(4) , Dim ry(4)
Global.i del, cc
cc=40 ;CameraRange
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#x_upl = 30 ; maze size
#y_upl = 30
#zell_zise =4 ; maze-sell size
#x_start=#x_upl/2 ; start för maze
#y_start=1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#x_start_v =(#x_upl+1)/2 ;start för my_vehicle
#y_start_v =-2
;
#x_upl2=#x_upl+1
#y_upl2=#y_upl+1
start_3d()
OpenWindow_3D(9)
my_vehicle()
maze_entitys()
maze_Algorithm()
loop()
;loop2()
End
Procedure start_3d()
#Camera1=0
#Camera2=1
#plane=0
#plane_Rest=0
#plane_fric=0.1
SkyBox("desert07.jpg")
WorldGravity(-50)
CreateCamera(#Camera1, 0, 0, 100, 100)
CameraRange(#Camera1, 0, cc)
CreatePlane(#plane, #x_upl*#zell_zise+28, #x_upl*#zell_zise+28, 1, 1, 100, 100)
CreateEntity(#plane, MeshID(0), MaterialID(0),#x_upl*#zell_zise/2+#zell_zise/2,0,#y_upl*#zell_zise/2+#zell_zise/2)
EntityPhysicBody(#plane, #PB_Entity_StaticBody, 0.5, #plane_rest,#plane_fric)
EndProcedure
Procedure my_vehicle()
#vehicle_radie=1.45
#mesh_cube=0
#My_vehicle=1
#My_vehicle_x=#x_start_v* #zell_zise -1
#My_vehicle_y=7
#My_vehicle_Z=#y_start_v* #zell_zise -1
#My_vehicle_Rest=0
#My_vehicle_fric=0
CreateSphere(#My_vehicle, #vehicle_radie,8,8)
TransformMesh(#My_vehicle,0,0,0, 1, 0.5, 1,0,0,0)
;UpdateMeshBoundingBox(#My_vehicle) ;???
CreateEntity(#My_vehicle, MeshID(1), MaterialID(1), #My_vehicle_x , #My_vehicle_y , #My_vehicle_z)
EntityPhysicBody(#My_vehicle, #PB_Entity_SphereBody, 0.7, #My_vehicle_Rest,#My_vehicle_fric)
AttachEntityObject(#My_vehicle, "", CameraID(#Camera1))
RotateEntity(#My_vehicle, 0,180,0)
EndProcedure
Procedure maze_entitys()
#ent=10
Define.i x,y,ent=#ent
CreateCube (2, 1)
TransformMesh(2,0,0,0, 0.4 ,#zell_zise,#zell_zise,0,0,0)
UpdateMeshBoundingBox(2)
For y=1 To #y_upl2
For x=1 To #x_upl2
CreateEntity(ent, MeshID(2), MaterialID(2), x*#zell_zise-#zell_zise/2, #zell_zise/2, y*#zell_zise-#zell_zise)
EntityPhysicBody(ent, #PB_Entity_StaticBody );, 0.5, #box_Rest,#box_fric)
ent+1
Next x
Next y
For y=1 To #y_upl2
For x=1 To #x_upl2 ; +1
CreateEntity(ent, MeshID(2), MaterialID(2), x*#zell_zise-#zell_zise, #zell_zise/2, y*#zell_zise-#zell_zise/2)
RotateEntity(ent, 0,90,0)
EntityPhysicBody(ent, #PB_Entity_StaticBody) ; , 0.5, #box_Rest,#box_fric)
ent+1
Next x
Next y
For ent=0 To #x_upl
FreeEntity(ent+#ent)
Next ent
For ent=0 To #y_upl
FreeEntity(#x_upl2*#y_upl2+ent*#x_upl2+#ent)
Next ent
; way out of the maze
; ent=#y_upl2/2 : FreeEntity(#ent+#x_upl2*ent)
; ent=#y_upl2/2 : FreeEntity(#x_upl2-1+#ent+#x_upl2*ent)
ent=#x_upl2/2 : FreeEntity(#x_upl2*#y_upl2+#ent+ent)
ent=#x_upl2/2 : FreeEntity(#x_upl2*#y_upl2+#y_upl *#x_upl2+#ent+ent)
EndProcedure
Procedure loop()
Define.f MouseX,MouseY,Speed1,camY,camZ,CamAngle,LinearVelocity
Define.f z_speed , Z_Ang,Y_Ang, X_Ang,vinkel,vinkel2
Define.f lva,lvx,lvy,lvz,ax,ay,az,avx,avy,avz,avxo,avyo,avzo,power_z,power_y,y_speed
Define.f zero_x,zero_y,zero_z,z_x,z_y,z_z,x_x,x_y,x_z,y_x,y_y,y_z,zero_high,x_high,z_high,high,high_o
Define.f speed_old,speed
Define.i brake,w_frame,c_body,yaw,Rnd,xx,yy ,a
Define.f x,x_o,z,z_o
power_z=1.2
power_y=0.065
CamAngle=50
camZ=0.2
#ang_speed=0.0006
MoveCamera(#Camera1,0,0,camZ,#PB_Relative)
CameraFOV(#Camera1, CamAngle)
yy=70
xx=ScreenWidth()*0.7
yy=ScreenHeight()*0.065
; w_frame=2:CameraRenderMode(#Camera1,w_frame)
; c_body=1 :WorldDebug(c_body)
Repeat
Screen3DEvents()
lva=GetEntityAttribute(#My_vehicle,#PB_Entity_LinearVelocity); : Get the current linear velocity (all axis).
lvx=GetEntityAttribute(#My_vehicle,#PB_Entity_LinearVelocityX); : Get the current linear velocity on 'x' axis.
lvy=GetEntityAttribute(#My_vehicle,#PB_Entity_LinearVelocityY); : Get the current linear velocity on 'y' axis.
lvz=GetEntityAttribute(#My_vehicle,#PB_Entity_LinearVelocityZ); : Get the current linear velocity on 'z' axis.
avx=GetEntityAttribute(#My_vehicle,#PB_Entity_AngularVelocityX);: Get the current angular velocity on 'x' axis.
avy=GetEntityAttribute(#My_vehicle,#PB_Entity_AngularVelocityY);: Get the current angular velocity on 'y' axis.
avz=GetEntityAttribute(#My_vehicle,#PB_Entity_AngularVelocityZ);: Get the current angular velocity on 'z' axis.
ExamineMouse()
Y_Ang = MouseDeltaX() * #ang_speed/30
x_Ang = -MouseDeltaY() * #ang_speed/30
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F2):w_frame+1:If w_frame = 3:w_frame=0:EndIf:CameraRenderMode(#Camera1,w_frame):EndIf
If KeyboardReleased(#PB_Key_F3): c_body+1:If c_body = 4 :c_body=0 :EndIf:WorldDebug(c_body):EndIf
If KeyboardPushed(#PB_Key_Pad8) : camZ - 0.2 :MoveCamera(#Camera1,0,camY,camZ,0):RotateCamera(#Camera1, 0,0,0): EndIf
If KeyboardPushed(#PB_Key_Pad2) : camZ + 0.2 :MoveCamera(#Camera1,0,camY,camZ,0): RotateCamera(#Camera1, 0,0,0): EndIf
If KeyboardPushed(#PB_Key_Pad7) :camY + 0.4 :MoveCamera(#Camera1,0,camY,camZ,0):RotateCamera(#Camera1, -40,0,0) : EndIf
If KeyboardPushed(#PB_Key_Pad1) :camY - 0.4 :MoveCamera(#Camera1,0,camY,camZ,0):RotateCamera(#Camera1, -40,0,0) : EndIf
; If KeyboardPushed(#PB_Key_Pad7) : CamAngle - 0.1 :CameraFOV(#Camera1, CamAngle): EndIf
; If KeyboardPushed(#PB_Key_Pad1) : CamAngle + 0.1:CameraFOV(#Camera1, CamAngle): EndIf
If KeyboardPushed(#PB_Key_P) : CallDebugger: EndIf
If KeyboardPushed(#PB_Key_Add) And power_z <8 : power_z+0.005:EndIf
If KeyboardPushed(#PB_Key_Subtract) And power_z>0.01 : power_z-0.005: EndIf
If KeyboardPushed(#PB_Key_Pad9) : power_y *1.003:EndIf
If KeyboardPushed(#PB_Key_Pad3) : power_y *0.997: EndIf
brake=7 : z_speed =0
If KeyboardPushed(#PB_Key_Up) Or MouseButton(#PB_MouseButton_Left) : z_speed = power_z :EndIf
If KeyboardPushed(#PB_Key_Down) Or MouseButton(#PB_MouseButton_Right) : brake = 10 :EndIf
If KeyboardPushed(#PB_Key_Left) : Y_Ang = -#ang_speed:EndIf
If KeyboardPushed(#PB_Key_Right) : Y_Ang = #ang_speed:EndIf
If KeyboardPushed(#PB_Key_PageUp) : X_Ang = #ang_speed:EndIf
If KeyboardPushed(#PB_Key_PageDown) : X_Ang = -#ang_speed:EndIf
z_Ang=0
If KeyboardPushed(#PB_Key_Delete) : z_Ang = #ang_speed:EndIf
If KeyboardPushed(#PB_Key_End) : z_Ang = -#ang_speed:EndIf
;- --------- camera --------------------------------
If KeyboardReleased(#PB_Key_C)
If IsCamera(#Camera2): FreeCamera(#Camera2):
Else
CreateCamera(#Camera2, 70, 12, 30, 40)
MoveCamera(#Camera2, #x_upl*#zell_zise/2+#zell_zise/2,160,#y_upl*#zell_zise/2+#zell_zise/2)
RotateCamera(#Camera2, -90,180,0 )
ShowGUI(200, 0,#Camera2,0)
EndIf
EndIf
If KeyboardReleased(#PB_Key_1) And cc>0:cc-1:CameraRange(#Camera1, 0, cc):EndIf
If KeyboardReleased(#PB_Key_2):cc+1:CameraRange(#Camera1, 0, cc):EndIf
;- --------- maze --------------------------------
If KeyboardPushed(#PB_Key_M):maze_Algorithm():EndIf
If KeyboardReleased(#PB_Key_Space):For a=1 To 300:maze_Algorithm():Next a:EndIf
ConvertLocalToWorldPosition(EntityID(#My_vehicle), 0, 0,0)
zero_x=GetX()
zero_y=GetY()
zero_z=GetZ()
zero_high=TerrainHeight(0, zero_x, zero_z)
high_o=high
high=zero_y-zero_high
ConvertLocalToWorldPosition(EntityID(#My_vehicle), 0, 0,-1)
x_o=x:x=GetX()
z_o=z:z=GetZ()
vinkel2=ATan2(x-x_o,z-z_o)
z_x=x-zero_x
z_y=GetY()-zero_y
z_z=z-zero_z
vinkel=ATan2(z_x,z_z)
z_high=TerrainHeight(0, x, z)-zero_high
ConvertLocalToWorldPosition(EntityID(#My_vehicle), 1, 0,0)
x_x=GetX()-zero_x
x_y=GetY()-zero_y
x_z=GetZ()-zero_z
x_high=TerrainHeight(0, GetX(), GetZ())-zero_high
ConvertLocalToWorldPosition(EntityID(#My_vehicle), 0, 1,0)
y_x=GetX()-zero_x
y_y=GetY()-zero_y
y_z=GetZ()-zero_z
#rak=600
#cir_brake=300
y_speed=(10-high)* power_y
ApplyEntityImpulse(#My_vehicle, z_x * z_speed ,z_y * z_speed ,z_z * z_speed )
ApplyEntityImpulse(#My_vehicle, y_x * y_speed ,y_y * y_speed ,y_z * y_speed )
ApplyEntityImpulse(#My_vehicle, x_x * y_Ang, x_y * y_Ang, x_z * y_Ang, z_x * 50, z_y * 50, z_z * 50)
ApplyEntityImpulse(#My_vehicle,
-y_x * (-z_high+z_y)/#rak,
-y_y * (-z_high+z_y)/#rak,
-y_z * (-z_high+z_y)/#rak,
z_x * 50,
z_y * 50,
z_z * 50)
ApplyEntityImpulse(#My_vehicle,
-y_x * (-x_high+x_y)/#rak,
-y_y * (-x_high+x_y)/#rak,
-y_z * (-x_high+x_y)/#rak,
x_x * 50,
x_y * 50,
x_z * 50)
ApplyEntityImpulse(#My_vehicle, y_x * x_Ang, y_y * x_Ang, y_z * x_Ang, z_x * 50, z_y * 50, z_z * 50)
ApplyEntityImpulse(#My_vehicle, y_x * z_Ang, y_y * z_Ang, y_z * z_Ang, x_x * 50, x_y * 50, x_z * 50)
EndIf
;reduce linear speed
ApplyEntityImpulse(#My_vehicle, -lvx/brake, -lvy/brake, -lvz/brake )
;reduce angular speed
ApplyEntityImpulse(#My_vehicle, -avy/#cir_brake,0, 0 , 0,0,5)
ApplyEntityImpulse(#My_vehicle, 0, avx/#cir_brake, 0 , 0,0,5)
ApplyEntityImpulse(#My_vehicle, avz/#cir_brake,0, 0 , 0,5,0)
SetGadgetText3D(0,Str(Engine3DStatus(#PB_Engine3D_CurrentFPS))+#LF$+Str(Engine3DStatus(#PB_Engine3D_NbRenderedTriangles))+#LF$+Str(Engine3DStatus(#PB_Engine3D_NbRenderedBatches)))
SetGadgetText3D(1,"deleted" + #LF$+ "walls" + #LF$+ Str(del)+#LF$+ Str(#x_upl*#y_upl-1))
SetGadgetText3D(2,"Power_Z"+ #LF$+ StrF(power_z,2)+#LF$+"Power_Y"+ #LF$+ StrF(power_y *10,2))
speed_old=speed : speed=lva*10
SetGadgetText3D(3,"speed"+ #LF$+ StrF(speed,0) +#LF$+ StrF(speed-speed_old,2))
SetGadgetText3D(4," " + #LF$+" X" + #LF$+ " Z"+ #LF$+" Y")
SetGadgetText3D(5,"angles"+ #LF$+ StrF(Degree(ASin(z_y)),1) + #LF$+ StrF(Degree(ASin(x_y)),1)+ #LF$+ StrF(Degree(vinkel),1))
SetGadgetText3D(6,"pos"+ #LF$+ StrF(EntityX(#My_vehicle),0) + #LF$+ StrF(EntityZ(#My_vehicle),0)+ #LF$+ StrF(EntityY(#My_vehicle),0))
SetGadgetText3D(8,"Cam"+ #LF$+ "range"+ #LF$ + Str(cc))
SetGadgetText3D(9,"High "+ #LF$+ StrF(high,2)+ #LF$ + StrF(high-high_o,3))
; 4 lines down only works in windowed mode
; StartDrawing(WindowOutput(0))
; LineXY(xx,yy,xx+ Cos(vinkel )*-30,yy+Sin(vinkel)*-30)
; LineXY(xx+50,yy,xx+50+Cos(vinkel2)*-30,yy+Sin(vinkel2)*-30)
; StopDrawing()
RenderWorld()
FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape); Or Quit = 1
EndProcedure
Procedure loop2()
CreateCamera(#Camera1, 0, 0, 100, 100)
#Camera1Speed = 1
Define MouseX,Mousey,KeyX,KeyY, rnd
MoveCamera(#Camera1,50,150,70)
CameraLookAt(#Camera1,50,0,30)
Repeat
If ExamineMouse()
MouseX = -MouseDeltaX() * #Camera1Speed * 0.05
MouseY = -MouseDeltaY() * #Camera1Speed * 0.05
EndIf
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_M):maze_Algorithm():EndIf
If KeyboardPushed(#PB_Key_Left)
KeyX = -#Camera1Speed
ElseIf KeyboardPushed(#PB_Key_Right)
KeyX = #Camera1Speed
Else
KeyX = 0
EndIf
If KeyboardPushed(#PB_Key_Up)
KeyY = -#Camera1Speed
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY = #Camera1Speed
Else
KeyY = 0
EndIf
EndIf
MoveCamera (0, KeyX, 0, KeyY)
RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
RenderWorld()
;Screen3DStats()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Q)
EndProcedure
Procedure maze_Algorithm()
; Recursive Backtracking
Static.i open, right,left,up,down,test
Static.i x,y, stack,rnd,a
If test = 0 ; fist call
#visited=0
#unvisited=1
For x=1 To #x_upl
For y=1 To #y_upl
maze(x,y)=#unvisited
Next y
Next x
rx(1)=1 ;Right
rx(2)=-1 ;Left
ry(3)=-1 ;up
ry(4)=1 ;down
x=#x_start
y=#y_start
test=1
Else ; other call
;Repeat
a+1
open=0
Right=#visited
left=#visited
up=#visited
down=#visited
If maze(x+1,y)=#unvisited :open+1:Right=#unvisited :EndIf
If maze(x-1,y)=#unvisited :open+1:Left=#unvisited :EndIf
If maze(x,y-1)=#unvisited :open+1:up=#unvisited :EndIf
If maze(x,y+1)=#unvisited :open+1:down=#unvisited :EndIf
If open=0
If stack=0: ProcedureReturn 1:EndIf
maze(x,y)=#visited
stack-1 :x=x(stack) : y=y(stack) ;:draw(x,y,#Gray,100)
Else
rnd=Random(open,1);: rnd=rnd_o
If Right=#visited And rnd>0: rnd+1: EndIf
If left =#visited And rnd>1: rnd+1: EndIf
If up =#visited And rnd>2: rnd+1: EndIf
If down =#visited And rnd>3: rnd+1: EndIf
delete_maze_entitys(x,y,rx(rnd),ry(rnd)):
maze(x,y)=#visited : x+rx(rnd) : y+ry(rnd) : x(stack)=x : y(stack)=y :stack+1
EndIf
;If stack=0 : Break: EndIf
;ForEver
EndIf
EndProcedure
Procedure delete_maze_entitys(x,y,rx,ry)
del+1
; SetGadgetText3D(1,"x: " + #LF$+ Str(x)+#LF$+ Str(rx))
; SetGadgetText3D(2,"y: " + #LF$+ Str(y)+#LF$+ Str(ry))
;SetGadgetText3D(1,"deleted" + #LF$+ "walls" + #LF$+ Str(del)+#LF$+ Str(#x_upl*#y_upl-1))
Define ent
If rx : ent=x+Sign(rx-1)+(y+ry)*#x_upl2+#ent:EndIf
If ry : ent=x+rx+(y+Sign(ry-1))*#x_upl2+#ent+#x_upl2*#y_upl2 :EndIf
If IsEntity(ent): FreeEntity(ent):EndIf
EndProcedure
Procedure OpenWindow_3D(c)
Protected.i a , b , sc_h
sc_h=ScreenHeight()*0.12
OpenWindow3D(1, 4, 3, ScreenWidth()-8, sc_h, "",#PB_Window3D_Borderless)
ShowGUI(200, 0,#Camera2,0)
b=ScreenWidth()/((c+1)*1.03)
For a=0 To c
TextGadget3D(a, 10+a * b, 0, 152, sc_h, "")
Next a
EndProcedure