2022-08-10 20:28:33 +02:00
|
|
|
// Copyright 2022 ModZero.
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
2022-08-10 17:54:15 +02:00
|
|
|
use bevy::{
|
2022-08-11 05:11:22 +02:00
|
|
|
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
2022-08-10 17:54:15 +02:00
|
|
|
input::mouse::MouseMotion,
|
|
|
|
prelude::*,
|
2022-08-11 05:11:22 +02:00
|
|
|
render::texture::ImageSettings,
|
2022-08-10 17:54:15 +02:00
|
|
|
};
|
2022-05-13 00:36:25 +02:00
|
|
|
use bevy_ecs_tilemap::prelude::*;
|
2022-08-11 05:11:22 +02:00
|
|
|
use rand::{thread_rng, Rng};
|
2022-05-13 00:36:25 +02:00
|
|
|
|
2022-08-11 05:11:22 +02:00
|
|
|
fn make_ground_layer(
|
|
|
|
commands: &mut Commands,
|
|
|
|
tilemap_size: TilemapSize,
|
|
|
|
texture_handle: Handle<Image>,
|
|
|
|
tile_size: TilemapTileSize,
|
|
|
|
) {
|
2022-08-10 17:54:15 +02:00
|
|
|
let mut tile_storage = TileStorage::empty(tilemap_size);
|
|
|
|
let tilemap_entity = commands.spawn().id();
|
2022-08-11 05:11:22 +02:00
|
|
|
let mut random = thread_rng();
|
2022-05-13 00:36:25 +02:00
|
|
|
|
2022-08-11 05:11:22 +02:00
|
|
|
for x in 0..tilemap_size.x {
|
|
|
|
for y in 0..tilemap_size.y {
|
2022-08-10 17:54:15 +02:00
|
|
|
let tile_pos = TilePos { x, y };
|
|
|
|
let tile_entity = commands
|
|
|
|
.spawn()
|
|
|
|
.insert_bundle(TileBundle {
|
|
|
|
position: tile_pos,
|
|
|
|
tilemap_id: TilemapId(tilemap_entity),
|
2022-08-11 05:11:22 +02:00
|
|
|
texture: TileTexture(random.gen_range(13..=19)),
|
2022-08-10 17:54:15 +02:00
|
|
|
..Default::default()
|
|
|
|
})
|
|
|
|
.id();
|
|
|
|
tile_storage.set(&tile_pos, Some(tile_entity));
|
|
|
|
}
|
|
|
|
}
|
2022-05-13 00:36:25 +02:00
|
|
|
|
|
|
|
commands
|
2022-08-10 17:54:15 +02:00
|
|
|
.entity(tilemap_entity)
|
|
|
|
.insert_bundle(TilemapBundle {
|
2022-08-11 05:11:22 +02:00
|
|
|
grid_size: tile_size.into(),
|
2022-08-10 17:54:15 +02:00
|
|
|
size: tilemap_size,
|
|
|
|
storage: tile_storage,
|
|
|
|
texture: TilemapTexture(texture_handle),
|
|
|
|
tile_size,
|
2022-08-11 05:11:22 +02:00
|
|
|
transform: bevy_ecs_tilemap::helpers::get_centered_transform_2d(
|
|
|
|
&tilemap_size,
|
|
|
|
&tile_size,
|
|
|
|
0.0,
|
|
|
|
),
|
2022-08-10 17:54:15 +02:00
|
|
|
..Default::default()
|
|
|
|
});
|
2022-05-13 00:36:25 +02:00
|
|
|
}
|
|
|
|
|
2022-08-11 05:11:22 +02:00
|
|
|
fn make_wall_layer(
|
|
|
|
commands: &mut Commands,
|
|
|
|
tilemap_size: TilemapSize,
|
|
|
|
texture_handle: Handle<Image>,
|
|
|
|
tile_size: TilemapTileSize,
|
|
|
|
) {
|
|
|
|
let mut tile_storage = TileStorage::empty(tilemap_size);
|
|
|
|
let tilemap_entity = commands.spawn().id();
|
|
|
|
let mut random = thread_rng();
|
|
|
|
|
|
|
|
for x in 0..tilemap_size.x {
|
|
|
|
for y in 0..tilemap_size.y {
|
|
|
|
let tile_pos = TilePos { x, y };
|
|
|
|
if random.gen_bool(0.5) {
|
|
|
|
let tile_entity = commands
|
|
|
|
.spawn()
|
|
|
|
.insert_bundle(TileBundle {
|
|
|
|
position: tile_pos,
|
|
|
|
tilemap_id: TilemapId(tilemap_entity),
|
|
|
|
texture: TileTexture(random.gen_range(0..=12)),
|
|
|
|
..Default::default()
|
|
|
|
})
|
|
|
|
.id();
|
|
|
|
tile_storage.set(&tile_pos, Some(tile_entity));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
commands
|
|
|
|
.entity(tilemap_entity)
|
|
|
|
.insert_bundle(TilemapBundle {
|
|
|
|
grid_size: tile_size.into(),
|
|
|
|
size: tilemap_size,
|
|
|
|
storage: tile_storage,
|
|
|
|
texture: TilemapTexture(texture_handle),
|
|
|
|
tile_size,
|
|
|
|
transform: bevy_ecs_tilemap::helpers::get_centered_transform_2d(
|
|
|
|
&tilemap_size,
|
|
|
|
&tile_size,
|
|
|
|
1.0,
|
|
|
|
),
|
|
|
|
..Default::default()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
|
|
|
commands.spawn_bundle(Camera2dBundle::default());
|
|
|
|
|
|
|
|
let texture_handle = asset_server.load("tileset.png");
|
|
|
|
|
|
|
|
let tilemap_size = TilemapSize { x: 320, y: 320 };
|
|
|
|
let tile_size = TilemapTileSize { x: 32.0, y: 32.0 };
|
|
|
|
|
|
|
|
make_ground_layer(
|
|
|
|
&mut commands,
|
|
|
|
tilemap_size,
|
|
|
|
texture_handle.clone(),
|
|
|
|
tile_size,
|
|
|
|
);
|
|
|
|
make_wall_layer(
|
|
|
|
&mut commands,
|
|
|
|
tilemap_size,
|
|
|
|
texture_handle,
|
|
|
|
tile_size,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-05-13 01:13:09 +02:00
|
|
|
fn mouse_motion(
|
|
|
|
mut motion_evr: EventReader<MouseMotion>,
|
|
|
|
buttons: Res<Input<MouseButton>>,
|
|
|
|
mut query: Query<(&mut Transform, &mut OrthographicProjection), With<Camera>>,
|
|
|
|
) {
|
|
|
|
if buttons.pressed(MouseButton::Middle) {
|
|
|
|
for ev in motion_evr.iter() {
|
|
|
|
for (mut transform, mut _ortho) in query.iter_mut() {
|
|
|
|
let direction = Vec3::new(ev.delta.x, ev.delta.y * -1.0, 0.0);
|
|
|
|
transform.translation += direction;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-12 23:47:19 +02:00
|
|
|
fn main() {
|
2022-05-13 00:36:25 +02:00
|
|
|
App::new()
|
|
|
|
.insert_resource(WindowDescriptor {
|
|
|
|
width: 1270.0,
|
|
|
|
height: 720.0,
|
|
|
|
title: String::from("Monstrous"),
|
|
|
|
..Default::default()
|
|
|
|
})
|
2022-08-10 17:54:15 +02:00
|
|
|
.insert_resource(ImageSettings::default_nearest())
|
2022-05-13 00:36:25 +02:00
|
|
|
.add_plugins(DefaultPlugins)
|
2022-08-10 17:54:15 +02:00
|
|
|
.add_plugin(LogDiagnosticsPlugin::default())
|
|
|
|
.add_plugin(FrameTimeDiagnosticsPlugin::default())
|
2022-05-13 00:36:25 +02:00
|
|
|
.add_plugin(TilemapPlugin)
|
|
|
|
.add_startup_system(startup)
|
2022-05-13 01:13:09 +02:00
|
|
|
.add_system(mouse_motion)
|
2022-05-13 00:36:25 +02:00
|
|
|
.run();
|
2022-05-12 23:47:19 +02:00
|
|
|
}
|