Răsfoiți Sursa

Merge pull request #8272 from MattUV/2.1

Add methods to get and set bits of collision layers and masks for TileMaps (2.1)
Rémi Verschelde 8 ani în urmă
părinte
comite
6aaec01e99
2 a modificat fișierele cu 43 adăugiri și 1 ștergeri
  1. 37 1
      scene/2d/tile_map.cpp
  2. 6 0
      scene/2d/tile_map.h

+ 37 - 1
scene/2d/tile_map.cpp

@@ -879,6 +879,26 @@ void TileMap::set_collision_mask(uint32_t p_mask) {
 	}
 }
 
+void TileMap::set_collision_layer_bit(int p_bit, bool p_value) {
+
+	uint32_t layer = get_collision_layer();
+	if (p_value)
+		layer |= 1 << p_bit;
+	else
+		layer &= ~(1 << p_bit);
+	set_collision_layer(layer);
+}
+
+void TileMap::set_collision_mask_bit(int p_bit, bool p_value) {
+
+	uint32_t mask = get_collision_mask();
+	if (p_value)
+		mask |= 1 << p_bit;
+	else
+		mask &= ~(1 << p_bit);
+	set_collision_mask(mask);
+}
+
 bool TileMap::get_collision_use_kinematic() const {
 
 	return use_kinematic;
@@ -930,6 +950,16 @@ uint32_t TileMap::get_collision_mask() const {
 	return collision_mask;
 }
 
+bool TileMap::get_collision_layer_bit(int p_bit) const {
+
+	return get_collision_layer() & (1 << p_bit);
+}
+
+bool TileMap::get_collision_mask_bit(int p_bit) const {
+
+	return get_collision_mask() & (1 << p_bit);
+}
+
 void TileMap::set_mode(Mode p_mode) {
 
 	_clear_quadrants();
@@ -1199,12 +1229,18 @@ void TileMap::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("set_collision_use_kinematic", "use_kinematic"), &TileMap::set_collision_use_kinematic);
 	ObjectTypeDB::bind_method(_MD("get_collision_use_kinematic"), &TileMap::get_collision_use_kinematic);
 
-	ObjectTypeDB::bind_method(_MD("set_collision_layer", "mask"), &TileMap::set_collision_layer);
+	ObjectTypeDB::bind_method(_MD("set_collision_layer", "layer"), &TileMap::set_collision_layer);
 	ObjectTypeDB::bind_method(_MD("get_collision_layer"), &TileMap::get_collision_layer);
 
 	ObjectTypeDB::bind_method(_MD("set_collision_mask", "mask"), &TileMap::set_collision_mask);
 	ObjectTypeDB::bind_method(_MD("get_collision_mask"), &TileMap::get_collision_mask);
 
+	ObjectTypeDB::bind_method(_MD("set_collision_layer_bit", "bit", "value"), &TileMap::set_collision_layer_bit);
+	ObjectTypeDB::bind_method(_MD("get_collision_layer_bit", "bit"), &TileMap::get_collision_layer_bit);
+
+	ObjectTypeDB::bind_method(_MD("set_collision_mask_bit", "bit", "value"), &TileMap::set_collision_mask_bit);
+	ObjectTypeDB::bind_method(_MD("get_collision_mask_bit", "bit"), &TileMap::get_collision_mask_bit);
+
 	ObjectTypeDB::bind_method(_MD("set_collision_friction", "value"), &TileMap::set_collision_friction);
 	ObjectTypeDB::bind_method(_MD("get_collision_friction"), &TileMap::get_collision_friction);
 

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

@@ -232,6 +232,12 @@ public:
 
 	void set_collision_mask(uint32_t p_mask);
 	uint32_t get_collision_mask() const;
+	
+	void set_collision_layer_bit(int p_bit, bool p_value);
+	bool get_collision_layer_bit(int p_bit) const;
+
+	void set_collision_mask_bit(int p_bit, bool p_value);
+	bool get_collision_mask_bit(int p_bit) const;
 
 	void set_collision_use_kinematic(bool p_use_kinematic);
 	bool get_collision_use_kinematic() const;