A script that takes a sprite, divides it into blocks and makes them explode 💥!
Right now, the sprites must be squares or rectangles for this script to work properly.
Each destructible object must follow this structure and must be its own Scene
file.
RigidBody2D
├── Sprite
└── CollisionShape2D
└── RectangleShape2D
- Create a
Node2D
that will contain all the destructibles objects (e.g.destructible_objects
). - Add a
Node2D
as a child node of the priorNode2D
(e.g.destructible_object_01
). - Instance the
destructible_object
scene file. - Attach
explode_object.gd
to the destructible object as aScript
.
The reason for organizing it this way is because then you can add particles (Partcicles2D
or CPUParticles2D
), fake particles (like the ones provided with this project), hitboxes (Area2D
) or whatever you feel like to the Node2D
(e.g. destructible_object_01
) holding the main RigidBody2D
and you can then use this script to control those nodes.
Of course, you can recreate that tree in GDSscript, with something like this:
var node = Node2D.new()
node.name = "destructible_container"
get_parent().add_child(node, true)
var rigid_body = RigidBody2D.new()
rigid_body.name = "destructible_object"
var sprite = Sprite.new()
# Set the sprite's texture, size, etc.
sprite.texture = preload("res://path/to/texture.png")
...
var collision = CollisionShape2D.new()
collision.shape = RectangleShape2D.new()
collision.shape.extents = Vector2(..., ...)
rigid_body.add_child(sprite, true)
rigid_body.add_child(collision, true)
var script = preload("res://path/to/explode_object.gd")
rigid_body.set_script(script)
# Here you can set the 'rigid_body' variables from the script.
rigid_body.blocks_per_side = ...
rigid_body.blocks_impulse = ...
node.add_child(rigid_body, true)
Name | Type | Description | Default |
---|---|---|---|
blocks_per_side |
int |
The blocks per side. Minium 2 . Maximum 10 (for performance reasons). |
6 |
Example: 4
block per side makes a total of 16
blocks.
Name | Type | Description | Default |
---|---|---|---|
blocks_impulse |
float |
The force of the blocks when they explode. | 600 |
Name | Type | Description | Default |
---|---|---|---|
blocks_gravity_scale |
float |
The gravity of the blocks. | 10 |
Name | Type | Description | Default |
---|---|---|---|
debris_max_time |
float |
The seconds it will pass until the blocks become STATIC or, if remove_debris is set to true , they dissapear. |
5 |
Name | Type | Description | Default |
---|---|---|---|
remove_debris |
bool |
Controls whether the debris stays or disappears. If set to true , the debris will dissapear when debris_max_time is over. |
false |
Name | Type | Description | Default |
---|---|---|---|
collision_layers |
int |
The collision layers of the blocks. | 1 |
Sum all the values of the layers.
Example: Layer 1
value is 1
. Layer 5
value is 16
. So collision_layers
would be 17
.
Name | Type | Description | Default |
---|---|---|---|
collision_masks |
int |
The collision masks of the blocks. | 1 |
Sum all the values of the layers.
Example: Layer 1
value is 1
. Layer 5
value is 16
. So collision_layers
would be 17
.
Name | Type | Description | Default |
---|---|---|---|
collision_one_way |
bool |
Set one_way_collision for the blocks. |
false |
Name | Type | Description | Default |
---|---|---|---|
explosion_delay |
bool |
Adds a delay of before setting object.detonate to false . |
false |
Sometimes object.detonate
is set to false
so quickly that the explosion never happens. If this happens, try setting explosion_delay
to true
.
Name | Type | Description | Default |
---|---|---|---|
fake_explosions_group |
String |
Renames the group's name of the fake explosion particles. | fake_explosion_particles |
This project provides an extra script for creating fake explosion particles. That script uses a group name to be able to find the fake explosion particles more easily.
Name | Type | Description | Default |
---|---|---|---|
randomize_seed |
bool |
Randomize the seed. | false |
Name | Type | Description | Default |
---|---|---|---|
debug_mode |
bool |
Prints some debug data. | false |
See CHANGELOG.
- Me 😛 hiulit.
Thanks to:
- Airvikar - For this Youtube video that is the code base for this script.
- Securas - For all the great games and Twitch streams that give me lots of ideas, and particularly, the destructible objects one.
- Scott Lembcke - For letting me know about Voronoi regions (which aren't currently available) and helping me with adding more depth to the explosion (random collisions and z-index).