/** * 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); }
/** * 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); }