1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-12 16:53:07 +00:00

Don't delete tiles that have been added using the stack mode

This commit is contained in:
Emmanouil Papadeas 2024-11-22 01:43:07 +02:00
parent 8f46338d50
commit 67d4eb67c1
3 changed files with 29 additions and 13 deletions

View file

@ -20,6 +20,9 @@ func update_tileset() -> void:
if TileSetPanel.tile_editing_mode == TileSetPanel.TileEditingMode.AUTO: if TileSetPanel.tile_editing_mode == TileSetPanel.TileEditingMode.AUTO:
for j in range(tileset.tiles.size() - 1, 0, -1): for j in range(tileset.tiles.size() - 1, 0, -1):
var tile := tileset.tiles[j] var tile := tileset.tiles[j]
if tile.mode_added == TileSetPanel.TileEditingMode.STACK:
# Don't delete tiles that have been added using the stack mode.
continue
var tile_used := false var tile_used := false
for i in indices.size(): for i in indices.size():
var x_coord := float(tileset.tile_size.x) * (i % indices_x) var x_coord := float(tileset.tile_size.x) * (i % indices_x)
@ -28,7 +31,7 @@ func update_tileset() -> void:
var image_portion := image.get_region(rect) var image_portion := image.get_region(rect)
if image_portion.is_invisible(): if image_portion.is_invisible():
continue continue
if image_portion.get_data() == tile.get_data(): if image_portion.get_data() == tile.image.get_data():
tile_used = true tile_used = true
break break
if not tile_used: if not tile_used:
@ -45,27 +48,29 @@ func update_tileset() -> void:
if TileSetPanel.tile_editing_mode == TileSetPanel.TileEditingMode.MANUAL: if TileSetPanel.tile_editing_mode == TileSetPanel.TileEditingMode.MANUAL:
if index == 0 or tileset.tiles.size() <= index: if index == 0 or tileset.tiles.size() <= index:
if tileset.tiles.size() <= 1: if tileset.tiles.size() <= 1:
tileset.add_tile(image_portion) tileset.add_tile(image_portion, TileSetPanel.tile_editing_mode)
indices[i] = tileset.tiles.size() - 1 indices[i] = tileset.tiles.size() - 1
continue continue
if image_portion.get_data() != tileset.tiles[index].get_data(): if image_portion.get_data() != tileset.tiles[index].image.get_data():
tileset.replace_tile_at(image_portion, index) tileset.replace_tile_at(image_portion, index)
# TODO: Update the rest of the tilemap # TODO: Update the rest of the tilemap
else: else: # Auto or stack
var found_tile := false var found_tile := false
for j in range(1, tileset.tiles.size()): for j in range(1, tileset.tiles.size()):
var tile := tileset.tiles[j] var tile := tileset.tiles[j]
if image_portion.get_data() == tile.get_data(): if image_portion.get_data() == tile.image.get_data():
indices[i] = j indices[i] = j
found_tile = true found_tile = true
break break
if not found_tile: if not found_tile:
if removed_tile_indices.is_empty(): if removed_tile_indices.is_empty():
tileset.add_tile(image_portion) tileset.add_tile(image_portion, TileSetPanel.tile_editing_mode)
indices[i] = tileset.tiles.size() - 1 indices[i] = tileset.tiles.size() - 1
else: else:
var index_position := removed_tile_indices.pop_back() as int var index_position := removed_tile_indices.pop_back() as int
tileset.insert_tile(image_portion, index_position) tileset.insert_tile(
image_portion, index_position, TileSetPanel.tile_editing_mode
)
indices[i] = index_position indices[i] = index_position

View file

@ -5,7 +5,16 @@ signal updated
var name := "" var name := ""
var tile_size: Vector2i var tile_size: Vector2i
var tiles: Array[Image] = [] var tiles: Array[Tile] = []
class Tile:
var image: Image
var mode_added: TileSetPanel.TileEditingMode
func _init(_image: Image, _mode_added: TileSetPanel.TileEditingMode) -> void:
image = _image
mode_added = _mode_added
func _init(_tile_size: Vector2i, _name := "") -> void: func _init(_tile_size: Vector2i, _name := "") -> void:
@ -15,15 +24,17 @@ func _init(_tile_size: Vector2i, _name := "") -> void:
#var indices_y := ceili(float(_project_size.y) / tile_size.y) #var indices_y := ceili(float(_project_size.y) / tile_size.y)
#tiles.resize(indices_x * indices_y + 1) #tiles.resize(indices_x * indices_y + 1)
var empty_image := Image.create_empty(tile_size.x, tile_size.y, false, Image.FORMAT_RGBA8) var empty_image := Image.create_empty(tile_size.x, tile_size.y, false, Image.FORMAT_RGBA8)
tiles.append(empty_image) tiles.append(Tile.new(empty_image, TileSetPanel.tile_editing_mode))
func add_tile(tile: Image) -> void: func add_tile(image: Image, edit_mode: TileSetPanel.TileEditingMode) -> void:
var tile := Tile.new(image, edit_mode)
tiles.append(tile) tiles.append(tile)
updated.emit() updated.emit()
func insert_tile(tile: Image, position: int) -> void: func insert_tile(image: Image, position: int, edit_mode: TileSetPanel.TileEditingMode) -> void:
var tile := Tile.new(image, edit_mode)
tiles.insert(position, tile) tiles.insert(position, tile)
updated.emit() updated.emit()
@ -34,5 +45,5 @@ func remove_tile_at_index(index: int) -> void:
func replace_tile_at(new_tile: Image, index: int) -> void: func replace_tile_at(new_tile: Image, index: int) -> void:
tiles[index].copy_from(new_tile) tiles[index].image.copy_from(new_tile)
updated.emit() updated.emit()

View file

@ -38,7 +38,7 @@ func _update_tileset() -> void:
for tile in tileset.tiles: for tile in tileset.tiles:
var texture_rect := TextureButton.new() var texture_rect := TextureButton.new()
texture_rect.custom_minimum_size = Vector2i(32, 32) texture_rect.custom_minimum_size = Vector2i(32, 32)
texture_rect.texture_normal = ImageTexture.create_from_image(tile) texture_rect.texture_normal = ImageTexture.create_from_image(tile.image)
h_flow_container.add_child(texture_rect) h_flow_container.add_child(texture_rect)