Fog of war
This commit is contained in:
@@ -6,6 +6,7 @@ extends Node2D
|
||||
@onready var tile_map: TileMapLayer = %TerrainLayer
|
||||
@onready var highlight_map: GridOverlay = %OverlayLayer
|
||||
@onready var wall_renderer: WallRenderer = %WallRenderer
|
||||
@onready var fog_renderer: FogRenderer = %FogRenderer
|
||||
|
||||
const TILE_SIZE := 100.0
|
||||
const SOURCE_ID: int = 0
|
||||
@@ -90,6 +91,7 @@ func apply_layout(layout: MapLayout) -> void:
|
||||
map_layout.initialize()
|
||||
load_from_layout()
|
||||
draw_room_walls()
|
||||
draw_fog()
|
||||
|
||||
|
||||
func is_tile_passable(from: Vector2i, to: Vector2i) -> bool:
|
||||
@@ -112,6 +114,12 @@ func draw_room_walls() -> void:
|
||||
wall_renderer.draw_walls_for_layout(map_layout)
|
||||
|
||||
|
||||
func draw_fog() -> void:
|
||||
if not map_layout:
|
||||
return
|
||||
fog_renderer.draw_fog_for_layout(map_layout)
|
||||
|
||||
|
||||
func get_map_rect() -> Rect2:
|
||||
if not map_layout:
|
||||
return Rect2()
|
||||
|
||||
43
nodes/fog_renderer.gd
Normal file
43
nodes/fog_renderer.gd
Normal file
@@ -0,0 +1,43 @@
|
||||
class_name FogRenderer
|
||||
extends Node2D
|
||||
|
||||
## Renders a fog/cave texture over every tile inside the map's bounding rect
|
||||
## that is not part of any room. Future: drive visibility from map state.
|
||||
|
||||
const TILE_SIZE := 100.0
|
||||
const FOG_RECT := Rect2(53, 53, 100, 100)
|
||||
|
||||
@export var atlas_texture: Texture2D
|
||||
|
||||
|
||||
func draw_fog_for_layout(map_layout: MapLayout) -> void:
|
||||
_clear()
|
||||
if not map_layout or not atlas_texture:
|
||||
return
|
||||
for y in map_layout.size.y:
|
||||
for x in map_layout.size.x:
|
||||
var tile := Vector2i(x, y)
|
||||
if map_layout.is_tile_valid(tile):
|
||||
continue
|
||||
_create_fog_sprite(Vector2(tile) * TILE_SIZE)
|
||||
|
||||
|
||||
func _clear() -> void:
|
||||
for child in get_children():
|
||||
child.queue_free()
|
||||
|
||||
|
||||
func _create_fog_sprite(pos: Vector2) -> void:
|
||||
var atlas := AtlasTexture.new()
|
||||
atlas.atlas = atlas_texture
|
||||
atlas.region = FOG_RECT
|
||||
|
||||
var sprite := Sprite2D.new()
|
||||
sprite.texture = atlas
|
||||
sprite.centered = false
|
||||
sprite.position = pos
|
||||
sprite.scale = Vector2(
|
||||
TILE_SIZE / FOG_RECT.size.x,
|
||||
TILE_SIZE / FOG_RECT.size.y,
|
||||
)
|
||||
add_child(sprite)
|
||||
1
nodes/fog_renderer.gd.uid
Normal file
1
nodes/fog_renderer.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d1d1nbetdvynk
|
||||
@@ -11,24 +11,24 @@ func _ready() -> void:
|
||||
var room_a := Room.new()
|
||||
room_a.id = 0
|
||||
room_a.tiles = [
|
||||
Vector2i(0, 0), Vector2i(1, 0), Vector2i(2, 0),
|
||||
Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1),
|
||||
Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2),
|
||||
Vector2i(2, 2), Vector2i(3, 2), Vector2i(4, 2),
|
||||
Vector2i(2, 3), Vector2i(3, 3), Vector2i(4, 3),
|
||||
Vector2i(2, 4), Vector2i(3, 4), Vector2i(4, 4),
|
||||
]
|
||||
|
||||
var room_b := Room.new()
|
||||
room_b.id = 1
|
||||
room_b.tiles = [
|
||||
Vector2i(3, 0), Vector2i(4, 0), Vector2i(5, 0),
|
||||
Vector2i(3, 1), Vector2i(4, 1), Vector2i(5, 1),
|
||||
Vector2i(3, 2), Vector2i(4, 2), Vector2i(5, 2),
|
||||
Vector2i(5, 2), Vector2i(6, 2), Vector2i(7, 2),
|
||||
Vector2i(5, 3), Vector2i(6, 3), Vector2i(7, 3),
|
||||
Vector2i(5, 4), Vector2i(6, 4), Vector2i(7, 4),
|
||||
]
|
||||
|
||||
var layout := MapLayout.new()
|
||||
layout.rooms = [room_a, room_b]
|
||||
# Opening between (2,1) in room_a and (3,1) in room_b
|
||||
layout.openings = [Vector2i(2, 1), Vector2i(3, 1)]
|
||||
layout.size = Vector2i(6, 3)
|
||||
# Opening between (4,3) in room_a and (5,3) in room_b
|
||||
layout.openings = [Vector2i(4, 3), Vector2i(5, 3)]
|
||||
layout.size = Vector2i(10, 7)
|
||||
|
||||
combat_map.apply_layout(layout)
|
||||
camera.set_map_bounds(combat_map.get_map_rect())
|
||||
|
||||
Reference in New Issue
Block a user