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 из-за того что почти невозможно получить ровно ноль при вычислении скорости через ускорение.

Допишу потом))

Добавить комментарий