Main Menu

This commit is contained in:
Rendo 2025-11-17 17:59:59 +05:00
commit 241078096f
5 changed files with 105 additions and 9 deletions

View file

@ -1,3 +1,4 @@
use bevy::input_focus::InputFocus;
use bevy::prelude::*; use bevy::prelude::*;
use bevy::window::WindowResolution; use bevy::window::WindowResolution;
@ -6,6 +7,7 @@ use crate::collision::CollisionPlugin;
use crate::damagable::DamagablePlugin; use crate::damagable::DamagablePlugin;
use crate::projectile::ProjectilePlugin; use crate::projectile::ProjectilePlugin;
use crate::ships::ShipsPlugin; use crate::ships::ShipsPlugin;
use crate::ui::UIPlugin;
use crate::velocity::VelocityPlugin; use crate::velocity::VelocityPlugin;
mod asteroid; mod asteroid;
@ -13,6 +15,7 @@ mod collision;
mod damagable; mod damagable;
mod projectile; mod projectile;
mod ships; mod ships;
mod ui;
mod velocity; mod velocity;
const FIRST_CORNER_X: f32 = -512.; const FIRST_CORNER_X: f32 = -512.;
@ -29,6 +32,8 @@ pub enum GameState {
fn main() { fn main() {
App::new() App::new()
.insert_resource(ClearColor(Color::srgb(0.0, 0.0, 0.0)))
.init_resource::<InputFocus>()
.add_plugins( .add_plugins(
DefaultPlugins DefaultPlugins
.set(WindowPlugin { .set(WindowPlugin {
@ -44,12 +49,18 @@ fn main() {
}) })
.set(ImagePlugin::default_nearest()), .set(ImagePlugin::default_nearest()),
) )
.insert_state(GameState::Game) .insert_state(GameState::InMenu)
.add_plugins(VelocityPlugin) .add_plugins((
.add_plugins(CollisionPlugin) VelocityPlugin,
.add_plugins(ShipsPlugin) CollisionPlugin,
.add_plugins(DamagablePlugin) ShipsPlugin,
.add_plugins(ProjectilePlugin) DamagablePlugin,
.add_plugins(AsteroidPlugin) ProjectilePlugin,
AsteroidPlugin,
UIPlugin,
))
.add_systems(Startup, |mut commands: Commands| {
commands.spawn(Camera2d);
})
.run(); .run();
} }

View file

@ -49,8 +49,6 @@ fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
let player_sprite: Handle<Image> = asset_server.load("player.png"); let player_sprite: Handle<Image> = asset_server.load("player.png");
let enemy_sprite: Handle<Image> = asset_server.load("enemy.png"); let enemy_sprite: Handle<Image> = asset_server.load("enemy.png");
commands.spawn(Camera2d);
player::spawn_player(&mut commands, player_sprite, Vec2::new(0., 0.)); player::spawn_player(&mut commands, player_sprite, Vec2::new(0., 0.));
enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(100., 100.)); enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(100., 100.));
} }

0
src/ui/game_over.rs Normal file
View file

68
src/ui/main_menu.rs Normal file
View file

@ -0,0 +1,68 @@
use bevy::{input_focus::InputFocus, prelude::*};
use crate::GameState;
#[derive(Component)]
pub struct Menu;
pub fn setup_menu(mut commands: Commands) {
//setup menu text
commands.spawn((
Text::new("NOW IT'S YOUR CHANCE TO BE\nA\nBIG\nFELORONI"),
TextFont {
font_size: 32.,
..default()
},
TextLayout::new_with_justify(Justify::Center),
Menu,
Node {
position_type: PositionType::Absolute,
top: percent(25),
right: percent(33),
..default()
},
));
//setup button
commands.spawn((
Button,
Node {
width: px(150),
height: px(65),
border: UiRect::all(px(5)),
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
..default()
},
Menu,
children![(Text::new("Igron"))],
));
}
pub fn button_system(
mut commands: Commands,
mut input_focus: ResMut<InputFocus>,
interaction_query: Query<(Entity, &Interaction, &mut Button), Changed<Interaction>>,
) {
for (entity, interaction, mut button) in interaction_query {
match interaction {
Interaction::Pressed => {
input_focus.set(entity);
button.set_changed();
commands.set_state(GameState::Game);
}
Interaction::Hovered => {
input_focus.set(entity);
button.set_changed();
}
Interaction::None => {
input_focus.clear();
}
}
}
}
pub fn cleanup_menu(mut commands: Commands, query: Query<Entity, With<Menu>>) {
for entity in query {
commands.get_entity(entity).unwrap().despawn();
}
}

19
src/ui/mod.rs Normal file
View file

@ -0,0 +1,19 @@
use bevy::prelude::*;
use crate::GameState;
use game_over::*;
use main_menu::*;
mod game_over;
mod main_menu;
pub struct UIPlugin;
impl Plugin for UIPlugin {
fn build(&self, app: &mut App) {
app.add_systems(OnEnter(GameState::InMenu), setup_menu)
.add_systems(Update, button_system.run_if(in_state(GameState::InMenu)))
.add_systems(OnExit(GameState::InMenu), cleanup_menu);
}
}