created fog of war
This commit is contained in:
47
entities/faction/fog_of_war.gd
Normal file
47
entities/faction/fog_of_war.gd
Normal file
@@ -0,0 +1,47 @@
|
||||
class_name FogOfWar extends Node
|
||||
|
||||
@export var visual:bool = true
|
||||
@export var width:int = 20
|
||||
@export var height:int = 20
|
||||
|
||||
var size:int:
|
||||
get: return width*height
|
||||
|
||||
var faction:Faction:
|
||||
get: return get_parent() as Faction
|
||||
|
||||
var grid:Array[bool] = []
|
||||
|
||||
func _ready() -> void:
|
||||
if not visual: $FogOfWarVisual.queue_free()
|
||||
generate_new_grid()
|
||||
visualize_grid()
|
||||
|
||||
func _on_tick() -> void:
|
||||
update_fog_of_war()
|
||||
visualize_grid()
|
||||
|
||||
func generate_new_grid()->void:
|
||||
grid.resize(size)
|
||||
for i in range(size):
|
||||
grid[i] = true
|
||||
|
||||
func visualize_grid()->void:
|
||||
if not has_node("FogOfWarVisual"): return
|
||||
var fog_of_war_visual := $FogOfWarVisual as GridMap
|
||||
for i in range(size):
|
||||
var item := 0 if grid[i] else -1
|
||||
fog_of_war_visual.set_cell_item(c2p(i2c(i)), item)
|
||||
|
||||
func update_fog_of_war()->void:
|
||||
var entities := faction.buildings + faction.units
|
||||
for i in range(size):
|
||||
grid[i] = grid[i] and not entities.map(
|
||||
func(entity:Node3D)->bool:
|
||||
return entity.position.distance_squared_to(c2p(i2c(i))) < 10
|
||||
).has(true)
|
||||
|
||||
# Converters from coordinates to index values
|
||||
func c2i(coor:Vector2i)->int: return coor.x+coor.y*width
|
||||
func i2c(index:int)->Vector2i: return Vector2i(index%width, index/width)
|
||||
func c2p(coor:Vector2i)->Vector3i: return Vector3i(coor.x-width/2, 0, coor.y-height/2)
|
||||
Reference in New Issue
Block a user