как правильно реализовать столкновения в piston?

Недавно познакомился с Rust и решил сделать простую игру с библиотекой piston на основе примера с вращяющимся квадратом. Написал управление игроком, вращение и движение врагов. В один момент они сливаются в одного тк не сталкиваются.

![Screenshot of enemies merging into one.

Я решил это исправить. Создал метод в структуре врага, который бы сравнивал его координаты со всеми остальными врагами и возвращал номера сторон которые сталкиваются

impl Enemy {

    // The method returns an array of ids that correspond to the colliding sides of the Enemy. 
    // [left, top, right, bottom]. 1 is collision 0 is not
    fn enemy_collision(&mut self, enemies: &Vec<Enemy>) -> Vec<u8> {
        // тут сравниваются кординаты 1го врага со всеми остальными
    }

    pub fn move_to_player(&mut self, colliding_sides: Vec<u8>, player_x: f64, player_y: f64, args: &UpdateArgs){
        // перемещение врага в сторону игрока учитывая столкновения
    }
}

Здесь возникла проблема: в главном цикле я прохожусь по вектору, который хранит всех врагов и вызываю функцию движения для каждого, но для того чтобы проверить столкновения я должен передать этот вектор еще раз, а компилятор мне не позволяет:

let mut events = Events::new(EventSettings::new());
    while let Some(e) = events.next(&mut window) {

        if let Some(args) = e.render_args() {
            game.render(&args, &enemies);
        }

        if let Some(args) = e.button_args() {
            game.controll(&args);// player controls
        }

        if let Some(args) = e.update_args() {
            game.update(&args);// rotate player and change position

            for i in &mut enemies {
                let sides = i.enemies_collision(&enemies);//get colliding sides
                                 ошибка здесь---^
                i.move_to_player(sides, game.x, game.y, &args);// move enemy depending on collision
            }
        }
    }
error[E0502]: cannot borrow `enemies` as immutable because it is also borrowed as mutable
   --> src/main.rs:232:51
    |
231 |             for i in &mut enemies {
    |                      --------------
    |                      |
    |                      mutable borrow occurs here
    |                      mutable borrow later used here
232 |                 let sides = i.enemies_collision(&enemies);
    |                                                   ^^^^^^^^^^ immutable borrow occurs here

Мне все еще трудно разбираться с заимствованием в Rust. Можете дать совет?


Ответы (0 шт):