Sprint 2 rendering pipeline: tiles (#129), fog (#131), camera (#116). - tile_renderer.gd: programmatic TileSet with floor/wall/door/object placeholder tiles, renders from snapshot tile data - fog_renderer.gd: TileMapLayer overlay with three visibility states (visible/fog-edge/hidden), computed from visible_positions data - Camera2D: smoothing enabled (speed 6.0), 2x zoom, locked to player - game_state.gd: stores visible_tiles and visible_positions from snapshots - sim_bridge.gd: test data with 8x8 room, corridor, and Manhattan distance visibility for development without server - Scene render order: Tiles -> FogOverlay -> Entities - Background clear color set to near-black for unexplored areas Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
38 lines
1.4 KiB
GDScript
38 lines
1.4 KiB
GDScript
extends Node2D
|
|
|
|
# World renderer — manages all visual representation from GameState
|
|
# Attached to the World node in main.tscn
|
|
# Render order (scene tree): TileMapLayer -> FogOverlay -> Entities
|
|
|
|
@onready var tile_renderer = $TileMapLayer
|
|
@onready var fog_renderer = $FogOverlay
|
|
@onready var entity_renderer = $Entities
|
|
|
|
var _tiles_dirty: bool = true
|
|
|
|
func _ready() -> void:
|
|
print("WorldRenderer: Initialized")
|
|
|
|
# Called each frame to update visuals from game state
|
|
func update_from_state() -> void:
|
|
# Update tiles (only when tile data changes)
|
|
if tile_renderer and tile_renderer.has_method("update_tiles"):
|
|
if _tiles_dirty and GameState.visible_tiles.size() > 0:
|
|
tile_renderer.update_tiles(GameState.visible_tiles)
|
|
# Register tile positions with fog renderer for coverage
|
|
if fog_renderer and fog_renderer.has_method("register_tile_positions"):
|
|
fog_renderer.register_tile_positions(GameState.visible_tiles)
|
|
_tiles_dirty = false
|
|
|
|
# Update fog overlay
|
|
if fog_renderer and fog_renderer.has_method("update_fog"):
|
|
fog_renderer.update_fog(GameState.visible_positions, GameState.player_position)
|
|
|
|
# Update entity sprites
|
|
if entity_renderer and entity_renderer.has_method("update_entities"):
|
|
entity_renderer.update_entities(GameState.visible_entities)
|
|
|
|
# Mark tiles as needing re-render (call when tile data changes significantly)
|
|
func invalidate_tiles() -> void:
|
|
_tiles_dirty = true
|