90 lines
2.3 KiB
Rust
90 lines
2.3 KiB
Rust
use crate::{
|
|
collision::Collider,
|
|
damagable::Damagable,
|
|
projectile::{ProjectileSprite, spawn_projectile},
|
|
ships::Factions,
|
|
velocity::Velocity,
|
|
};
|
|
use bevy::prelude::*;
|
|
|
|
#[derive(Component)]
|
|
#[require(Velocity)]
|
|
pub struct PlayerMovement {
|
|
pub(super) acceleration: f32,
|
|
}
|
|
|
|
#[derive(Component)]
|
|
pub struct PlayerGun {
|
|
shoot_timer: Timer,
|
|
damage: u32,
|
|
}
|
|
|
|
pub fn spawn_player(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
|
|
commands.spawn((
|
|
PlayerMovement { acceleration: 100. },
|
|
PlayerGun {
|
|
shoot_timer: Timer::from_seconds(0.2, TimerMode::Once),
|
|
damage: 1,
|
|
},
|
|
Collider::new(8.),
|
|
Sprite::from(sprite),
|
|
Transform::from_xyz(at.x, at.y, 0.),
|
|
Factions::PlayerFaction,
|
|
Damagable::new(15),
|
|
));
|
|
}
|
|
|
|
pub(super) fn player_movement_system(
|
|
time: Res<Time>,
|
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
|
query: Single<(&mut Velocity, &PlayerMovement)>,
|
|
) {
|
|
let (mut movable, player) = query.into_inner();
|
|
let mut movement_factor = 0.0;
|
|
let mut rotation_factor = 0.0;
|
|
|
|
if keyboard_input.pressed(KeyCode::ArrowLeft) {
|
|
rotation_factor += 1.0;
|
|
}
|
|
|
|
if keyboard_input.pressed(KeyCode::ArrowRight) {
|
|
rotation_factor -= 1.0;
|
|
}
|
|
|
|
if keyboard_input.pressed(KeyCode::ArrowUp) {
|
|
movement_factor += 1.0;
|
|
}
|
|
if keyboard_input.pressed(KeyCode::ArrowDown) {
|
|
movement_factor -= 1.0;
|
|
}
|
|
|
|
movable.linear_speed = (movable.linear_speed
|
|
+ movement_factor * player.acceleration * time.delta_secs())
|
|
.clamp(-movable.max_linear_speed, movable.max_linear_speed);
|
|
movable.rotation_speed = rotation_factor * movable.max_rotation_speed;
|
|
}
|
|
|
|
pub fn player_shooting_system(
|
|
mut commands: Commands,
|
|
time: Res<Time>,
|
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
|
projectile_sprite: Res<ProjectileSprite>,
|
|
query: Single<(&mut PlayerGun, &Transform)>,
|
|
) {
|
|
let (mut gun, transform) = query.into_inner();
|
|
gun.shoot_timer.tick(time.delta());
|
|
|
|
if gun.shoot_timer.is_finished() == false || keyboard_input.pressed(KeyCode::Space) == false {
|
|
return;
|
|
}
|
|
|
|
spawn_projectile(
|
|
&mut commands,
|
|
projectile_sprite,
|
|
transform.clone(),
|
|
gun.damage,
|
|
Factions::PlayerFaction,
|
|
);
|
|
|
|
gun.shoot_timer.reset();
|
|
}
|