Pada edisi terakhir ini, saya akan menyertakan kode program dari algoritmanya.
Ada dua kode yang akan saya taruh disini. Yang pertama adalah kode untuk algoritma membuat dungeon 2D. Yang kedua adalah kode untuk algoritma membuat dungeon 3D.
Perbedaannya tidak terlalu banyak. Untuk dungeon 3D, saya hanya menambahkan fungsi untuk membuat 3D-nya saja.
Dungeon 2D Code:
;Dungeon Maker 2D
;By Fajar Nur Rokhman
;simple_gartne@yahoo.com
;http://www.dg-studio.blogspot.com
;************************************
;====================================
Graphics 640,480,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Global img_path=LoadAnimImage("back2.bmp",32,32,0,16)
Global img_door=LoadImage("door.png")
Global img_grass=LoadImage("grass.png")
Global img_room=LoadImage("floor.png")
;const dir
Const north=8 ;1000
Const east=2 ;0010
Const west=1 ;0001
Const south=4 ;0100
Dim dir(4)
dir(1)=north
dir(2)=east
dir(3)=west
dir(4)=south
;const map
Const mapx=10
Const mapy=10
Const mapmax=mapx*mapy
Type tmap
Field wall
Field room
Field check
Field door
End Type
Dim map(mapx,mapy)
Dim map3.tmap(mapx*3,mapy*3)
For x=1 To mapx*3
For y=1 To mapy*3
map3.tmap(x,y) = New tmap
Next
Next
;const node
Const xx=1
Const yy=2
Const stat=3
Global node_ctr=0
Dim node(mapx*mapy*3,3)
Global camx=0
Global camy=0
make_maze()
;pacmaze()
scale()
connect()
set_room_first()
set_room()
clean_room()
set_door()
.main
While Not KeyHit(1)
Cls
draw_map3()
keyboard()
Text 0,0,"arrow move around"
Text 0,15,"n = new dungeon"
Flip
Wend
End
Function make_maze()
;clear map
For x=1 To mapx
For y=1 To mapy
map(x,y)=0
Next
Next
;first node
map(4,4)=east
map(5,4)=west
While True
node_ctr=0
For x = 1 To mapx
For y = 1 To mapy
If map(x,y)=0
find=False
;up
If (y>1)
If (map(x,y-1))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
;right
If find=False
If (x<mapx)
If (map(x+1,y))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
EndIf
;left
If find=False
If (x>1)
If (map(x-1,y))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
EndIf
;down
If find=False
If (y<mapy)
If (map(x,y+1))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
EndIf
EndIf
Next
Next
;no more open
If node_ctr=0 Then Return
;select random
rctr=Rand(1,node_ctr)
;random path
For x= 1 To 10
b=Rand(1,4)
c=Rand(1,4)
d=dir(b)
dir(b)=dir(c)
dir(c)=d
Next
;create path
For x = 1 To 4
If dir(x)=north
If node(rctr,yy)>1
If map(node(rctr,xx),node(rctr,yy)-1)
map(node(rctr,xx),node(rctr,yy)) = map(node(rctr,xx),node(rctr,yy)) Or north
map(node(rctr,xx),node(rctr,yy)-1)= map(node(rctr,xx),node(rctr,yy)-1) Or south
Exit
EndIf
EndIf
ElseIf dir(x)=south
If node(rctr,yy)<mapy
If map(node(rctr,xx),node(rctr,yy)+1)
map(node(rctr,xx),node(rctr,yy))= map(node(rctr,xx),node(rctr,yy)) Or south
map(node(rctr,xx),node(rctr,yy)+1)= map(node(rctr,xx),node(rctr,yy)+1) Or north
Exit
EndIf
EndIf
ElseIf dir(x)=east
If node(rctr,xx)<mapx
If map(node(rctr,xx)+1,node(rctr,yy))
map(node(rctr,xx),node(rctr,yy))=map(node(rctr,xx),node(rctr,yy)) Or east
map(node(rctr,xx)+1,node(rctr,yy))= map(node(rctr,xx)+1,node(rctr,yy)) Or west
Exit
EndIf
EndIf
ElseIf dir(x)=west
If node(rctr,xx)>1
If map(node(rctr,xx)-1,node(rctr,yy))
map(node(rctr,xx),node(rctr,yy))= map(node(rctr,xx),node(rctr,yy)) Or west
map(node(rctr,xx)-1,node(rctr,yy))= map(node(rctr,xx)-1,node(rctr,yy)) Or east
Exit
EndIf
EndIf
EndIf
Next
;Cls
;draw_map()
;Flip
;WaitKey()
Wend
End Function
;Function draw_map()
; For x=1 To mapx
; For y=1 To mapy
; DrawImage img_path,x*32-32,y*32-32,map(x,y)
; Next
; Next
;
;End Function
;Function pacmaze()
; While True
; finish=True
;
; For x=1 To mapx
; For y=1 To mapy
; If map(x,y)=north
; If y<mapy
; map(x,y+1)=map(x,y+1) Or north
; map(x,y) = map(x,y) Or south
; finish=False
; EndIf
;
; ElseIf map(x,y)=south
; If y>1
; map(x,y) =map(x,y) Or north
; map(x,y-1) = map(x,y-1) Or south
; finish=False
; EndIf
;
; ElseIf map(x,y)=east
; If x>1
; map(x,y) = map(x,y) Or west
; map(x-1,y) = map(x-1,y) Or east
; finish=False
; EndIf
;
; ElseIf map(x,y)=west
; If x<mapx
; map(x,y) = map(x,y) Or east
; map(x+1,y) = map(x+1,y) Or west
; finish=False
; EndIf
;
; EndIf
; Next
; Next
;
; Cls
; draw_map()
; Flip
;
; If finish Then Return
;
; Wend
;End Function
Function scale()
For x=1 To mapx
For y=1 To mapy
map3(x*3-2,y*3-2)\wall=map(x,y)
Next
Next
End Function
;Function draw_map2()
; For x=1 To mapx*3-1
; For y=1 To mapy*3-1
;
; z=map3(x,y)\wall
;
; If map3(x,y)\room Then DrawImage img_room,x*32-32,y*32-32
;
; If map3(x,y)\room=False
; If z>0
; DrawImage img_grass,x*32-32,y*32-32
; EndIf
; EndIf
;
; If map3(x,y)\door Then DrawImage img_door,x*32-32,y*32-32
;
; If z>0 Then DrawImage img_path,x*32-32,y*32-32,z
;
; ;If z=0 Then Text x*32-32,y*32-32,z
;
; Next
; Next
;End Function
Function draw_map3()
For x=1 To 20
For y=1 To 15
If camx+x<=(mapx*3)
If camy+y<=(mapy*3)
z=map3(camx+x,camy+y)\wall
xm=x*32-32
ym=y*32-32
If map3(camx+x,camy+y)\room Then DrawImage img_room,xm,ym
If map3(camx+x,camy+y)\room=False
If z>0 Then DrawImage img_grass,xm,ym
EndIf
If map3(camx+x,camy+y)\door Then DrawImage img_door,xm,ym
If z>0 Then DrawImage img_path,xm,ym,z
;If z=0 Then Text xm,ym,z
;Text xm,ym,z
EndIf
EndIf
Next
Next
End Function
Function connect()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
z=map3(x,y)\wall
If z=0
;north
If y>1
If map3(x,y-1)\wall And south
map3(x,y)\wall=map3(x,y)\wall Or north
map3(x,y)\wall=map3(x,y)\wall Or south
EndIf
EndIf
;east
If x>1
If map3(x-1,y)\wall And east
map3(x,y)\wall=map3(X,y)\wall Or west
map3(x,y)\wall=map3(X,y)\wall Or east
EndIf
EndIf
EndIf
Next
Next
End Function
Function set_room_first()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
z=map3(x,y)\wall
If z=north
map3(x,y)\room=True
map3(x,y-1)\room=True
EndIf
If z=south
map3(x,y)\room=True
map3(x,y+1)\room=True
EndIf
If z=east
map3(x,y)\room=True
map3(x+1,y)\room=True
EndIf
If z=west
map3(x,y)\room=True
map3(x-1,y)\room=True
EndIf
Next
Next
End Function
Function set_room()
find=True
While find
find=False
For x=1 To (mapx*3-1)
For y=1 To (mapy*3-1)
If map3(x,y)\room
If map3(x,y)\check=False
map3(x,y)\check=True
find=True
;north
If y>1
If map3(x,y-1)\wall=0
map3(x,y-1)\room=True
map3(x,y-1)\wall=map3(x,y-1)\wall Or south
;map3(x,y)\wall = map3(x,y)\wall Or north
EndIf
EndIf
;south
If y<(mapy*3-2)
If map3(x,y+1)\wall=0
map3(x,y+1)\room=True
map3(x,y+1)\wall=map3(x,y+1)\wall Or north
;map3(x,y)\wall=map3(x,y)\wall Or south
EndIf
EndIf
;east
If x<(mapx*3-2)
If map3(x+1,y)\wall=0
map3(x+1,y)\room=True
map3(x+1,y)\wall=map3(x+1,y)\wall Or west
;map3(x,y)\wall=map3(x,y)\wall Or east
EndIf
EndIf
;west
If x>1
If map3(x-1,y)\wall=0
map3(x-1,y)\room=True
map3(x-1,y)\wall=map3(x-1,y)\wall Or east
;map3(x,y)\wall=map3(x,y)\wall Or west
EndIf
EndIf
EndIf
EndIf
;Cls
;draw_map3()
;Flip
Next
Next
Wend
End Function
Function clean_room()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
map3(x,y)\check=False
Next
Next
find=True
While find
find=False
For x=1 To mapx*3-1
For y=1 To mapy*3-1
If map3(x,y)\room
If map3(x,y)\check=False
map3(x,y)\check=True
;north
If y>1
If map3(x,y-1)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or north
map3(x,y-1)\wall=map3(x,y-1)\wall Or south
EndIf
EndIf
;south
If y<(mapy*3-1)
If map3(x,y+1)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or south
map3(x,y+1)\wall=map3(x,y+1)\wall Or north
EndIf
EndIf
;east
If x<(mapx*3-1)
If map3(x+1,y)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or east
map3(x+1,y)\wall=map3(x+1,y)\wall Or west
EndIf
EndIf
;west
If x>1
If map3(x-1,y)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or west
map3(x-1,y)\wall=map3(x-1,y)\wall Or east
EndIf
EndIf
EndIf
EndIf
Next
Next
Wend
End Function
Function set_door()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
If map3(x,y)\room
;north
If y>1
If map3(x,y-1)\room=False
If map3(x,y)\wall And north
map3(x,y-1)\door=True
EndIf
EndIf
EndIf
;south
If y<mapy*3-1
If map3(x,y+1)\room=False
If map3(x,y)\wall And south
map3(x,y+1)\door=True
EndIf
EndIf
EndIf
;west
If x>1
If map3(x-1,y)\room=False
If map3(x,y)\wall And west
map3(x-1,y)\door=True
EndIf
EndIf
EndIf
;east
If x<mapx*3-1
If map3(x+1,y)\room=False
If map3(x,y)\wall And east
map3(x+1,y)\door=True
EndIf
EndIf
EndIf
EndIf
Next
Next
End Function
Function keyboard()
;up
If KeyHit(200)
camy=camy-1
If camy<0 Then camy=0
EndIf
;left
If KeyHit(203)
camx=camx-1
If camx<0 Then camx=0
EndIf
;right
If KeyHit(205)
camx=camx+1
If camx>(mapx*3-20) Then camx=mapx*3-20
EndIf
;down
If KeyHit(208)
camy=camy+1
If camy>(mapy*3-14) Then camy=mapy*3-14
EndIf
;n
If KeyHit(49)
init_dungeon()
EndIf
End Function
Function init_dungeon()
;clear data
For x=1 To mapx*3
For y=1 To mapy*3
map3(x,y)\wall=0
map3(x,y)\room=0
map3(x,y)\check=0
map3(x,y)\door=0
Next
Next
make_maze()
;pacmaze()
scale()
connect()
set_room_first()
set_room()
clean_room()
set_door()
End Function
Dungeon 3D Code:
Graphics3D 640,480,16,2
Graphics3D 320,240,16,3
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;WireFrame 1
Global img_path=LoadAnimImage("back2.bmp",32,32,0,16)
Global img_door=LoadImage("door.png")
Global img_grass=LoadImage("grass.png")
Global img_room=LoadImage("floor.png")
;const dir
Const north=8 ;1000
Const east=2 ;0010
Const west=1 ;0001
Const south=4 ;0100
Dim dir(4)
dir(1)=north
dir(2)=east
dir(3)=west
dir(4)=south
;const map
Const mapx=10
Const mapy=7
Const mapmax=mapx*mapy
Type tmap
Field wall
Field room
Field check
Field door
End Type
Dim map(mapx,mapy)
Dim map3.tmap(mapx*3,mapy*3)
For x=1 To mapx*3
For y=1 To mapy*3
map3.tmap(x,y) = New tmap
Next
Next
;const node
Const xx=1
Const yy=2
Const stat=3
Global node_ctr=0
Dim node(mapx*mapy*3,3)
Global camx=0
Global camy=0
Global ndoor=0
;3d
Global camera=CreateCamera()
EntityRadius camera,50
light=CreateLight(1,camera)
PositionEntity camera,250,100,-250
EntityType camera,1
CameraFogMode camera,1
;CameraRange camera,1,500
TurnEntity camera,0,180,0
Global wall=LoadMesh("wall.3ds")
Global flr=LoadMesh("floor.3ds")
Global grass=LoadMesh("grass.3ds")
Global m_door=LoadMesh("door.3ds")
Global mesh=CreateMesh()
EntityType mesh,3
Type tdoor
Field mesh
Field stat ;1=up 2=down
Field timer
End Type
Collisions 1,2,2,1
Collisions 1,3,2,2
make_maze()
;pacmaze()
scale()
connect()
set_room_first()
set_room()
clean_room()
set_door()
make3d()
.main
While Not KeyHit(1)
Cls
;draw_map3()
keyboard3d()
UpdateWorld()
RenderWorld()
door_open()
Text 0,0,"arrow = move around"
Text 0,15,"n = new dungeon"
Flip
Wend
End
Function make_maze()
;clear map
For x=1 To mapx
For y=1 To mapy
map(x,y)=0
Next
Next
;first node
map(4,4)=east
map(5,4)=west
While True
node_ctr=0
For x = 1 To mapx
For y = 1 To mapy
If map(x,y)=0
find=False
;up
If (y>1)
If (map(x,y-1))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
;right
If find=False
If (x<mapx)
If (map(x+1,y))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
EndIf
;left
If find=False
If (x>1)
If (map(x-1,y))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
EndIf
;down
If find=False
If (y<mapy)
If (map(x,y+1))
node_ctr=node_ctr+1
node(node_ctr,xx)=x
node(node_ctr,yy)=y
find=True
EndIf
EndIf
EndIf
EndIf
Next
Next
;no more open
If node_ctr=0 Then Return
;select random
rctr=Rand(1,node_ctr)
;random path
For x= 1 To 10
b=Rand(1,4)
c=Rand(1,4)
d=dir(b)
dir(b)=dir(c)
dir(c)=d
Next
;create path
For x = 1 To 4
If dir(x)=north
If node(rctr,yy)>1
If map(node(rctr,xx),node(rctr,yy)-1)
map(node(rctr,xx),node(rctr,yy)) = map(node(rctr,xx),node(rctr,yy)) Or north
map(node(rctr,xx),node(rctr,yy)-1)= map(node(rctr,xx),node(rctr,yy)-1) Or south
Exit
EndIf
EndIf
ElseIf dir(x)=south
If node(rctr,yy)<mapy
If map(node(rctr,xx),node(rctr,yy)+1)
map(node(rctr,xx),node(rctr,yy))= map(node(rctr,xx),node(rctr,yy)) Or south
map(node(rctr,xx),node(rctr,yy)+1)= map(node(rctr,xx),node(rctr,yy)+1) Or north
Exit
EndIf
EndIf
ElseIf dir(x)=east
If node(rctr,xx)<mapx
If map(node(rctr,xx)+1,node(rctr,yy))
map(node(rctr,xx),node(rctr,yy))=map(node(rctr,xx),node(rctr,yy)) Or east
map(node(rctr,xx)+1,node(rctr,yy))= map(node(rctr,xx)+1,node(rctr,yy)) Or west
Exit
EndIf
EndIf
ElseIf dir(x)=west
If node(rctr,xx)>1
If map(node(rctr,xx)-1,node(rctr,yy))
map(node(rctr,xx),node(rctr,yy))= map(node(rctr,xx),node(rctr,yy)) Or west
map(node(rctr,xx)-1,node(rctr,yy))= map(node(rctr,xx)-1,node(rctr,yy)) Or east
Exit
EndIf
EndIf
EndIf
Next
;Cls
;draw_map()
;Flip
;WaitKey()
Wend
End Function
Function scale()
For x=1 To mapx
For y=1 To mapy
map3(x*3-2,y*3-2)\wall=map(x,y)
Next
Next
End Function
Function connect()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
z=map3(x,y)\wall
If z=0
;north
If y>1
If map3(x,y-1)\wall And south
map3(x,y)\wall=map3(x,y)\wall Or north
map3(x,y)\wall=map3(x,y)\wall Or south
EndIf
EndIf
;east
If x>1
If map3(x-1,y)\wall And east
map3(x,y)\wall=map3(X,y)\wall Or west
map3(x,y)\wall=map3(X,y)\wall Or east
EndIf
EndIf
EndIf
Next
Next
End Function
Function set_room_first()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
z=map3(x,y)\wall
If z=north
map3(x,y)\room=True
map3(x,y-1)\room=True
EndIf
If z=south
map3(x,y)\room=True
map3(x,y+1)\room=True
EndIf
If z=east
map3(x,y)\room=True
map3(x+1,y)\room=True
EndIf
If z=west
map3(x,y)\room=True
map3(x-1,y)\room=True
EndIf
Next
Next
End Function
Function set_room()
find=True
While find
find=False
For x=1 To (mapx*3-1)
For y=1 To (mapy*3-1)
If map3(x,y)\room
If map3(x,y)\check=False
map3(x,y)\check=True
find=True
;north
If y>1
If map3(x,y-1)\wall=0
map3(x,y-1)\room=True
map3(x,y-1)\wall=map3(x,y-1)\wall Or south
;map3(x,y)\wall = map3(x,y)\wall Or north
EndIf
EndIf
;south
If y<(mapy*3-2)
If map3(x,y+1)\wall=0
map3(x,y+1)\room=True
map3(x,y+1)\wall=map3(x,y+1)\wall Or north
;map3(x,y)\wall=map3(x,y)\wall Or south
EndIf
EndIf
;east
If x<(mapx*3-2)
If map3(x+1,y)\wall=0
map3(x+1,y)\room=True
map3(x+1,y)\wall=map3(x+1,y)\wall Or west
;map3(x,y)\wall=map3(x,y)\wall Or east
EndIf
EndIf
;west
If x>1
If map3(x-1,y)\wall=0
map3(x-1,y)\room=True
map3(x-1,y)\wall=map3(x-1,y)\wall Or east
;map3(x,y)\wall=map3(x,y)\wall Or west
EndIf
EndIf
EndIf
EndIf
;Cls
;draw_map3()
;Flip
Next
Next
Wend
End Function
Function clean_room()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
map3(x,y)\check=False
Next
Next
find=True
While find
find=False
For x=1 To mapx*3-1
For y=1 To mapy*3-1
If map3(x,y)\room
If map3(x,y)\check=False
map3(x,y)\check=True
;north
If y>1
If map3(x,y-1)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or north
map3(x,y-1)\wall=map3(x,y-1)\wall Or south
EndIf
EndIf
;south
If y<(mapy*3-1)
If map3(x,y+1)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or south
map3(x,y+1)\wall=map3(x,y+1)\wall Or north
EndIf
EndIf
;east
If x<(mapx*3-1)
If map3(x+1,y)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or east
map3(x+1,y)\wall=map3(x+1,y)\wall Or west
EndIf
EndIf
;west
If x>1
If map3(x-1,y)\room
find=True
map3(x,y)\wall=map3(x,y)\wall Or west
map3(x-1,y)\wall=map3(x-1,y)\wall Or east
EndIf
EndIf
EndIf
EndIf
Next
Next
Wend
End Function
Function set_door()
For x=1 To mapx*3-1
For y=1 To mapy*3-1
If map3(x,y)\room
;north
If y>1
If map3(x,y-1)\room=False
If map3(x,y)\wall And north
map3(x,y-1)\door=True
ndoor=ndoor+1
EndIf
EndIf
EndIf
;south
If y<mapy*3-1
If map3(x,y+1)\room=False
If map3(x,y)\wall And south
map3(x,y+1)\door=True
ndoor=ndoor+1
EndIf
EndIf
EndIf
;west
If x>1
If map3(x-1,y)\room=False
If map3(x,y)\wall And west
map3(x-1,y)\door=True
ndoor=ndoor+1
EndIf
EndIf
EndIf
;east
If x<mapx*3-1
If map3(x+1,y)\room=False
If map3(x,y)\wall And east
map3(x+1,y)\door=True
ndoor=ndoor+1
EndIf
EndIf
EndIf
EndIf
Next
Next
End Function
Function keyboard()
;up
If KeyHit(200)
camy=camy-1
If camy<0 Then camy=0
EndIf
;left
If KeyHit(203)
camx=camx-1
If camx<0 Then camx=0
EndIf
;right
If KeyHit(205)
camx=camx+1
If camx>(mapx*3-20) Then camx=mapx*3-20
EndIf
;down
If KeyHit(208)
camy=camy+1
If camy>(mapy*3-14) Then camy=mapy*3-14
EndIf
End Function
Function make3d()
For y=1 To mapy*3
For x=1 To mapx*3
If map3(x,y)\room
flr2=CopyMesh(flr)
PositionMesh flr2,x*10,0,-y*10
AddMesh flr2,mesh
FreeEntity flr2
EndIf
If map3(x,y)\room=False
If map3(x,y)\wall
grass2=CopyMesh(grass)
PositionMesh grass2,x*10,0,-y*10
AddMesh grass2,mesh
FreeEntity grass2
EndIf
EndIf
If map3(x,y)\door
door.tdoor= New tdoor
door\mesh=CopyEntity(m_door)
EntityType door\mesh,2
door\stat=0
If map3(x,y)\wall And east
RotateEntity door\mesh,0,90,0
EndIf
PositionEntity door\mesh,x*200,0,-y*200
ScaleEntity door\mesh,20,20,20
EntityType door\mesh,2
EndIf
;north
If (map3(x,y)\wall And north) <> north
wall2=CopyMesh(wall)
PositionMesh wall2,x*10,0,-y*10
AddMesh wall2,mesh
FreeEntity wall2
;DebugLog map3(x,y)\wall
;DebugLog map3(x,y)\wall And north
;Stop
EndIf
;west
If (map3(x,y)\wall And west) <> west
wall2=CopyMesh(wall)
RotateMesh wall2,0,90,0
PositionMesh wall2,x*10,0,-y*10
AddMesh wall2,mesh
FreeEntity wall2
EndIf
;east
If (map3(x,y)\wall And east) <> east
wall2=CopyMesh(wall)
RotateMesh wall2,0,-90,0
PositionMesh wall2,x*10,0,-y*10
AddMesh wall2,mesh
FreeEntity wall2
EndIf
;south
If (map3(x,y)\wall And south) <> south
wall2=CopyMesh(wall)
RotateMesh wall2,0,180,0
PositionMesh wall2,x*10,0,-y*10
AddMesh wall2,mesh
FreeEntity wall2
EndIf
Next
Next
ScaleEntity mesh,20,20,20
End Function
Function keyboard3d()
;up
If KeyDown(200)
MoveEntity camera,0,0,10
EndIf
;left
If KeyDown(203)
TurnEntity camera,0,3,0
EndIf
;right
If KeyDown(205)
TurnEntity camera,0,-3,0
EndIf
;down
If KeyDown(208)
MoveEntity camera,0,0,-10
EndIf
;n
If KeyHit(49)
init_dungeon()
EndIf
End Function
Function door_open()
For door.tdoor = Each tdoor
If door\stat=0
If EntityCollided(camera,2)=door\mesh
door\stat=1
EndIf
ElseIf door\stat=1
MoveEntity door\mesh,0,5,0
If EntityY(door\mesh)>200
door\stat=3
door\timer=MilliSecs()
EndIf
ElseIf door\stat=2
MoveEntity door\mesh,0,-5,0
If EntityY(door\mesh)<0 Then
door\stat=0
PositionEntity door\mesh,EntityX(door\mesh),0,EntityZ(door\mesh)
EndIf
ElseIf door\stat=3
If MilliSecs()>(door\timer+3000)
door\stat=2
EndIf
EndIf
Next
End Function
Function init_dungeon()
;clear mesh
FreeEntity mesh
mesh=CreateMesh()
EntityType mesh,3
;clear door
For door.tdoor = Each tdoor
FreeEntity door\mesh
Delete door
Next
;clear data
For x=1 To mapx*3
For y=1 To mapy*3
map3(x,y)\wall=0
map3(x,y)\room=0
map3(x,y)\check=0
map3(x,y)\door=0
Next
Next
PositionEntity camera,250,100,-250
make_maze()
;pacmaze()
scale()
connect()
set_room_first()
set_room()
clean_room()
set_door()
make3d()
End Function
Kode ini berjalan pada Blitz3D. Untuk gambar dan resource yang lain, sudah saya sertakan pada download dari demonya pada article 2 edisi yang lalu
Tulisan Sebelumnya:
Dungeon Maker Algoritma (2)




5 komentar:
buat game ya aku boleh nyoba gak game buatan kk kasih link nya ya
lihat aja di bagian dgs-game pada bagian categori, disitu ada game-game yang dibuat secara iseng.
untuk game yang bagus sepertinya masih nunggu kolaborasi
please don't delete your comment.
kalau selah edit aja komentnya, tapi jangan dihapus yah
Poskan Komentar