Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/hiulit/godot-3-2d-destructible-objects
A script that takes a sprite, divides it into blocks and makes them explode 💥!
https://github.com/hiulit/godot-3-2d-destructible-objects
2d destructible godot-engine objects
Last synced: about 1 month ago
JSON representation
A script that takes a sprite, divides it into blocks and makes them explode 💥!
- Host: GitHub
- URL: https://github.com/hiulit/godot-3-2d-destructible-objects
- Owner: hiulit
- License: mit
- Created: 2019-07-04T13:26:00.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-02-15T15:39:53.000Z (almost 4 years ago)
- Last Synced: 2024-10-10T11:40:17.981Z (about 1 month ago)
- Topics: 2d, destructible, godot-engine, objects
- Language: GDScript
- Homepage:
- Size: 2.22 MB
- Stars: 395
- Watchers: 9
- Forks: 27
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# Godot 3 2D Destructible Objects
A script that takes a sprite, divides it into blocks and makes them explode 💥!
![Godot-3-2D-Destructible-Objects](examples/Godot-3-2D-Destructible-Objects.gif)
## Limitations
Right now, the sprites must be squares or rectangles for this script to work properly.
## Prerequisites
Each destructible object must follow this structure and must be its own `Scene` file.
```
RigidBody2D
├── Sprite
└── CollisionShape2D
└── RectangleShape2D
```## Usage
* Create a `Node2D` that will contain all the destructibles objects (e.g. `destructible_objects`).
* Add a `Node2D` as a child node of the prior `Node2D` (e.g. `destructible_object_01`).
* Instance the `destructible_object` scene file.
* Attach `explode_object.gd` to the destructible object as a `Script`.![Godot-3-2D-Destructible-Objects-Tree](examples/tree.png)
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)
```## Parameters
![Godot-3-2D-Destructible-Objects-Parameters](examples/parameters.png)
### Blocks Per Side
| 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.
### Blocks Impulse
| Name | Type | Description | Default |
| --- | --- | --- | --- |
| `blocks_impulse` | `float` | The *force* of the blocks when they explode. | `600` |### Blocks Gravity Scale
| Name | Type | Description | Default |
| --- | --- | --- | --- |
| `blocks_gravity_scale` | `float` | The gravity of the blocks. | `10` |### Debris max time
| 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` |### Remove debris
| 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`Â |### Collision layers
| 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`.
### Collision masks
| 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`.
### Collision one way
| Name | Type | Description | Default |
| --- | --- | --- | --- |
| `collision_one_way` | `bool` | Set `one_way_collision` for the blocks. | `false` |### Explosion delay
| 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`.
### Fake explosions group
| 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](https://github.com/hiulit/Godot-3-2D-Fake-Explosion-Particles). That script uses a group name to be able to find the fake explosion particles more easily.
### Randomize seed
| Name | Type | Description | Default |
| --- | --- | --- | --- |
| `randomize_seed` | `bool` | Randomize the seed. | `false` |### Debug mode
| Name | Type | Description | Default |
| --- | --- | --- | --- |
| `debug_mode` | `bool` | Prints some debug data. | `false` |## Changelog
See [CHANGELOG](CHANGELOG.md).
## Authors
* Me 😛 [hiulit](https://github.com/hiulit).
## Credits
Thanks to:
* Airvikar - For this [Youtube video](https://www.youtube.com/watch?v=ExX7Qyldtfg) that is the code base for this script.
* [Securas](https://twitter.com/Securas2010) - For all the [great games](https://securas.itch.io/) and [Twitch streams](https://www.twitch.tv/sec_ras/videos?filter=all&sort=time) that give me lots of ideas, and particularly, the destructible objects one.
* [Scott Lembcke](https://twitter.com/slembcke) - 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).## License
[MIT License](LICENSE).