Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/examples/2d/tilemap_chunk.rs
6592 views
1
//! Shows a tilemap chunk rendered with a single draw call.
2
3
use bevy::{
4
prelude::*,
5
sprite_render::{TileData, TilemapChunk, TilemapChunkTileData},
6
};
7
use rand::{Rng, SeedableRng};
8
use rand_chacha::ChaCha8Rng;
9
10
fn main() {
11
App::new()
12
.add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest()))
13
.add_systems(Startup, setup)
14
.add_systems(Update, (update_tileset_image, update_tilemap))
15
.run();
16
}
17
18
#[derive(Component, Deref, DerefMut)]
19
struct UpdateTimer(Timer);
20
21
#[derive(Resource, Deref, DerefMut)]
22
struct SeededRng(ChaCha8Rng);
23
24
fn setup(mut commands: Commands, assets: Res<AssetServer>) {
25
// We're seeding the PRNG here to make this example deterministic for testing purposes.
26
// This isn't strictly required in practical use unless you need your app to be deterministic.
27
let mut rng = ChaCha8Rng::seed_from_u64(42);
28
29
let chunk_size = UVec2::splat(64);
30
let tile_display_size = UVec2::splat(8);
31
let tile_data: Vec<Option<TileData>> = (0..chunk_size.element_product())
32
.map(|_| rng.random_range(0..5))
33
.map(|i| {
34
if i == 0 {
35
None
36
} else {
37
Some(TileData::from_tileset_index(i - 1))
38
}
39
})
40
.collect();
41
42
commands.spawn((
43
TilemapChunk {
44
chunk_size,
45
tile_display_size,
46
tileset: assets.load("textures/array_texture.png"),
47
..default()
48
},
49
TilemapChunkTileData(tile_data),
50
UpdateTimer(Timer::from_seconds(0.1, TimerMode::Repeating)),
51
));
52
53
commands.spawn(Camera2d);
54
55
commands.insert_resource(SeededRng(rng));
56
}
57
58
fn update_tileset_image(
59
chunk_query: Single<&TilemapChunk>,
60
mut events: EventReader<AssetEvent<Image>>,
61
mut images: ResMut<Assets<Image>>,
62
) {
63
let chunk = *chunk_query;
64
for event in events.read() {
65
if event.is_loaded_with_dependencies(chunk.tileset.id()) {
66
let image = images.get_mut(&chunk.tileset).unwrap();
67
image.reinterpret_stacked_2d_as_array(4);
68
}
69
}
70
}
71
72
fn update_tilemap(
73
time: Res<Time>,
74
mut query: Query<(&mut TilemapChunkTileData, &mut UpdateTimer)>,
75
mut rng: ResMut<SeededRng>,
76
) {
77
for (mut tile_data, mut timer) in query.iter_mut() {
78
timer.tick(time.delta());
79
80
if timer.just_finished() {
81
for _ in 0..50 {
82
let index = rng.random_range(0..tile_data.len());
83
tile_data[index] = Some(TileData::from_tileset_index(rng.random_range(0..5)));
84
}
85
}
86
}
87
}
88
89