Why does Godot play window lock up on me?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By MikeyZman

Hi All, Thanks in advance for any help. Im going through this godot tutorial on a rogue 2d game and Im basically up to the 11:00 mark where he does a quick test of the code before he goes any further (too far to quickly debug).

When I hit the play button, the game window pops up, but freezes, and after about 10 seconds it fails to respond altogether and you get the windows spin icon forever so you have to kill the app altogether.

I’ve done as much novice troubleshooting as I can, but there’s no errors or warnings going into the play sequence. I’ve checked the code 50 times, it matches the demo, and partially works some times. I’ve set print statements, etc to troubleshoot to see how far its getting and it seems to be completing compilation but the window still just hangs.

I’m usiing Godot 3.2

The problem has to do with this code out of the entire script. If I comment out any 3 if statements below, the play window will run. if I do certain combinations of just 2 if statements with the other 2 commented out, it will play as well. My suspicion is the calculations are bogging something down or theres an undefined product or zero sum or something.

And I dont’ get any command window errors, BTW

if leftover_left >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(region.position, Vector2(leftover_left, region.size.y)))
		if leftover_right >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(Vector2(region_to_remove.end.x + 1, region.position.y), Vector2(leftover_right, region.size.y)))
		if leftover_above >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(region.position, Vector2(region.size.x, leftover_above)))	
		if leftover_below >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(Vector2(region.position.x, region_to_remove.end.y + 1), Vector2(region.size.x, leftover_below)))

Here is my entire script:

extends Node2D

const TILE_SIZE = 32

const LEVEL_SIZES = [
Vector2(30,30),
Vector2(35,35),
Vector2(40,40),
Vector2(45,45),
Vector2(50,50),
]

const LEVEL_ROOM_COUNTS = [5,7,9,12,15]
const MIN_ROOM_DIMENSION = 5
const MAX_ROOM_DIMENSION = 8

enum Tile {Wall, Door, Floor, Ladder, Marble, food3, light, Marble}

Current level ---------------------------

var level_num = 0
var map =
var rooms =
var level_size

#node refs --------------------------------

onready means this value was added after

the node and its children in the scene

otherwise the children might not exist yet

to get a reference to them

onready var tile_map = $TileMap
onready var player = $Player

#Game State -------------------------------
var player_tile
var score = 0

Called when the node enters the scene tree for the first time.

func _ready():
OS.set_window_size(Vector2(1280,720))
randomize()
build_level()

func build_level():

Start with a blank map

rooms.clear()	
map.clear()
tile_map.clear()

level_size = LEVEL_SIZES[level_num]
for x in range(level_size.x):
	map.append([])
	for y in range(level_size.y):
		map[x].append(Tile.Marble)
		tile_map.set_cell(x, y, Tile.Marble)  #default fill map with Marble
		
# start with 2 tile region that leaves 2 tiles around entire level
var free_regions = [Rect2(Vector2(2,2), level_size - Vector2(4,4))]
var num_rooms = LEVEL_ROOM_COUNTS[level_num] # look up number of rooms for level
for _j in range (num_rooms):
	add_room(free_regions)
	if free_regions.empty():
		break

connect_rooms()

###func connect_rooms():

var stone_graph = AStar.new()

var point_id = 0

for x in range (level_size.x):

if map[y] == Tile.Stone:

stone_graph.add_point(point_id, Vector3(x, y, 0))

func add_room(free_regions):
var region = free_regions[randi() % free_regions.size()] #modulus operation

#see if we can grow the minimum room size, first set the default to min
var size_x = MIN_ROOM_DIMENSION
#check to see if room can be bigger
if region.size.x > MIN_ROOM_DIMENSION:
size_x += randi() % int(region.size.x - MIN_ROOM_DIMENSION)

var size_y = MIN_ROOM_DIMENSION
if region.size.y > MIN_ROOM_DIMENSION:
	size_y += randi() % int(region.size.y - MIN_ROOM_DIMENSION)	

#8:15 constrain max dimension
size_x = min(size_x, MAX_ROOM_DIMENSION)
size_y = min(size_y, MAX_ROOM_DIMENSION)

#now choose a room start position within allowed space
var start_x = region.position.x
if region.size.x > size_x:
start_x += randi() % int(region.size.x - size_x)

var start_y = region.position.y
if region.size.y > size_y:
	start_y += randi() % int(region.size.y - size_y)	

#8:35 now store room dimensions as Rect2
var room = Rect2(start_x, start_y, size_x, size_y)
rooms.append(room)

#8:46 now lets put some tiles on the map! X direction
for x in range(start_x, start_x + size_x):
set_tile(x, start_y, Tile.Wall)
set_tile(x, start_y + size_y - 1, Tile.Wall)

Y direction

for y in range(start_y + 1, start_y + size_y - 1):  #end tiles already done 
	set_tile(start_x, y, Tile.Wall)
	set_tile(start_x + size_x - 1, y, Tile.Wall)		

Now fill in with floor

	for x in range(start_x + 1, start_x + size_x - 1):
		set_tile(x, y, Tile.Floor)	

#now update free regions list
cut_regions(free_regions, room)

func cut_regions(free_regions, region_to_remove):
var removal_queue =
var addition_queue =

for region in free_regions:
	if region.intersects(region_to_remove):
		removal_queue.append(region)
		
		var leftover_left = region_to_remove.position.x - region.position.x - 1
		var leftover_right = region.end.x - region_to_remove.end.x - 1
		var leftover_above = region_to_remove.position.y - region.position.y -1
		var leftover_below = region.end.y - region_to_remove.end.y - 1	
		
		if leftover_left >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(region.position, Vector2(leftover_left, region.size.y)))
		if leftover_right >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(Vector2(region_to_remove.end.x + 1, region.position.y), Vector2(leftover_right, region.size.y)))
		if leftover_above >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(region.position, Vector2(region.size.x, leftover_above)))	
		if leftover_below >= MIN_ROOM_DIMENSION:
			addition_queue.append(Rect2(Vector2(region.position.x, region_to_remove.end.y + 1), Vector2(region.size.x, leftover_below)))	
		
	
	for region in removal_queue:
		free_regions.erase(region)
		
	for region in addition_queue:
		free_regions.append(region)

#11:08 of video

#9:05 set_tile function
func set_tile(x, y, type):
map[y] = type
tile_map.set_cell(x, y, type)

:bust_in_silhouette: Reply From: MikeyZman

I figured it out. There is an append function that was put under its own for loop, that basically continually extended the range to infinity. When I moved the append function to the right tab position (our of the “For range” loop) the range was finite and the loop was able to be exited.

Apologies for the crappy code post, the code window did not take my code gracefully = I don’t know how to fix that.