102 lines
3.4 KiB
GDScript
102 lines
3.4 KiB
GDScript
extends Control
|
|
|
|
# Member variables
|
|
export var show_unvisited: bool = false
|
|
export var ground_visited: Color = Color(0x359235ff)
|
|
export var ground_unvisited: Color = Color(0x359235ce)
|
|
export var ground_unseen: Color = Color(0x80ced3ce)
|
|
export var wall_visited: Color = Color(0x000000ff)
|
|
export var wall_unvisited: Color = Color(0x000000ce)
|
|
export var player_color: Color = Color(0x2b40efff)
|
|
export var chest_color: Color = Color(0xef2b3dff)
|
|
export var entrance_color: Color = Color(0xe9ed57ff)
|
|
export var exit_color: Color = Color(0xde57edff)
|
|
|
|
var level: Maze = null
|
|
var player: MazePlayer = null
|
|
const cell_size = 15
|
|
const cell_dim = Vector2(cell_size, cell_size)
|
|
|
|
func init(lvl: Maze, pl: MazePlayer):
|
|
level = lvl
|
|
player = pl
|
|
update()
|
|
|
|
# Drawing function
|
|
func _draw():
|
|
for j in range(level.height):
|
|
for i in range(level.width):
|
|
drawGround(level.at(i, j), i, j)
|
|
drawFeature(level.at(i, j), i, j)
|
|
for j in range(level.height):
|
|
for i in range(level.width):
|
|
drawWalls(level.at(i, j), i, j)
|
|
drawPlayer()
|
|
|
|
func drawGround(c: Cell, i, j):
|
|
var color
|
|
if c.visited:
|
|
color = ground_visited
|
|
elif show_unvisited:
|
|
color = ground_unvisited
|
|
else:
|
|
color = ground_unseen
|
|
draw_rect(
|
|
Rect2(
|
|
cell_size * Vector2(i, j),
|
|
cell_dim),
|
|
color)
|
|
|
|
func drawFeature(c: Cell, i, j):
|
|
if c.visited or show_unvisited:
|
|
var orig = cell_size * Vector2(i, j)
|
|
match c.feature:
|
|
Cell.Feature.ENTRANCE:
|
|
draw_rect(Rect2(orig, cell_dim), entrance_color)
|
|
Cell.Feature.EXIT:
|
|
draw_rect(Rect2(orig, cell_dim), exit_color)
|
|
Cell.Feature.CHEST:
|
|
draw_circle(orig + cell_dim * 0.5, cell_size/2, chest_color)
|
|
_:
|
|
pass
|
|
|
|
func drawWalls(c: Cell, i, j):
|
|
drawWall(c, Direction.NORTH, i, j)
|
|
drawWall(c, Direction.WEST, i, j)
|
|
drawWall(c, Direction.SOUTH, i, j)
|
|
drawWall(c, Direction.EAST, i, j)
|
|
|
|
func drawWall(c: Cell, dir, i, j):
|
|
var color
|
|
if c.visited:
|
|
color = wall_visited
|
|
else:
|
|
color = wall_unvisited
|
|
if (c.visited or show_unvisited) && (c.get_edge(dir) == Cell.Edge.WALL):
|
|
var orig = cell_size * Vector2(i, j)
|
|
var from = orig + cell_size * Direction.edge_from(dir)
|
|
var to = orig + cell_size * Direction.edge_to(dir)
|
|
draw_line(from, to, color, 2)
|
|
|
|
func drawPlayer():
|
|
var orig = cell_size * player.position
|
|
var points = [Vector2(0, 0), Vector2(0, 0), Vector2(0, 0)]
|
|
match player.forward_dir:
|
|
Direction.NORTH:
|
|
points[0] = orig + Vector2(cell_size / 2, 2)
|
|
points[1] = orig + Vector2(cell_size - 2, cell_size - 2)
|
|
points[2] = orig + Vector2(2, cell_size - 2)
|
|
Direction.SOUTH:
|
|
points[0] = orig + Vector2(cell_size / 2, cell_size - 2)
|
|
points[1] = orig + Vector2(cell_size - 2, 2)
|
|
points[2] = orig + Vector2(2, 2)
|
|
Direction.EAST:
|
|
points[0] = orig + Vector2(cell_size - 2, cell_size / 2)
|
|
points[1] = orig + Vector2(2, 2)
|
|
points[2] = orig + Vector2(2, cell_size - 2)
|
|
Direction.WEST:
|
|
points[0] = orig + Vector2(2, cell_size / 2)
|
|
points[1] = orig + Vector2(cell_size - 2, 2)
|
|
points[2] = orig + Vector2(cell_size - 2, cell_size - 2)
|
|
draw_colored_polygon(PoolVector2Array(points), player_color)
|