extends Node2D var WIDTH: int var HEIGHT: int var Materials: Array = [ Bedrock.new(), Air.new(), Sand.new(), ] var grid: GameGrid var img: Image var tex: ImageTexture var world_changed: bool = true const cell_size = 8 func set_material_at_position(y: int, x: int, material_name: String): var game_material = get_material_by_name(material_name) print("y=", y, " x=", x, " material=", material_name) var sized_x = x / cell_size var sized_y = y / cell_size grid.set_material_at_position(sized_y, sized_x, game_material) Game.material_changed() func get_materials() -> Array[GameMaterial]: return Materials func get_material_by_name(name: String) -> GameMaterial: for mat in Materials: if mat.name == name: return mat return null func _ready() -> void: Game.material_just_changed.connect(_on_material_just_changed) grid = GameGrid.new() # grid.set_size(int(screen.x), int(screen.y), cell_size) var screen := get_viewport_rect().size WIDTH = int(screen.x) / cell_size HEIGHT = int(screen.y) / cell_size scale = Vector2(cell_size, cell_size) grid.set_size(WIDTH, HEIGHT) grid.fill_with(get_material_by_name("Air")) img = Image.create(WIDTH, HEIGHT, false, Image.FORMAT_RGBA8) tex = ImageTexture.create_from_image(img) _render() func _step() -> void: grid.reset_changed() for y in range(HEIGHT -1, -1, -1): for x in WIDTH: var mat = grid.get_material_at_position(y, x) mat.update(grid, y, x) func _render() -> void: if world_changed: for y in range(HEIGHT -1, -1, -1): for x in WIDTH: var mat = grid.get_material_at_position(y, x) if mat: img.set_pixel(x, y, mat.color) tex.update(img) queue_redraw() world_changed = false func _draw() -> void: draw_texture(tex, Vector2.ZERO) func _process(delta: float) -> void: _step() _render() func _on_material_just_changed() -> void: world_changed = true