3d maze

Applications, Games, Tools, User libs and useful stuff coded in PureBasic
Realizimo
User
User
Posts: 71
Joined: Sun Nov 25, 2012 5:27 pm
Location: Sweden

3d maze

Post by Realizimo »

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
User avatar
electrochrisso
Addict
Addict
Posts: 989
Joined: Mon May 14, 2007 2:13 am
Location: Darling River

Re: 3d maze

Post by electrochrisso »

8) This looks like a good start to some kind of 3D Maze game, thanks for sharing. :)
PureBasic! Purely the best 8)
dige
Addict
Addict
Posts: 1406
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Re: 3d maze

Post by dige »

:shock: Amazing!! Thank you Realizimo :D
"Daddy, I'll run faster, then it is not so far..."
Post Reply