Как я могу улучшить обнаружение столкновений в моей простой Javascript игре - PullRequest
0 голосов
/ 10 февраля 2020

Я закончил учебное пособие о том, как создать простую игру по разрушению кирпичей в 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;
  }
}

Но это дало такое же ненормальное поведение или разрушило столкновение все вместе.

Надеюсь, это что-то простое, что я просто не видение и лишняя пара глаз исправят. Я действительно не хочу полностью переделывать обнаружение столкновений.

...