Visitors have accessed this post 1229 times.
Приступил к созданию игр на движке Bevy, который использует язык программирования Rust, и архитектуру приложений Entity Component System.
Перс бегает, прыгает и врезается в нивидимые стены.
Потыкаться можно здесь
За основу брал примеры к движку. Иначе понять, как использовать движок, довольно не просто.
Для отображения персонажа использую готовый спрайтовый атлас из интернета. Для анимирования скопировал систему из примера sprite_sheet движка.
fn animate_sprite(
time: Res<Time>,
texture_atlases: Res<Assets<TextureAtlas>>,
mut query: Query<(
&mut AnimationTimer,
&mut TextureAtlasSprite,
&Handle<TextureAtlas>,
)>,
) {
for (mut timer, mut sprite, texture_atlas_handle) in query.iter_mut() {
timer.tick(time.delta());
if timer.just_finished() {
let texture_atlas = texture_atlases.get(texture_atlas_handle).unwrap();
sprite.index = (sprite.index + 1) % texture_atlas.textures.len();
}
}
}
Система обращается к трём компонентам: Таймеру, Текструрному атласу, и обработчику. Каждый тик происходит перелистывание на следующий кадр.
Изменение положения персонажа в пространстве осуществляется посредством изменения его скорости в нужном направлении. Система изменения положения в пространстве по скорости:
fn apply_velocity(mut query: Query<(&mut Transform, &Velocity)>) {
const DELTA: f32 = 1.0 / 60.0; //dt
for (mut transform, velocity) in query.iter_mut() {
transform.translation.x += velocity.x * DELTA;
transform.translation.y += velocity.y * DELTA;
}
}
Аналогичным образом прикручиваем гравитацию:
fn gravity_system(mut query: Query<&mut Velocity>) {
const DELTA: f32 = 1.0 / 60.0;
for mut velocity in query.iter_mut() {
velocity.y -= 980.0 * DELTA;
}
}
Собственно сама система передвижения:
fn move_player(
keyboard_input: Res<Input<KeyCode>>,
mut query: Query<&mut Velocity, With<Position>>,
){
const MOV_VEL:f32=500.0;
let mut vel = query.single_mut();
let mut direction = 0.0;
if keyboard_input.pressed(KeyCode::D) {
direction = 1.0;
vel.x=MOV_VEL*direction;
}
if keyboard_input.pressed(KeyCode::A) {
direction = -1.0;
vel.x=MOV_VEL*direction;
}
if keyboard_input.pressed(KeyCode::LShift) &&keyboard_input.pressed(KeyCode::A){
direction = -1.0;
vel.x=1.5*MOV_VEL*direction;
}
if keyboard_input.pressed(KeyCode::LShift) &&keyboard_input.pressed(KeyCode::D){
direction = 1.0;
vel.x=1.5*MOV_VEL*direction;
}
// vel.x=300.0*direction;
}
Чтобы персонаж не уезжал в бесконечность, создадим систему трения о грунт:
fn friction_sys(
mut query: Query<&mut Velocity, With<Position>>,
){
const fric_accel: f32 = 1900.0;
const DELTA: f32 = 1.0 / 60.0;
for mut velocity in query.iter_mut() {
if velocity.x>50.0{
velocity.x -= fric_accel * DELTA;
}else
if velocity.x<(-50.0){
velocity.x += fric_accel * DELTA;
}else{velocity.x=0.0;}
}
}
Сравниваем с цифрой 50/-50 из-за того что почти невозможно получить ровно ноль при вычислении скорости через ускорение.
Допишу потом))