Проектная работа - WIP

This commit is contained in:
8 changed files with 60 additions and 4 deletions
+8 -1
View File
@@ -2,7 +2,7 @@
use bevy::prelude::*;
use crate::domain::GridBarier;
use crate::domain::{GridBarier, GrowUp};
/// вывод всех сущностей мира
pub fn print_all_entities(mut commands: Commands, query: Query<Entity>) {
@@ -102,3 +102,10 @@ pub fn trace_snake_moving(e: On<GridBarier>) {
let direction = e.direction;
trace!("...<{entity:?}> is moving on {position} {direction:?}");
}
/// событие [GrowUp] по нажатию Tab
pub fn grow_up_on_tab(input: Res<ButtonInput<KeyCode>>, mut commands: Commands) {
if input.just_pressed(KeyCode::Tab) {
commands.trigger(GrowUp);
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ mod direction;
pub use direction::Direction;
mod events;
pub use events::GridBarier;
pub use events::{GridBarier, GrowUp};
mod snake_path;
pub use snake_path::SnakePath;
+3
View File
@@ -15,3 +15,6 @@ impl GridBarier {
Self { entity, position, direction }
}
}
#[derive(Event)]
pub struct GrowUp;
+8 -1
View File
@@ -1,6 +1,9 @@
use std::{fmt::Display, ops::Deref};
use bevy::transform::components::Transform;
use bevy::{
math::{Vec2, vec2},
transform::components::Transform,
};
use crate::domain::{Direction, GRID_SIZE};
@@ -23,6 +26,10 @@ impl Position {
Direction::Right => self.x += 1,
}
}
pub fn translation(&self) -> Vec2 {
vec2(self.x as f32 * GRID_SIZE as f32, self.y as f32 * GRID_SIZE as f32)
}
}
impl Display for Position {
+10
View File
@@ -29,9 +29,17 @@ pub fn head_rotation(
head.0 = new_direction;
transform.rotation = new_direction.orientation();
trace!("running {direction} at {cur_pos} {translation}: go {new_direction}");
} else if input.just_pressed(KeyCode::ArrowUp) {
let (mut transform, mut head, direction) = query.into_inner();
let translation = transform.translation.clone();
let cur_pos = Position::from(&*transform);
head.0 = direction.clone();
transform.rotation = direction.orientation();
trace!("running {direction} at {cur_pos} {translation}: go {direction}");
}
}
/// Общая механика движения
fn moving(
velocity: &f32,
time: &Time<Fixed>,
@@ -68,6 +76,7 @@ fn moving(
}
}
/// Система движения головы змеи
pub fn head_moving(
query: Query<(&mut Transform, &mut Direction, &Velocity, &Head, Entity)>,
time: Res<Time<Fixed>>,
@@ -86,6 +95,7 @@ pub fn head_moving(
}
}
/// Система движения тела змеи
pub fn snake_moving(
query: Query<(&mut Transform, &mut Direction, &Velocity, Entity), (With<Tail>, Without<Head>)>,
time: Res<Time<Fixed>>,
+8 -1
View File
@@ -32,7 +32,14 @@ fn main() {
// snake_game::debug::print_all_entities,
),
)
.add_systems(Update, (head_rotation,))
.add_systems(
Update,
(
|| {}, //
head_rotation,
snake_game::debug::grow_up_on_tab,
),
)
.add_systems(FixedUpdate, (head_moving, snake_moving))
.add_systems(
PostUpdate,
+21
View File
@@ -21,3 +21,24 @@ pub fn clean_snake_path(event: On<GridBarier>, query: Query<&End>, mut snake_pat
snake_path.remove(&event.position);
}
}
/// Обработка события [GrowUp]
pub fn grow_up_snake(_: On<GrowUp>, mut commands: Commands, query: Single<(Entity, &Direction, &Transform), (With<Tail>, With<End>)>) {
let (entity, direction, transform) = query.into_inner();
commands.entity(entity).remove::<End>();
let pos = Position::from(transform);
let new_end = commands
.spawn((
Tail,
End,
direction.clone(),
Velocity(0.0),
Sprite::from_color(Color::srgb(0.75, 0.75, 0.75), vec2(HEAD_SIZE as f32 * 0.8, HEAD_SIZE as f32 * 0.8)),
Transform {
translation: pos.translation().extend(0.0),
..Default::default()
},
))
.id();
commands.entity(entity).observe(schedule_set_velocity(new_end));
}
+1
View File
@@ -20,6 +20,7 @@ fn spawn_snake(commands: &mut Commands) {
commands.insert_resource(SnakePath::default());
commands.spawn(Observer::new(crate::observers::clean_snake_path));
commands.spawn(Observer::new(crate::observers::grow_up_snake));
commands.spawn(Observer::new(crate::debug::trace_snake_moving));