В настоящее время я пишу игру для Android, и я имею дело с быстрым обнаружением столкновения. У меня появилось решение, но я хотел бы узнать наиболее подходящий способ сделать это.Быстрое обнаружение столкновений
Мое решение: если у нас есть игровой объект, который перемещает 30 единиц кадра, мы можем перейти прямо через другой игровой объект. Поэтому, когда я обновляю, я повторяю игровой объект на единицу и запускаю обнаружение коллизий до тех пор, пока не будет достигнута желаемая скорость, а затем визуализирую.
Это игровой объект, который проверяет, были ли лазеры игрока или если игрок сам столкнулся с ним.
public void update(PlayerDroid[] holderPlayerDroid) {
// Update the location
//y = y + velocity;
//stupidBadDroidPositionShape.setLocation(this.x, this.y);
// Updates regarding interactions with the enemy out of the StupidBadDroids perspective, which is the PlayeDroid
for(int numberOfPlayerDroid = 0; numberOfPlayerDroid < holderPlayerDroid.length; numberOfPlayerDroid++) {
// Check if the StupidBadDroid got hit
for(int iterations = 0; iterations < velocity; iterations++) {
y = y + 1;
stupidBadDroidPositionShape.setLocation(this.x, this.y);
// Check if StupidBadDroid collides with the enemy (which is the player)
if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].getPlayerPositionShape(), getPlayerPositionShape())) {
isDead = true;
}
for(int i = 0; i < holderPlayerDroid[numberOfPlayerDroid].amountOfVisibleLasers; i++) {
if(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].isDisposed() == false) {
if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].getLaserPositionShape(), getPlayerPositionShape())) {
isDead = true;
holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].dispose();
}
}
}
}
}
}
Этот способ является очень требовательным к ЦП. Вы считаете, что есть лучшее решение, которое я мог бы применить?
почему вы итерация скорости? Я получаю большую часть вашего кода, просто не эту часть – Denzil
Эй, Дензил, я делаю это, чтобы проверить, действительно ли лазер поражает врага. Лазер маленький, а иногда просто пролетает сквозь врага. Метод, который я использовал ранее, заключался в том, чтобы проверять любые столкновения каждый раз, когда лазер добавлял 8 к его расстоянию. Но теперь я позволяю ему путешествовать 1, затем проверять наличие столкновений, затем снова и снова, пока не достигнет 8 (это его скорость), а затем я его визуализирую. Имеет ли это смысл? –
Вы всегда можете использовать геометрические ограничивающие прямоугольники/фигуры для своих объектов и вычислять время/положение, в котором происходит столкновение. Для более детального изучения может потребоваться дополнительная информация об объектах. – Darthfett