Simple ai shooting PoC (#23)

This commit is contained in:
extrawurst
2025-04-04 23:00:15 +02:00
committed by GitHub
parent 145c30663e
commit e49373061e
11 changed files with 258 additions and 120 deletions

View File

@@ -1,13 +1,7 @@
use super::{Projectile, TriggerGun};
use crate::{
GameState,
aim::AimState,
billboards::Billboard,
loading_assets::GameAssets,
physics_layers::GameLayer,
player::{Player, PlayerRig},
sounds::PlaySound,
utils::sprite_3d_animation::AnimationTimer,
GameState, billboards::Billboard, loading_assets::GameAssets, physics_layers::GameLayer,
sounds::PlaySound, utils::sprite_3d_animation::AnimationTimer,
};
use avian3d::prelude::{
Collider, CollisionLayers, CollisionStarted, LayerMask, PhysicsLayer, Sensor,
@@ -52,8 +46,7 @@ fn setup(mut commands: Commands, assets: Res<GameAssets>, mut sprite_params: Spr
fn on_trigger_state(
trigger: Trigger<TriggerGun>,
mut commands: Commands,
aim: Res<AimState>,
target_transform: Query<&Transform, (Without<Player>, Without<PlayerRig>)>,
query_transform: Query<&Transform>,
time: Res<Time>,
mut polyline_materials: ResMut<Assets<PolylineMaterial>>,
mut polylines: ResMut<Assets<Polyline>>,
@@ -62,8 +55,8 @@ fn on_trigger_state(
commands.trigger(PlaySound::Gun);
let rotation = if let Some(target) = aim.target {
let t = target_transform
let rotation = if let Some(target) = state.target {
let t = query_transform
.get(target)
.expect("target must have transform");
Transform::from_translation(state.pos)
@@ -86,7 +79,7 @@ fn on_trigger_state(
Collider::capsule_endpoints(0.5, Vec3::new(0., 0., 0.), Vec3::new(0., 0., -3.)),
CollisionLayers::new(
LayerMask(GameLayer::Projectile.to_bits()),
LayerMask(GameLayer::Npc.to_bits() | GameLayer::Level.to_bits()),
LayerMask(state.target_layer.to_bits() | GameLayer::Level.to_bits()),
),
Sensor,
Visibility::default(),

View File

@@ -3,8 +3,10 @@ mod thrown;
use crate::{
GameState,
aim::AimTarget,
heads::ActiveHeads,
hitpoints::Hit,
physics_layers::GameLayer,
player::{Player, PlayerRig},
sounds::PlaySound,
tb_entities::EnemySpawn,
@@ -35,16 +37,36 @@ pub enum HeadAbility {
}
#[derive(Debug, Reflect, Clone, Copy)]
pub struct PlayerTriggerState {
pub struct TriggerData {
target: Option<Entity>,
dir: Dir3,
rot: Quat,
pos: Vec3,
target_layer: GameLayer,
}
impl TriggerData {
pub fn new(
target: Option<Entity>,
dir: Dir3,
rot: Quat,
pos: Vec3,
target_layer: GameLayer,
) -> Self {
Self {
target,
dir,
rot,
pos,
target_layer,
}
}
}
#[derive(Event, Reflect)]
pub struct TriggerGun(pub PlayerTriggerState);
pub struct TriggerGun(pub TriggerData);
#[derive(Event, Reflect)]
pub struct TriggerThrow(pub PlayerTriggerState);
pub struct TriggerThrow(pub TriggerData);
pub fn plugin(app: &mut App) {
app.add_plugins(gun::plugin);
@@ -84,7 +106,7 @@ fn on_trigger_state(
trigger: Trigger<TriggerState>,
mut commands: Commands,
player_rot: Query<&Transform, With<PlayerRig>>,
player_transform: Query<&Transform, With<Player>>,
player_query: Query<(&Transform, &AimTarget), With<Player>>,
mut active_heads: ResMut<ActiveHeads>,
time: Res<Time>,
) {
@@ -98,7 +120,7 @@ fn on_trigger_state(
return;
}
let Some(transform) = player_transform.iter().next().copied() else {
let Some((transform, target)) = player_query.iter().next() else {
return;
};
@@ -106,10 +128,12 @@ fn on_trigger_state(
return;
};
let trigger_state = PlayerTriggerState {
let trigger_state = TriggerData {
dir,
rot,
pos: transform.translation,
target: target.0,
target_layer: GameLayer::Npc,
};
active_heads.use_ammo(time.elapsed_secs());

View File

@@ -1,14 +1,7 @@
use super::TriggerThrow;
use crate::{
GameState,
aim::AimState,
billboards::Billboard,
hitpoints::Hit,
loading_assets::GameAssets,
physics_layers::GameLayer,
player::{Player, PlayerRig},
sounds::PlaySound,
utils::sprite_3d_animation::AnimationTimer,
GameState, billboards::Billboard, hitpoints::Hit, loading_assets::GameAssets,
physics_layers::GameLayer, sounds::PlaySound, utils::sprite_3d_animation::AnimationTimer,
};
use avian3d::prelude::*;
use bevy::{pbr::NotShadowCaster, prelude::*};
@@ -85,8 +78,7 @@ fn setup(mut commands: Commands, assets: Res<GameAssets>, mut sprite_params: Spr
fn on_trigger_state(
trigger: Trigger<TriggerThrow>,
mut commands: Commands,
aim: Res<AimState>,
target_transform: Query<&Transform, (Without<Player>, Without<PlayerRig>)>,
query_transform: Query<&Transform>,
assets: Res<GameAssets>,
) {
let state = trigger.event().0;
@@ -95,8 +87,8 @@ fn on_trigger_state(
const SPEED: f32 = 35.;
let vel = if let Some(target) = aim.target {
let t = target_transform
let vel = if let Some(target) = state.target {
let t = query_transform
.get(target)
.expect("target must have transform");
@@ -122,7 +114,7 @@ fn on_trigger_state(
Collider::sphere(0.5),
CollisionLayers::new(
LayerMask(GameLayer::Projectile.to_bits()),
LayerMask(GameLayer::Npc.to_bits() | GameLayer::Level.to_bits()),
LayerMask(state.target_layer.to_bits() | GameLayer::Level.to_bits()),
),
RigidBody::Dynamic,
Mass(0.01),