Я закончил учебное пособие о том, как создать простую игру по разрушению кирпичей в Javascript, и теперь хотел бы расширить ее. Я столкнулся с вопросом о том, как провести различие между боковым / боковым столкновением и верхним / нижним столкновением.
Прямо сейчас, функция обнаружения столкновений у меня проверяет только, было ли столкновение. Тогда в отдельном классе, если функция столкновения возвращает true, она отрицает координату y траектории, но не x. Поэтому, когда шар сталкивается с верхней или нижней частью кирпича, он изменит y направления, что работает, но если он сталкивается со стороной кирпича, он продолжает двигаться в том же направлении x.
Вот функция столкновения:
export function objectCollision(ball, gameObject){
//Position of Ball
let topOfBall = ball.position.y;
let bottomOfBall = ball.position.y + ball.height;
let leftSideOfBall = ball.position.x;
let rightSideOfBall = ball.position.x + ball.width;
//Position of Object
let topOfObject = gameObject.position.y;
let bottomofObject = gameObject.position.y + gameObject.height;
let leftSideOfObject = gameObject.position.x;
let rightSideOfObject = gameObject.position.x + gameObject.width;
//Split up the top/bottom and left/right hit detection (causes abnormal behavior)
//Need to negate the x trajectory
//Set ball.speed.x = -ball.speed.x if left/right hit detection
if(bottomOfBall >= topOfObject && topOfBall <= bottomofObject && leftSideOfBall >= leftSideOfObject && rightSideOfBall <= rightSideOfObject){
//ball.speed.x = -ball.speed.x;
return true;
}
else
return false;
}
Затем в классе кирпича мы изменим координату y траектории.
//Brick class
import { objectCollision } from "/src/collisionDetection"
export default class Brick{
//......
update(deltaTime){
if(objectCollision(this.game.ball, this)){
this.game.ball.speed.y = -this.game.ball.speed.y;
this.isHit = true;
}
}
//.....
}
Моя проблема в том, что если я Проверьте наличие у координатных коллизий отдельно от столкновений с координатами х, он обнаружит столкновение, когда координата х шара такая же, как у кирпича, даже если шар ниже / выше кирпича. Я попытался сначала проверить y, а затем во вложенном if () проверить x, но это дало тот же результат.
Что-то вроде:
if(bottomOfBall >= topOfObject && topOfBall <= bottomofObject && leftSideOfBall){
if(leftSideOfBall >= leftSideOfObject && rightSideOfBall <= rightSideOfObject){
ball.speed.x = -ball.speed.x;
return true;
}
}
Но это дало такое же ненормальное поведение или разрушило столкновение все вместе.
Надеюсь, это что-то простое, что я просто не видение и лишняя пара глаз исправят. Я действительно не хочу полностью переделывать обнаружение столкновений.