как правильно реализовать столкновения в piston?
Недавно познакомился с Rust и решил сделать простую игру с библиотекой piston на основе примера с вращяющимся квадратом. Написал управление игроком, вращение и движение врагов. В один момент они сливаются в одного тк не сталкиваются.
Я решил это исправить. Создал метод в структуре врага, который бы сравнивал его координаты со всеми остальными врагами и возвращал номера сторон которые сталкиваются
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. Можете дать совет?
