瀏覽代碼

Merge pull request #17432 from ShyRed/tilemapupdate

Update TileMap when its TileSet changes
Rémi Verschelde 7 年之前
父節點
當前提交
7e246a0cb7
共有 2 個文件被更改,包括 18 次插入3 次删除
  1. 16 3
      scene/2d/tile_map.cpp
  2. 2 0
      scene/2d/tile_map.h

+ 16 - 3
scene/2d/tile_map.cpp

@@ -142,16 +142,20 @@ void TileMap::_update_quadrant_transform() {
 
 void TileMap::set_tileset(const Ref<TileSet> &p_tileset) {
 
-	if (tile_set.is_valid())
+	if (tile_set.is_valid()) {
 		tile_set->disconnect("changed", this, "_recreate_quadrants");
+		tile_set->remove_change_receptor(this);
+	}
 
 	_clear_quadrants();
 	tile_set = p_tileset;
 
-	if (tile_set.is_valid())
+	if (tile_set.is_valid()) {
 		tile_set->connect("changed", this, "_recreate_quadrants");
-	else
+		tile_set->add_change_receptor(this);
+	} else {
 		clear();
+	}
 
 	_recreate_quadrants();
 	emit_signal("settings_changed");
@@ -1573,6 +1577,12 @@ void TileMap::_bind_methods() {
 	BIND_ENUM_CONSTANT(TILE_ORIGIN_BOTTOM_LEFT);
 }
 
+void TileMap::_changed_callback(Object *p_changed, const char *p_prop) {
+	if (tile_set.is_valid() && tile_set.ptr() == p_changed) {
+		emit_signal("settings_changed");
+	}
+}
+
 TileMap::TileMap() {
 
 	rect_cache_dirty = true;
@@ -1601,5 +1611,8 @@ TileMap::TileMap() {
 
 TileMap::~TileMap() {
 
+	if (tile_set.is_valid())
+		tile_set->remove_change_receptor(this);
+
 	clear();
 }

+ 2 - 0
scene/2d/tile_map.h

@@ -217,6 +217,8 @@ protected:
 	void _notification(int p_what);
 	static void _bind_methods();
 
+	virtual void _changed_callback(Object *p_changed, const char *p_prop);
+
 public:
 	enum {
 		INVALID_CELL = -1