# bevy_tileset
[![crates.io](https://img.shields.io/crates/v/bevy_tileset?style=flat-square)](https://crates.io/crates/bevy_tileset)
[![docs.rs](https://img.shields.io/docsrs/bevy_tileset?style=flat-square)](https://docs.rs/bevy_tileset)
Simple, configurable tilesets in Bevy using RON.
> All GIFs generated with the [`bevy_tileset_map`](https://github.com/MrGVSV/bevy_tileset_map) crate
## 📋 Features
* Define tilesets and tiles via [RON](https://github.com/ron-rs/ron) files
* Load a tileset directly as a Bevy asset
* Define Standard, Animated, Variant, and Auto tiles
## 📲 Installation
Add one of the following lines to your `Cargo.toml`.
```toml
[dependencies]
bevy_tileset_tiles = "0.8" # For the base tile definitions
bevy_tileset = "0.8" # For general tileset usage (includes above)
```
## ✨ Usage
Simply **define** your tiles and tilesets in config files:
```rust
// assets/tiles/my_tile.ron
(
name: "My Tile",
tile: Standard("textures/my_tile.png")
)
```
```rust
// assets/my_tileset.ron
(
name: Some("My Awesome Tileset"),
id: 0,
tiles: {
0: "../tiles/my_tile.ron",
// ...
}
)
```
And **load** it in via a system:
```rust
use bevy::prelude::*;
use bevy_tileset::prelude::*;
fn load_tiles(asset_server: Res) {
let handle: Handle = asset_server.load("my_tileset.ron");
// Store handle...
}
```
Then **access** the generated tileset from anywhere:
```rust
fn my_system(tilesets: Tilesets, /* other system params */) {
let tileset = tilesets.get_by_name("My Awesome Tileset").unwrap();
let tile_index = tileset.get_tile_index("My Tile").unwrap();
match tile_index {
TileIndex::Standard(texture_index) => { /* Do something */ }
TileIndex::Animated(start, end, speed) => { /* Do something */ }
}
}
```
## Tile Types
Currently there are four main tile types:
### 🖼 Standard
Defines a basic tile.
```rust
// assets/tiles/my-tile.ron
(
name: "My Tile",
tile: Standard("textures/my_tile.png")
)
```
### 🎞️ Animated
Defines an animated tile that can be generated with the `GPUAnimated` component from `bevy_ecs_tilemap`.
```rust
// assets/tiles/my-animated-tile.ron
(
name: "My Animated Tile",
tile: Animated((
speed: 2.25,
frames: [
"textures/animated-001.png",
"textures/animated-002.png",
"textures/animated-003.png",
]
))
)
```
### 🎲 Variant
> With the `variants` feature enabled
Defines a tile that has a set of possible variants. A variant is chosen at random when placed. These variants can either
be Standard or Animated.
```rust
// assets/tiles/my-variant-tile.ron
(
name: "My Crazy Random Tile",
tile: Variant([
(
weight: 1.0,
tile: Standard("textures/variant-standard-001.png")
),
(
// Default weight: 1.0
tile: Standard("textures/variant-standard-002.png")
),
(
weight: 0.0001, // Wow that's rare!
tile: Animated((
// Default speed: 1.0
frames: [
"textures/variant-animated-001.png",
"textures/variant-animated-002.png",
"textures/variant-animated-003.png",
]
))
)
])
)
```
### 🧠 Auto
> With the `auto-tile` feature enabled
Defines a tile that automatically chooses its active tile based on its neighbors. This behavior can be controlled with
rules. These sub-tiles are themselves Variant tiles.
```rust
// assets/tiles/my-auto-tile.ron
#![enable(implicit_some)]
(
name: "My Auto Tile",
tile: Auto([
(
rule: (
north: true,
east: false,
west: true,
),
variants: [
(
tile: Standard("textures/n_w-e-001.png")
),
(
weight: 2.0,
tile: Standard("textures/n_w-e-002.png")
)
]
),
(
rule: (
// Also supports short notation
n: false,
s: false,
// And ordinal directions
south_west: true,
nw: false
),
variants: [
(
tile: Standard("textures/sw-n_s_nw.png")
)
]
),
])
)
```
## 🎓 Examples
* [tileset](examples/tileset.rs) - Simply load and display a tileset
* [dynamic](examples/dynamic.rs) - Dynamically create a tileset at runtime
Also, be sure to check out the [assets](/assets/) folder for how to define a tile or tileset.
## 🌱 Areas of Growth
There are some things this crate could do better in. Here's a list of potential areas to grow:
- [x] Tileset
- [x] Config files ★
- [ ] Improved Auto Tiles
- [ ] Mirror/Rotation (designate a rule to be mirrored or rotated)
- [x] Loading
- [x] Load configs as assets
As well as just an overall improved and cleaner API.
## 🎵 Important Note
These tiles are defined with the [`bevy_ecs_tilemap`](https://github.com/StarArawn/bevy_ecs_tilemap) crate in mind.
Therefore, it's meant to work with an index-based tile system (where a tile's texture is defined as an index into a
texture atlas). Other solutions may need to be adapted in order to work with this crate.
## 🕊 Bevy Compatibility
| bevy | bevy_tileset |
|------|--------------|
| 0.11 | 0.8 |
| 0.10 | 0.7 |
| 0.9 | 0.6 |
| 0.8 | 0.5 |
| 0.7 | 0.4 |
| 0.6 | 0.3 |
| 0.5 | 0.2 |