monstrous/src/main.rs

155 lines
4.6 KiB
Rust
Raw Normal View History

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
}