Selasa, 22 September 2009

DUNGEON MAKER ALGORITMA (3)

Ini adalah edisi terakhir dari tulisan saya dari algoritma pembuat dungeon.

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:

cholid __G (cholid zufar) mengatakan...
Komentar ini telah dihapus oleh penulis.
cholid __G (cholid zufar) mengatakan...

buat game ya aku boleh nyoba gak game buatan kk kasih link nya ya

Kermit mengatakan...

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

Haqqi mengatakan...
Komentar ini telah dihapus oleh penulis.
Kermit mengatakan...

please don't delete your comment.

kalau selah edit aja komentnya, tapi jangan dihapus yah