영상 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()
답변할라고 영상3개 다 보기에는 시간아까운대 코드보여주샘
수정해서 다시 올렸음
get_cell함수로 랜덤위치의 타일맵 가져와서 검은배경이면 set_cell로 타일맵 설정해주면 대지 안을가???
오 ㄱㅅ ㄱㅅ
창작.일지탭에.. 내 part2 보면 다 나와있음. 동일한 주제임.