use bevy::prelude::*; use bevy_ecs_tilemap::prelude::*; mod helpers; // Side length of a colored quadrant (in "number of tiles"). const QUADRANT_SIDE_LENGTH: u32 = 80; fn startup(mut commands: Commands, asset_server: Res) { commands.spawn(Camera2dBundle::default()); let texture_handle: Handle = asset_server.load("flat_hex_tiles.png"); // In total, there will be `(QUADRANT_SIDE_LENGTH * 2) * (QUADRANT_SIDE_LENGTH * 2)` tiles. let map_size = TilemapSize { x: QUADRANT_SIDE_LENGTH * 2, y: QUADRANT_SIDE_LENGTH * 2, }; let quadrant_size = TilemapSize { x: QUADRANT_SIDE_LENGTH, y: QUADRANT_SIDE_LENGTH, }; let mut tile_storage = TileStorage::empty(map_size); let tilemap_entity = commands.spawn_empty().id(); let tilemap_id = TilemapId(tilemap_entity); fill_tilemap_rect( TileTextureIndex(0), TilePos { x: 0, y: 0 }, quadrant_size, tilemap_id, &mut commands, &mut tile_storage, ); fill_tilemap_rect( TileTextureIndex(1), TilePos { x: QUADRANT_SIDE_LENGTH, y: 0, }, quadrant_size, tilemap_id, &mut commands, &mut tile_storage, ); fill_tilemap_rect( TileTextureIndex(2), TilePos { x: 0, y: QUADRANT_SIDE_LENGTH, }, quadrant_size, tilemap_id, &mut commands, &mut tile_storage, ); fill_tilemap_rect( TileTextureIndex(3), TilePos { x: QUADRANT_SIDE_LENGTH, y: QUADRANT_SIDE_LENGTH, }, quadrant_size, tilemap_id, &mut commands, &mut tile_storage, ); let tile_size = TilemapTileSize { x: 17.0, y: 15.0 }; let grid_size = TilemapGridSize { x: 17.0, y: 15.0 }; let map_type = TilemapType::Hexagon(HexCoordSystem::Column); commands.entity(tilemap_entity).insert(TilemapBundle { grid_size, size: map_size, storage: tile_storage, texture: TilemapTexture::Single(texture_handle), tile_size, map_type, transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 0.0), ..Default::default() }); } fn swap_mesh_type( mut query: Query<( &mut Transform, &TilemapSize, &TilemapGridSize, &mut TilemapType, )>, keyboard_input: Res>, ) { if keyboard_input.just_pressed(KeyCode::Space) { for (mut transform, map_size, grid_size, mut map_type) in query.iter_mut() { match *map_type { TilemapType::Hexagon(HexCoordSystem::Column) => { *map_type = TilemapType::Hexagon(HexCoordSystem::ColumnEven); } TilemapType::Hexagon(HexCoordSystem::ColumnEven) => { *map_type = TilemapType::Hexagon(HexCoordSystem::ColumnOdd); } TilemapType::Hexagon(HexCoordSystem::ColumnOdd) => { *map_type = TilemapType::Hexagon(HexCoordSystem::Column); } _ => {} } *transform = get_tilemap_center_transform(map_size, grid_size, &map_type, 0.0); } } } fn main() { App::new() .add_plugins( DefaultPlugins .set(WindowPlugin { primary_window: Some(Window { title: String::from("Hexagon Column Example"), ..Default::default() }), ..default() }) .set(ImagePlugin::default_nearest()), ) .add_plugins(TilemapPlugin) .add_systems(Startup, startup) .add_systems(Update, helpers::camera::movement) .add_systems(Update, swap_mesh_type) .run(); }