![]() |
Attention | Topic was automatically imported from the old Question2Answer platform. |
![]() |
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)