예제 #1
0
  /**
   * Cette méthode teste si une collision va avoir lieu entre les deux hitbox dans le temps imparti.
   *
   * <p>Attention, cette méthode déplace les deux hitbox et ne les remet pas en place, afin
   * d'économiser des calculs. Si une collision est détectée, il appartient aux hitbox filles de
   * recaler les hitbox au point de collision.
   *
   * <p>Une conséquence est que les deux hitbox auront le même {@link #timeOffset} si cette méthode
   * renvoie <tt>true</tt>.
   *
   * <p>Un appel à la méthode {@link #completeMove(float)} permettra de clore le mouvement, une fois
   * toutes les collisions calculées.
   */
  protected boolean testCollision(Hitbox other, float time) {
    if (!canCollide(other)) return false;

    Hitbox[] both = new Hitbox[] {this, other};

    // prétest visant à réduire les calculs
    if (this.speedX == other.speedX && this.speedY == other.speedY) {
      return false;
    }
    if (MathUtil.getSquaredDistance(this.x, this.y, other.x, other.y) > 4 * 4) {
      // TODO Changer ce critère pourri
      return false;
    }

    // Procédure de détection de collision
    float maxTime = time;
    for (Hitbox hb : both) {
      if (hb.nextCollisionPoint != null) {
        maxTime = hb.nextCollisionPoint.getTime();
      }
    }

    for (Hitbox hb : both) {
      hb.setTimeOffset(maxTime);
    }

    return this.intersects(other);
  }
예제 #2
0
 /**
  * Fait varier la position de l'objet en fonction de sa vitesse.
  *
  * <p>La hitbox enregistre le temps de déplacement. Ainsi on peut déplacer plusieurs fois la
  * hitbox pendant un même tick, et il suffit d'appeler la méthode {@link #completeMove(float)} à
  * la fin d'un tick pour le complèter.
  *
  * @param ms La durée du mouvement, en ms
  */
 public void applyVelocity(float ms) {
   setTimeOffset(ms + this.timeOffset);
 }