https://youtu.be/2nk6bJBTtlA


https://youtu.be/1O83wdW5hAs


https://youtu.be/K7sKUuSd8ME


영상 3개보고 어느정도 이해했는 데 전체 검은색 배경에서 랜덤으로 지우고 지운 칸을 다른 타일 맵으로 채우는 방법이 궁금함

유튭에 뒤져봐도 없더라...ㅠ

*수정

Walker 노드 스크립트

extends Node

class_name Walker


const DIRECTIONS = [Vector2.RIGHT, Vector2.UP, Vector2.LEFT, Vector2.DOWN]


var position = Vector2.ZERO

var direction = Vector2.RIGHT

var borders = Rect2()

var step_history = []

var steps_since_turn = 0

var rooms = []


func _init(starting_position, new_borders):

assert(new_borders.has_point(starting_position))

position = starting_position

step_history.append(position)

borders = new_borders


func walk(steps):

place_room(position)

for step in steps:

if steps_since_turn >= 6:

change_direction()

if step():

step_history.append(position)

else:

change_direction()

return step_history


func step():

var target_position = position + direction

if borders.has_point(target_position):

steps_since_turn += 1

position = target_position

return true

else:

return false


func change_direction():

place_room(position)

steps_since_turn = 0

var directions = DIRECTIONS.duplicate()

directions.erase(direction)

directions.shuffle()

direction = directions.pop_front()

while not borders.has_point(position + direction):

direction = directions.pop_front()


func create_room(position, size):

return {position = position, size = size}


func place_room(position):

var size = Vector2(randi() % 4 + 2, randi() % 4 + 2)

var top_left_corner = (position - size/2).ceil()

rooms.append(create_room(position, size))

for y in size.y:

for x in size.x:

var new_step = top_left_corner + Vector2(x, y)

if borders.has_point(new_step):

step_history.append(new_step)


func get_end_room():

var end_room = rooms.pop_front()

var starting_position = step_history.front()

for room in rooms:

if starting_position.distance_to(room.position) > starting_position.distance_to(end_room.position):

end_room = room

return end_room

*World 노드 스크립트

extends Node2D


const Player = preload("res://Player.tscn")

const Exit = preload("res://ExitDoor.tscn")


var borders = Rect2(1, 1, 38, 21)


onready var tileMap = $TileMap


func _ready():

randomize()

generate_level()


func generate_level():

var walker = Walker.new(Vector2(19, 11), borders)

var map = walker.walk(200)

var player = Player.instance()

add_child(player)

player.position = map.front()*32

var exit = Exit.instance()

add_child(exit)

exit.position = walker.get_end_room().position*32

exit.connect("leaving_level", self, "reload_level")

walker.queue_free()

for location in map:

tileMap.set_cellv(location, -1)

tileMap.update_bitmask_region(borders.position, borders.end)


func reload_level():

get_tree().reload_current_scene()


func _input(event):

if event.is_action_pressed("ui_accept"):

reload_level()