use bevy::{
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
math::{uvec2, vec2},
prelude::*,
window::PresentMode,
};
use bevy_fast_tilemap::prelude::*;
use rand::Rng;
#[path = "common/mouse_controls_camera.rs"]
mod mouse_controls_camera;
use mouse_controls_camera::MouseControlsCameraPlugin;
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
title: String::from("Fast Tilemap example"),
resolution: (1820., 920.).into(),
present_mode: PresentMode::Immediate,
..default()
}),
..default()
}),
LogDiagnosticsPlugin::default(),
FrameTimeDiagnosticsPlugin::default(),
MouseControlsCameraPlugin::default(),
FastTileMapPlugin::default(),
))
.add_systems(Startup, startup)
.add_systems(Update, show_coordinate)
.run();
}
fn startup(
mut commands: Commands,
asset_server: Res<AssetServer>,
mut materials: ResMut<Assets<Map>>,
) {
commands.spawn(Camera2dBundle::default());
let map = Map::builder(
uvec2(100, 100),
asset_server.load("iso_256x128_dominance.png"),
vec2(256.0, 128.0),
)
.with_padding(vec2(256.0, 128.0), vec2(256.0, 128.0), vec2(256.0, 128.0))
.with_projection(AXONOMETRIC)
.with_dominance_overhang()
.build_and_initialize(init_map);
commands.spawn(MapBundleManaged::new(map, materials.as_mut()));
}
fn init_map(m: &mut MapIndexerMut) {
let mut rng = rand::thread_rng();
for y in 0..m.size().y {
for x in 0..m.size().x {
m.set(x, y, rng.gen_range(1..4));
}
}
}
fn show_coordinate(
mut cursor_moved_events: EventReader<CursorMoved>,
mut camera_query: Query<(&GlobalTransform, &Camera), With<OrthographicProjection>>,
mut materials: ResMut<Assets<Map>>,
maps: Query<&Handle<Map>>,
) {
for event in cursor_moved_events.read() {
for map_handle in maps.iter() {
let map = materials.get_mut(map_handle).unwrap();
for (global, camera) in camera_query.iter_mut() {
if let Some(world) = camera
.viewport_to_world(global, event.position)
.map(|ray| ray.origin.truncate())
{
let coord = map.world_to_map(world);
println!("Map coordinate: {:?}", coord);
} } } } }