use bevy::prelude::*; use crate::states::level::*; use bevy::window::PrimaryWindow; use std::collections::HashSet; pub fn setup_cannon(mut commands: Commands, asset_server: Res) { let texture: Handle = asset_server.load("cannon/cannon.png"); commands.spawn(( LevelMarker, Cannon, Transform::from_xyz(579.0 - (1280.0 / 2.0), (768.0 / 2.0) - 150.0, CANNON_Z_INDEX), Sprite::from_image(texture), Visibility::Visible, )); println!("Cannon visuals is set up"); } pub fn rotate_cannon( mut query: Query<&mut Transform, With>, window_query: Query<&Window, With>, camera_query: Query<(&Camera, &GlobalTransform)>, ) { let Ok(mut cannon_tf) = query.single_mut() else { return; }; let Ok(window) = window_query.single() else { return; }; let Some(cursor_pos) = window.cursor_position() else { return; }; let Ok((camera, camera_tf)) = camera_query.single() else { return; }; // Конвертируем экранные координаты курсора в мировые let Ok(world_cursor_pos) = camera.viewport_to_world_2d(camera_tf, cursor_pos) else { return; }; // Вектор направления от пушки к курсору let cannon_pos = Vec2::new(cannon_tf.translation.x, cannon_tf.translation.y); let direction = world_cursor_pos - cannon_pos; // Применяем вращение по оси Z let angle = direction.to_angle() - std::f32::consts::FRAC_PI_2; cannon_tf.rotation = Quat::from_rotation_z(angle); } pub fn spawn_projectile_from_cannon( mut commands: Commands, cannon_query: Query<&Transform, With>, mouse_input: Res>, asset_server: Res, mut cannon_state: ResMut ) { if !mouse_input.just_pressed(MouseButton::Left) { return; } let Ok(cannon_tf) = cannon_query.single() else { return; }; let ball_type = cannon_state.current_type; let image = asset_server.load(ball_type.asset_path()); let offset = 100.0; // сдвиг от центра к дулу пушки let direction = cannon_tf.rotation.mul_vec3(Vec3::Y).truncate().normalize(); let spawn_pos_2d = cannon_tf.translation.truncate() + direction * offset; let spawn_pos = spawn_pos_2d.extend(PROJECTILE_Z_INDEX); commands.spawn(( LevelMarker, Transform::from_translation(spawn_pos), Sprite { image, custom_size: Some(Vec2::splat(SLOT_SIZE)), ..default() }, Visibility::Visible, BallProjectile { velocity: direction * 800.0, previous_position: spawn_pos_2d, ball_type, }, )); cannon_state.fire(); } pub fn move_projectiles( mut commands: Commands, mut projectiles: Query<(Entity, &mut BallProjectile, &mut Transform)>, time: Res