From d5fd1384da3c5bca0a5a020bdc8431b8dff0903a Mon Sep 17 00:00:00 2001 From: Ho <william.ho@etu.hesge.ch> Date: Tue, 24 Oct 2023 13:42:00 +0200 Subject: [PATCH] Je suis trop fort ^^ --- game/Cargo.lock | 97 +++++++-------- game/Cargo.toml | 1 + game/assets/eleve.png | Bin 0 -> 243 bytes game/assets/enemy.png | Bin 0 -> 214 bytes game/assets/mapdebut.png | Bin 0 -> 5557 bytes game/src/game.rs | 252 +++++++++++++++++++++++++-------------- game/src/main.rs | 16 ++- game/src/menu.rs | 35 +++++- game/src/player.rs | 43 +++++++ 9 files changed, 298 insertions(+), 146 deletions(-) create mode 100644 game/assets/eleve.png create mode 100644 game/assets/enemy.png create mode 100644 game/assets/mapdebut.png create mode 100644 game/src/player.rs diff --git a/game/Cargo.lock b/game/Cargo.lock index 1ee3696..b06f418 100644 --- a/game/Cargo.lock +++ b/game/Cargo.lock @@ -354,7 +354,7 @@ dependencies = [ "fastrand 1.9.0", "js-sys", "notify", - "parking_lot 0.12.1", + "parking_lot", "serde", "thiserror", "wasm-bindgen", @@ -378,7 +378,7 @@ dependencies = [ "bevy_transform", "bevy_utils", "oboe", - "parking_lot 0.12.1", + "parking_lot", "rodio", ] @@ -712,7 +712,7 @@ dependencies = [ "erased-serde", "glam", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "serde", "smallvec", "smol_str", @@ -770,7 +770,7 @@ dependencies = [ "ktx2", "naga", "naga_oil", - "parking_lot 0.12.1", + "parking_lot", "regex", "ruzstd", "serde", @@ -1321,7 +1321,7 @@ dependencies = [ "ndk-context", "oboe", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1485,7 +1485,7 @@ checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "windows-sys 0.48.0", ] @@ -1567,6 +1567,7 @@ name = "game" version = "0.1.0" dependencies = [ "bevy", + "rand", ] [[package]] @@ -2462,7 +2463,7 @@ version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8378ac0dfbd4e7895f2d2c1f1345cab3836910baf3a300b000d04250f0c8428f" dependencies = [ - "redox_syscall 0.3.5", + "redox_syscall", ] [[package]] @@ -2486,17 +2487,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e52c774a4c39359c1d1c52e43f73dd91a75a614652c825408eec30c95a9b2067" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -2504,21 +2494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -2529,7 +2505,7 @@ checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", "windows-targets 0.48.5", ] @@ -2596,6 +2572,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -2636,6 +2618,36 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "range-alloc" version = "0.1.3" @@ -2654,15 +2666,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.3.5" @@ -3292,7 +3295,7 @@ dependencies = [ "js-sys", "log", "naga", - "parking_lot 0.11.2", + "parking_lot", "profiling", "raw-window-handle", "smallvec", @@ -3317,7 +3320,7 @@ dependencies = [ "codespan-reporting", "log", "naga", - "parking_lot 0.11.2", + "parking_lot", "profiling", "raw-window-handle", "rustc-hash", @@ -3356,7 +3359,7 @@ dependencies = [ "metal", "naga", "objc", - "parking_lot 0.11.2", + "parking_lot", "profiling", "range-alloc", "raw-window-handle", @@ -3642,7 +3645,7 @@ dependencies = [ "orbclient", "percent-encoding", "raw-window-handle", - "redox_syscall 0.3.5", + "redox_syscall", "wasm-bindgen", "wayland-scanner", "web-sys", diff --git a/game/Cargo.toml b/game/Cargo.toml index cf168c6..ef923c5 100644 --- a/game/Cargo.toml +++ b/game/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] bevy = "0.11.3" +rand = "0.8.5" # Enable a small amount of optimization in debug mode [profile.dev] diff --git a/game/assets/eleve.png b/game/assets/eleve.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0a0676c2003810983da014392052b492860b08 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z_8ZS z#WBRfKRIQAfWf0n_Ufme*>8$DwMjYRYLckSbsl4m*@_Zu4JOrWHxf&4eB*7GxWIex zRnzj-tNwX^o@Qk8_YSWa$FXUA*@pxAFEix$Dcoduxxs9MrGI#+V~mrzxI?aMr(4dp z<|~Q3&D)K%G-f3}RQ&UVudvbL16#u-M)!+aQ)c|RDDGCH(@>gM-!H{Cuj$Bh)-K*3 w^&R{<){n2ZCv5&#e7ZT)ZMVO~ItGS!RX&10#Bc0oU|?YIboFyt=akR{09GnqDF6Tf literal 0 HcmV?d00001 diff --git a/game/assets/enemy.png b/game/assets/enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..263c034500842964567f63c10ac5c96ba9f18812 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z%aqn z#WBRfKRIQAfI-lT`HY7fbfdTZIi9|vzn{NLZVj76opsyQp3gC1JTB4-ve%A%C<zt4 zp&&6^gV{l9-nvzXUh%%%V8$b!%zNbj|NqUr2`Mce&N~(CGT9cevs`3L_{?VZyg9a0 z`BZ_cYGE8hrF8qj5+eqY-UU0{*%p{MmY6u1E~;kEu6TIb=ZUm~mlG3%@KQU$qqgn; R85kHCJYD@<);T3K0RY4>N;m)j literal 0 HcmV?d00001 diff --git a/game/assets/mapdebut.png b/game/assets/mapdebut.png new file mode 100644 index 0000000000000000000000000000000000000000..b79ba97a84ead7173fe31219fcdaa5a637e20897 GIT binary patch literal 5557 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 literal 0 HcmV?d00001 diff --git a/game/src/game.rs b/game/src/game.rs index de6a741..882f9a3 100644 --- a/game/src/game.rs +++ b/game/src/game.rs @@ -1,6 +1,10 @@ +use std::collections::btree_map::Keys; + use bevy::prelude::*; +use rand::Rng; + - use super::{despawn_screen, DisplayQuality, GameState, Volume, TEXT_COLOR}; +use super::{despawn_screen, DisplayQuality, GameState, Volume, TEXT_COLOR}; // This plugin will contain the game. In this case, it's just be a screen that will // display the current settings for 5 seconds before returning to the menu @@ -8,117 +12,181 @@ use bevy::prelude::*; impl Plugin for GamePlugin { fn build(&self, app: &mut App) { - app.add_systems(OnEnter(GameState::Game), game_setup) + app.add_systems(OnEnter(GameState::Game), (game_setup ,spawn_enemies)) .add_systems(Update, game.run_if(in_state(GameState::Game))) - .add_systems(OnExit(GameState::Game), despawn_screen::<OnGameScreen>); + .add_systems(OnExit(GameState::Game), ( + despawn_game::<Player>, + despawn_game::<Enemy>, + despawn_game::<OnGameScreen>, + )); } } // Tag component used to tag entities added on the game screen + #[derive(Component)] struct OnGameScreen; #[derive(Resource, Deref, DerefMut)] struct GameTimer(Timer); - fn game_setup( - mut commands: Commands, - display_quality: Res<DisplayQuality>, - volume: Res<Volume>, - ) { + #[derive(Component)] + struct Player; + + #[derive(Component)] + struct Enemy; + + + #[derive(Component)] + struct CollisionBox { + width: f32, + height: f32, + } + + #[derive(Component)] + struct CombatText; + + + fn game_setup(mut commands: Commands, + asset_server: Res<AssetServer>, + mut map_query: Query<&Transform, With<Player>> + ){ + + let map_texture = asset_server.load("mapdebut.png"); commands - .spawn(( - NodeBundle { - style: Style { - width: Val::Percent(100.0), - height: Val::Percent(100.0), - // center children - align_items: AlignItems::Center, - justify_content: JustifyContent::Center, - ..default() - }, + .spawn( + SpriteBundle { + sprite: Sprite { + custom_size: Some(Vec2::new(600.0, 600.0)), + ..default() + }, // Assurez-vous d'ajuster la taille selon votre image + texture: map_texture, + ..default() + }, + //OnGameScreen, + ) + .insert(OnGameScreen); + + let texture = asset_server.load("eleve.png"); + commands + .spawn( + SpriteBundle { + sprite: Sprite { + custom_size: Some(Vec2::new(50.0, 50.0)), + color: Color::WHITE, + flip_x: false, + flip_y: false, + ..default() + }, + texture: texture, + ..default() + }) + .insert(Player); + } + + fn spawn_enemies(mut commands: Commands, asset_server: Res<AssetServer>, mut materials: ResMut<Assets<ColorMaterial>>) { + let enemy_texture = asset_server.load("enemy.png"); + + // Définir le nombre maximum d'ennemis + let max_enemies = 5; + + // Générer une position aléatoire pour chaque ennemi + let mut rng = rand::thread_rng(); + for _ in 0..max_enemies { + let x_position = rng.gen_range(-300.0..300.0); // Assurez-vous d'ajuster ces valeurs en fonction de la taille de votre carte + let y_position = rng.gen_range(-300.0..300.0); + + commands.spawn(SpriteBundle { + sprite: Sprite { + custom_size: Some(Vec2::new(50.0, 50.0)), + ..default() + }, + transform: Transform { + translation: Vec3::new(x_position, y_position, 0.0), ..default() }, - OnGameScreen, - )) - .with_children(|parent| { - // First create a `NodeBundle` for centering what we want to display - parent - .spawn(NodeBundle { - style: Style { - // This will display its children in a column, from top to bottom - flex_direction: FlexDirection::Column, - // `align_items` will align children on the cross axis. Here the main axis is - // vertical (column), so the cross axis is horizontal. This will center the - // children - align_items: AlignItems::Center, - ..default() - }, - background_color: Color::BLACK.into(), - ..default() - }) - .with_children(|parent| { - // Display two lines of text, the second one with the current settings - parent.spawn( - TextBundle::from_section( - "Will be back to the menu shortly...", - TextStyle { - font_size: 80.0, - color: TEXT_COLOR, - ..default() - }, - ) - .with_style(Style { - margin: UiRect::all(Val::Px(50.0)), - ..default() - }), - ); - parent.spawn( - TextBundle::from_sections([ - TextSection::new( - format!("quality: {:?}", *display_quality), - TextStyle { - font_size: 60.0, - color: Color::BLUE, - ..default() - }, - ), - TextSection::new( - " - ", - TextStyle { - font_size: 60.0, - color: TEXT_COLOR, - ..default() - }, - ), - TextSection::new( - format!("volume: {:?}", *volume), - TextStyle { - font_size: 60.0, - color: Color::GREEN, - ..default() - }, - ), - ]) - .with_style(Style { - margin: UiRect::all(Val::Px(50.0)), - ..default() - }), - ); - }); - }); - // Spawn a 5 seconds timer to trigger going back to the menu - commands.insert_resource(GameTimer(Timer::from_seconds(5.0, TimerMode::Once))); + texture: enemy_texture.clone(), + ..default() + }) + .insert(Enemy) + //.insert(Health { current: 100, max: 100 }) + //.insert(Attack { damage: 10 }) + .insert(CollisionBox { width: 75.0, height: 75.0 }); + } } + - // Tick the timer, and change state when finished fn game( + mut characters: Query<(&mut Transform, &Sprite), With<Player>>, + input: Res<Input<KeyCode>>, time: Res<Time>, mut game_state: ResMut<NextState<GameState>>, - mut timer: ResMut<GameTimer>, ) { - if timer.tick(time.delta()).finished() { - game_state.set(GameState::Menu); + for (mut transform, _) in &mut characters { + if input.pressed(KeyCode::W) { + transform.translation.y += 100.0 * time.delta_seconds(); + } + if input.pressed(KeyCode::S) { + transform.translation.y -= 100.0 * time.delta_seconds(); + } + if input.pressed(KeyCode::D) { + transform.translation.x += 100.0 * time.delta_seconds(); + } + if input.pressed(KeyCode::A) { + transform.translation.x -= 100.0 * time.delta_seconds(); + } + if input.pressed(KeyCode::Escape) { + game_state.set(GameState::Menu); + } } } + fn attack_system( + mut commands: Commands, + asset_server: Res<AssetServer>, + mut player_query: Query<&Transform, With<Player>>, + mut enemy_query: Query<&Transform, With<Enemy>>, + combat_text_query: Query<Entity, With<CombatText>>, // Query to handle existing combat texts + ) { + // Check if the player is near an enemy to show the combat text + for (player_transform) in player_query.iter_mut() { + let mut in_combat = false; + for (enemy_transform) in enemy_query.iter_mut() { + if player_transform.translation.distance(enemy_transform.translation) < 60.0 { // Adjust this value based on the size of your collision box + in_combat = true; + break; + } + } + let has_combat_text = combat_text_query.iter().next().is_some(); + + if in_combat && !has_combat_text { + // Display the combat text + commands.spawn(TextBundle { + text: Text { + sections: vec![TextSection { + value: "Combat".to_string(), + style: TextStyle { + font: asset_server.load("FiraSans-Bold.ttf"), // Adjust this font path + font_size: 40.0, + color: Color::WHITE, + }, + }], + ..Default::default() + }, + ..Default::default() + }) + .insert(CombatText); + } else if !in_combat && has_combat_text { + // Remove the combat text + for entity in combat_text_query.iter() { + commands.entity(entity).despawn(); + } + } + } + } + + fn despawn_game<T: Component>(to_despawn: Query<Entity, With<T>>, mut commands: Commands) { + for entity in &to_despawn { + commands.entity(entity).despawn_recursive(); + } + } diff --git a/game/src/main.rs b/game/src/main.rs index 83417e8..5572ac7 100644 --- a/game/src/main.rs +++ b/game/src/main.rs @@ -17,6 +17,7 @@ enum GameState { Splash, Menu, Game, + Fight, } // One of the two settings that can be set through the menu. It will be a resource in the app @@ -27,17 +28,25 @@ enum DisplayQuality { High, } +// Stores the various windows-resolution we can select between. +#[derive(Resource)] +struct ResolutionSettings { + large: Vec2, + medium: Vec2, + small: Vec2, +} + // One of the two settings that can be set through the menu. It will be a resource in the app #[derive(Resource, Debug, Component, PartialEq, Eq, Clone, Copy)] struct Volume(u32); fn main() { - App::new()/* + App::new() .insert_resource(ResolutionSettings { large: Vec2::new(1920.0, 1080.0), - medium: Vec2::new(800.0, 600.0), + medium: Vec2::new(1200.0, 720.0), small: Vec2::new(640.0, 360.0), - })*/ + }) .add_plugins(DefaultPlugins) // Insert as resource the initial value for the settings resources .insert_resource(DisplayQuality::Medium) @@ -55,7 +64,6 @@ fn setup(mut commands: Commands) { commands.spawn(Camera2dBundle::default()); } - mod game; mod menu; diff --git a/game/src/menu.rs b/game/src/menu.rs index a3f023e..f0349fc 100644 --- a/game/src/menu.rs +++ b/game/src/menu.rs @@ -1,7 +1,9 @@ use bevy::{app::AppExit, prelude::*}; +use bevy::{prelude::*, window::WindowResized}; +use bevy::{window::PrimaryWindow}; use super::{despawn_screen, DisplayQuality, GameState, Volume, TEXT_COLOR}; - + use crate::ResolutionSettings; // This plugin manages the menu, with 5 different screens: // - a main menu with "New Game", "Settings", "Quit" // - a settings menu with two submenus and a back button @@ -55,7 +57,8 @@ use bevy::{app::AppExit, prelude::*}; .add_systems( Update, (menu_action, button_system).run_if(in_state(GameState::Menu)), - ); + ) + .add_systems(Update, toggle_resolution); } } @@ -147,7 +150,7 @@ use bevy::{app::AppExit, prelude::*}; menu_state.set(MenuState::Main); } - fn main_menu_setup(mut commands: Commands, asset_server: Res<AssetServer>) { + fn main_menu_setup(mut commands: Commands, asset_server: Res<AssetServer>, window_query: Query<&mut Window, With<PrimaryWindow>>) { // Common style for all buttons on the screen let button_style = Style { width: Val::Px(250.0), @@ -172,6 +175,8 @@ use bevy::{app::AppExit, prelude::*}; ..default() }; + let window = window_query.get_single().unwrap(); + commands .spawn(( NodeBundle { @@ -189,6 +194,7 @@ use bevy::{app::AppExit, prelude::*}; parent .spawn(NodeBundle { style: Style { + width: Val::Px(5000.0), flex_direction: FlexDirection::Column, align_items: AlignItems::Center, ..default() @@ -533,6 +539,29 @@ use bevy::{app::AppExit, prelude::*}; }); } + /// This system shows how to request the window to a new resolution +fn toggle_resolution( + keys: Res<Input<KeyCode>>, + mut windows: Query<&mut Window>, + resolution: Res<ResolutionSettings>, +) { + let mut window = windows.single_mut(); + + if keys.just_pressed(KeyCode::Key1) { + let res = resolution.small; + window.resolution.set(res.x, res.y); + } + if keys.just_pressed(KeyCode::Key2) { + let res = resolution.medium; + window.resolution.set(res.x, res.y); + } + if keys.just_pressed(KeyCode::Key3) { + let res = resolution.large; + window.resolution.set(res.x, res.y); + } +} + + fn menu_action( interaction_query: Query< (&Interaction, &MenuButtonAction), diff --git a/game/src/player.rs b/game/src/player.rs new file mode 100644 index 0000000..db1fdf6 --- /dev/null +++ b/game/src/player.rs @@ -0,0 +1,43 @@ +use bevy::prelude::*; + +pub struct PlayerHistory { + pub target_position: Vec2, + pub new_position: Vec2, + pub timer: Timer, +} + +impl PlayerHistory { + pub fn update_position(&mut self, new_position: Vec3) { + self.target_position = self.new_position; + self.new_position = new_position; + } +} + +#[derive(Component)] +struct Enemy; + + +#[derive(Component)] +struct CollisionBox { + width: f32, + height: f32, +} + + +pub struct PlayerPlugin; + +impl Plugin for PlayerPlugin { + fn build(&self, app: &mut App) { + app.insert_resource(PlayerHistory{ + trarget_position: Vec2::ZERO, + new_position: Vec2::ZERO, + timer: Timer::new(Duration::from_secs_f32(0.2)), + }) + . + .add_systems(Update, character_movement) + .add_systems(Startup,spawn_enemies) + .add_systems(Update,attack_system) + + } + +} -- GitLab