//! Shows a tilemap chunk rendered with a single draw call, including different orientations of tiles (rotated, mirrored) and using different tileset indices, colors, alpha and visibility to show all tile features. use bevy::{ image::{ImageArrayLayout, ImageLoaderSettings}, prelude::*, sprite_render::{AlphaMode2d, TileData, TileOrientation, TilemapChunk, TilemapChunkTileData}, }; fn main() { App::new() .add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest())) .insert_resource(ClearColor(Color::srgb(0.5, 0.5, 0.9))) .add_systems(Startup, setup) .run(); } fn setup(mut commands: Commands, assets: Res) { let chunk_size = UVec2::splat(8); let tile_display_size = UVec2::splat(64); // We'll use each possible orientation, one per column let orientation = [ TileOrientation::Default, TileOrientation::Rotate90, TileOrientation::Rotate180, TileOrientation::Rotate270, TileOrientation::MirrorH, TileOrientation::MirrorHRotate90, TileOrientation::MirrorHRotate180, TileOrientation::MirrorHRotate270, ]; // Show different color/alpha on each row let colors = [ Color::WHITE, Color::linear_rgb(1.0, 0.0, 0.0), Color::linear_rgb(0.0, 1.0, 0.0), Color::linear_rgb(0.0, 0.0, 1.0), Color::linear_rgba(1.0, 0.0, 0.0, 0.25), Color::linear_rgba(0.0, 1.0, 0.0, 0.25), Color::linear_rgba(0.0, 0.0, 1.0, 0.25), Color::linear_rgba(1.0, 1.0, 1.0, 0.5), ]; let tile_data = (0..chunk_size.element_product()) .map(|i| { let row = i / 8; let col = i % 8; Some(TileData { // Alternate tiles per row tileset_index: (row % 2) as u16, color: colors[row as usize], // Last (top) row is invisible visible: row != 7, orientation: orientation[col as usize], }) }) .collect(); commands.spawn(( TilemapChunk { chunk_size, tile_display_size, tileset: assets .load_builder() .with_settings(|settings: &mut ImageLoaderSettings| { // The tileset texture is expected to be an array of tile textures, so we tell the // `ImageLoader` that our texture is composed of 2 stacked tile images. settings.array_layout = Some(ImageArrayLayout::RowCount { rows: 2 }); }) .load("textures/arrow.png"), alpha_mode: AlphaMode2d::Blend, }, TilemapChunkTileData(tile_data), )); commands.spawn(Camera2d); }