Skip to content

Instantly share code, notes, and snippets.

@RamiAwar
Created May 11, 2020 08:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RamiAwar/5ac6ff1398bd0f9e937cf1c4cec51804 to your computer and use it in GitHub Desktop.
Save RamiAwar/5ac6ff1398bd0f9e937cf1c4cec51804 to your computer and use it in GitHub Desktop.
Multiple random walkers starting from origin
extends Node2D
onready var dirt_tilemap = $DirtTileMap
onready var wall_tilemap = $WallTileMap
var rng = RandomNumberGenerator.new()
var CellSize = Vector2(16, 16)
var width = 1024/CellSize.x
var height = 1024/CellSize.y
var grid = []
var walkers = []
class Walker:
var dir: Vector2
var pos: Vector2
var max_walkers = 5
var Tiles = {
"empty": -1,
"wall": 0,
"floor": 1
}
func _init_walkers():
walkers = []
for i in range(max_walkers):
var walker = Walker.new()
walker.dir = GetRandomDirection()
walker.pos = Vector2.ZERO
walkers.append(walker)
func _init_grid():
grid = []
for x in width:
grid.append([])
for y in height:
grid[x].append(-1);
func GetRandomDirection():
var directions = [[-1, 0], [1, 0], [0, 1], [0, -1]]
var direction = directions[rng.randi()%4]
return Vector2(direction[0], direction[1])
func _create_random_path():
var max_iterations = 1000
var itr = 0
while itr < max_iterations:
# Perform random walk
# 1- choose random direction
# 2- check that direction is in bounds
# 3- move in that direction
for i in range(walkers.size()):
var random_direction = GetRandomDirection()
if (walkers[i].pos.x + random_direction.x >= 0 and
walkers[i].pos.x + random_direction.x < width and
walkers[i].pos.y + random_direction.y >= 0 and
walkers[i].pos.y + random_direction.y < height):
walkers[i].dir = random_direction
walkers[i].pos += walkers[i].dir
grid[walkers[i].pos.x][walkers[i].pos.y] = Tiles.floor
itr += 1
func _spawn_tiles():
for x in width:
for y in height:
match grid[x][y]:
Tiles.empty:
pass
Tiles.floor:
dirt_tilemap.set_cellv(Vector2(x, y), 0)
Tiles.wall:
pass
dirt_tilemap.update_bitmask_region()
wall_tilemap.update_bitmask_region()
func _clear_tilemaps():
for x in width:
for y in height:
dirt_tilemap.clear()
wall_tilemap.clear()
func _ready():
rng.randomize()
_init_walkers()
_init_grid()
_clear_tilemaps()
_create_random_path()
_spawn_tiles()
func _input(event):
if Input.is_key_pressed(KEY_SPACE):
_init_walkers()
_init_grid()
_clear_tilemaps()
_create_random_path()
_spawn_tiles()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment