Compare commits

...

4 commits

Author SHA1 Message Date
f56ae2bc04 Spawn logic 2025-11-15 10:59:51 +05:00
1a11e0d670 Plugin for ships 2025-11-15 10:36:21 +05:00
8fc89d4215 refactor finish 2025-11-15 10:33:33 +05:00
45fee92eea refactor 2025-11-15 10:32:49 +05:00
7 changed files with 100 additions and 96 deletions

View file

@ -1,4 +0,0 @@
use bevy::ecs::component::Component;
#[derive(Component)]
pub struct Enemy;

View file

@ -1,87 +0,0 @@
use bevy::prelude::*;
use crate::{
collision::{Collided, Collider},
damagable::{
enemy::Enemy,
player::{Player, player_movement_system},
},
};
pub mod enemy;
pub mod player;
pub struct DamagablePlugin;
impl Plugin for DamagablePlugin {
fn build(&self, app: &mut App) {
app.insert_resource(Time::<Fixed>::from_hz(60.0))
.add_systems(Startup, setup)
.add_systems(
FixedUpdate,
(player_movement_system, movement_system).chain(),
);
}
}
#[derive(Component)]
pub struct Damagable {
hp: u32,
}
#[derive(Component)]
pub struct Movable {
linear_speed: f32,
rotation_speed: f32,
max_linear_speed: f32,
max_rotation_speed: f32,
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let player_sprite: Handle<Image> = asset_server.load("player.png");
let enemy_sprite: Handle<Image> = asset_server.load("enemy.png");
commands.spawn(Camera2d);
//Create player
commands.spawn((
Player { acceleration: 100. },
Movable {
linear_speed: 0.,
rotation_speed: 0.,
max_linear_speed: 500.,
max_rotation_speed: f32::to_radians(360.),
},
Damagable { hp: 10 },
Sprite::from_image(player_sprite),
Transform::from_xyz(20., 20., 0.),
Collider::new(8.),
));
commands.spawn((
Enemy,
Movable {
linear_speed: 0.,
rotation_speed: 0.,
max_linear_speed: 500.,
max_rotation_speed: f32::to_radians(360.),
},
Damagable { hp: 10 },
Sprite::from_image(enemy_sprite),
Transform::from_xyz(0., 0., 0.),
Collider::new(8.),
));
}
fn movement_system(time: Res<Time>, query: Query<(&Movable, &mut Transform)>) {
for (movable, mut transform) in query {
transform.rotate_z(movable.rotation_speed * time.delta_secs());
let movement_direction = transform.rotation * Vec3::X;
let movement_distance = movable.linear_speed * time.delta_secs();
let translation_delta = movement_direction * movement_distance;
transform.translation += translation_delta;
//TODO: Loop on bounds
}
}

View file

@ -1,15 +1,18 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::collision::{Collided, Collider, CollisionPlugin}; use crate::collision::CollisionPlugin;
use crate::damagable::DamagablePlugin; use crate::movable::MovablePlugin;
use crate::ships::ShipsPlugin;
mod collision; mod collision;
mod damagable; mod movable;
mod ships;
fn main() { fn main() {
App::new() App::new()
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_plugins(DamagablePlugin) .add_plugins(MovablePlugin)
.add_plugins(CollisionPlugin) .add_plugins(CollisionPlugin)
.add_plugins(ShipsPlugin)
.run(); .run();
} }

42
src/movable.rs Normal file
View file

@ -0,0 +1,42 @@
use bevy::prelude::*;
pub struct MovablePlugin;
impl Plugin for MovablePlugin {
fn build(&self, app: &mut App) {
app.insert_resource(Time::<Fixed>::from_hz(60.0))
.add_systems(FixedUpdate, movement_system);
}
}
#[derive(Component)]
pub struct Movable {
pub linear_speed: f32,
pub rotation_speed: f32,
pub max_linear_speed: f32,
pub max_rotation_speed: f32,
}
impl Movable {
pub fn new(max_linear_speed: f32, max_rotation_speed: f32) -> Movable {
Movable {
linear_speed: 0.,
rotation_speed: 0.,
max_linear_speed: max_linear_speed,
max_rotation_speed: max_rotation_speed,
}
}
}
fn movement_system(time: Res<Time>, query: Query<(&Movable, &mut Transform)>) {
for (movable, mut transform) in query {
transform.rotate_z(movable.rotation_speed * time.delta_secs());
let movement_direction = transform.rotation * Vec3::X;
let movement_distance = movable.linear_speed * time.delta_secs();
let translation_delta = movement_direction * movement_distance;
transform.translation += translation_delta;
//TODO: Loop on bounds
}
}

16
src/ships/enemy.rs Normal file
View file

@ -0,0 +1,16 @@
use bevy::prelude::*;
use crate::{collision::Collider, movable::Movable};
#[derive(Component)]
pub struct Enemy;
pub fn spawn_enemy(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
commands.spawn((
Enemy,
Collider::new(8.),
Movable::new(500., f32::to_radians(360.)),
Sprite::from(sprite),
Transform::from_xyz(at.x, at.y, 0.),
));
}

24
src/ships/mod.rs Normal file
View file

@ -0,0 +1,24 @@
use bevy::prelude::*;
pub mod enemy;
pub mod player;
pub struct ShipsPlugin;
impl Plugin for ShipsPlugin {
fn build(&self, app: &mut bevy::app::App) {
app.insert_resource(Time::<Fixed>::from_hz(60.))
.add_systems(Startup, startup)
.add_systems(FixedUpdate, player::player_movement_system);
}
}
fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
let player_sprite: Handle<Image> = asset_server.load("player.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.));
enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(100., 100.));
}

View file

@ -1,4 +1,4 @@
use crate::damagable::Movable; use crate::{collision::Collider, movable::Movable};
use bevy::prelude::*; use bevy::prelude::*;
#[derive(Component)] #[derive(Component)]
@ -6,6 +6,16 @@ pub struct Player {
pub(super) acceleration: f32, pub(super) acceleration: f32,
} }
pub fn spawn_player(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
commands.spawn((
Player { acceleration: 100. },
Collider::new(8.),
Movable::new(500., f32::to_radians(360.)),
Sprite::from(sprite),
Transform::from_xyz(at.x, at.y, 0.),
));
}
pub(super) fn player_movement_system( pub(super) fn player_movement_system(
time: Res<Time>, time: Res<Time>,
keyboard_input: Res<ButtonInput<KeyCode>>, keyboard_input: Res<ButtonInput<KeyCode>>,