godot-particles/Scenes/world.gd

81 lines
1.8 KiB
GDScript

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