81 lines
1.8 KiB
GDScript
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
|