aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacopograndi <jacopo.grandi@outlook.it>2022-06-19 17:03:48 +0200
committerjacopograndi <jacopo.grandi@outlook.it>2022-06-19 17:03:48 +0200
commit763df39024b1eed0a384b37b837eb5dd76c1eddf (patch)
tree4a989c2f36003cd7b2113cb9530f6373254aefcb /src
parentcd08f79d84411d6f4dff8a18ab79b363963f01b8 (diff)
map loaded
Diffstat (limited to 'src')
-rw-r--r--src/main.rs135
1 files changed, 131 insertions, 4 deletions
diff --git a/src/main.rs b/src/main.rs
index 183ac42..d3d9f70 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,19 +1,146 @@
-use bevy::{prelude::*, render::camera::ScalingMode};
-
mod debug;
-
use debug::DebugPlugin;
+use serde::Deserialize;
+
+use std::fs::File;
+use std::io::BufReader;
+
+use bevy_inspector_egui::Inspectable;
+
+use bevy::{prelude::*, sprite::MaterialMesh2dBundle, render::camera::ScalingMode};
+
+use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin};
+
fn main() {
App::new()
.add_plugins(DefaultPlugins)
- .add_plugin(DebugPlugin)
.add_startup_system(spawn_camera)
+ .add_startup_system(setup)
+ .add_system(movement.label("movement"))
+ .add_system(camera_follow.after("movement"))
+ .add_plugin(LogDiagnosticsPlugin::default())
+ .add_plugin(FrameTimeDiagnosticsPlugin::default())
.run();
}
fn spawn_camera(mut commands: Commands) {
let mut camera = OrthographicCameraBundle::new_2d();
camera.orthographic_projection.scaling_mode = ScalingMode::None;
+ camera.transform = Transform::from_xyz(0.0, 0.0, 100.0);
commands.spawn_bundle(camera);
}
+
+fn camera_follow(
+ player_query: Query<(&Transform, With<Player>)>,
+ mut camera_query: Query<&mut Transform, (Without<Player>, With<Camera>)>,
+) {
+ let (player_transform, _) = player_query.single();
+ let mut camera_transform = camera_query.single_mut();
+ camera_transform.translation.x = player_transform.translation.x;
+ camera_transform.translation.y = player_transform.translation.y;
+}
+
+#[derive(Component, Inspectable)]
+pub struct Player;
+
+fn movement (
+ mut player_query: Query<(&Player, &mut Transform)>,
+ keyboard: Res<Input<KeyCode>>,
+ time: Res<Time>,
+) {
+ let (_player, mut transform) = player_query.single_mut();
+
+ if keyboard.pressed(KeyCode::W) {
+ transform.translation.y += 1.0 * time.delta_seconds();
+ }
+ if keyboard.pressed(KeyCode::S) {
+ transform.translation.y -= 1.0 * time.delta_seconds();
+ }
+ if keyboard.pressed(KeyCode::A) {
+ transform.translation.x -= 1.0 * time.delta_seconds();
+ }
+ if keyboard.pressed(KeyCode::D) {
+ transform.translation.x += 1.0 * time.delta_seconds();
+ }
+}
+
+fn spawn_rect(
+ commands: &mut Commands,
+ meshes: &mut ResMut<Assets<Mesh>>,
+ materials: &mut ResMut<Assets<ColorMaterial>>,
+ color: Color,
+ pos: Vec3,
+ size: Vec3
+) {
+ commands.spawn_bundle(MaterialMesh2dBundle {
+ mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
+ transform: Transform {
+ translation: pos,
+ scale: size,
+ ..default()
+ },
+ material: materials.add(ColorMaterial::from(color)),
+ ..default()
+ });
+}
+
+#[derive(Deserialize)]
+struct Map {
+ name: String,
+ walls: Vec<Vec<i32>>,
+ hives: Vec<i32>,
+ lives: Vec<Vec<i32>>
+}
+
+fn setup_map(
+ mut commands: Commands,
+ mut meshes: ResMut<Assets<Mesh>>,
+ mut materials: ResMut<Assets<ColorMaterial>>,
+) {
+ let file = File::open("assets/maps/MAZE.txt").expect("No map file found");
+ let map : Map = serde_json::from_reader(BufReader::new(file)).unwrap();
+
+ for wall in &map.walls {
+ let upleft = Vec3::new(wall[0] as f32, wall[1] as f32, 0.0);
+ let downright = Vec3::new(wall[2] as f32, wall[3] as f32, 0.0);
+ let center = (upleft + downright) / 2.0 * 0.002;
+ let size_big = Vec3::new(
+ (wall[2] - wall[0] +10) as f32,
+ (wall[3] - wall[1] +10) as f32, 1.0) * 0.002;
+ spawn_rect(&mut commands, &mut meshes, &mut materials, Color::BLACK, center, size_big);
+ }
+ for wall in &map.walls {
+ let upleft = Vec3::new(wall[0] as f32, wall[1] as f32, 0.0);
+ let downright = Vec3::new(wall[2] as f32, wall[3] as f32, 0.0);
+ let center = (upleft + downright) / 2.0 * 0.002;
+ let size = Vec3::new(
+ (wall[2] - wall[0]) as f32,
+ (wall[3] - wall[1]) as f32, 1.0) * 0.002;
+ spawn_rect(&mut commands, &mut meshes, &mut materials, Color::WHITE, center, size);
+ }
+}
+
+fn setup(
+ mut commands: Commands,
+ mut meshes: ResMut<Assets<Mesh>>,
+ mut materials: ResMut<Assets<ColorMaterial>>,
+) {
+ let color = commands.spawn_bundle(MaterialMesh2dBundle {
+ mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
+ transform: Transform::default().with_scale(Vec3::splat(1.2)),
+ material: materials.add(ColorMaterial::from(Color::BLACK)),
+ ..default()
+ }).id();
+
+ commands.spawn_bundle(MaterialMesh2dBundle {
+ mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
+ transform: Transform::default().with_scale(Vec3::splat(0.03)),
+ material: materials.add(ColorMaterial::from(Color::WHITE)),
+ ..default()
+ })
+ .push_children(&[color])
+ .insert(Player);
+
+ setup_map(commands, meshes, materials);
+}