/* * Engine Alpha ist eine anfängerorientierte 2D-Gaming Engine. * * Copyright (c) 2011 - 2014 Michael Andonie and contributors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ea.internal.collision; import ea.*; public class BoxCollider extends Collider { /** * Der Vektor, der die Diagonale (von links oben nach rechts unten) beschreibt. Beide * Skalarwerte dürfen nicht negativ sein. */ Vektor diagonale; /** * Default-Konstruktor. Erstellt einen Box-Collider mit Offset (0|0) und Länge = 0, Breite = 0. */ public BoxCollider () { super(); } /** * Erstellt einen Box-Collider mit <i>Offset (0|0)</i>. * * @param diagonale * Die Diagonale der Box <i>von der linken, oberen Ecke hin zur rechten, unteren Ecke</i>. */ public BoxCollider (Vektor diagonale) { this(diagonale, Vektor.NULLVEKTOR); } /** * Vollständiger Konstruktor. Erstellt einen neuen Box-Collider mit allen relevanten * Parametern. * * @param offset * Der Offset für diesen Collider. * @param diagonale * Die Diagonale der Box <i>von der linken, oberen Ecke hin zur rechten, unteren Ecke</i>. */ public BoxCollider (Vektor diagonale, Vektor offset) { this.offset = offset; this.diagonale = diagonale; } /** * Generiert aus einem <code>BoundingRechteck</code> und einem gegebenen Offset einen * Box-Collider. * * @param offset * Der Offset, den dieser Collider haben soll. * @param br * Das <code>BoundingRechteck</code>, das Grundlage für die Masse des Box-Collider sein soll. * * @return Der Box-Collider, der diesem <code>BoundingRechteck</code> entspricht:<br> <ul> * <li>Die Position auf der Zeichenebene entspricht ab sofort dem Offset</li> <li>Breite und * Höhe werden übernommen</li> </ul> */ public static BoxCollider fromBoundingRechteck (Vektor offset, BoundingRechteck br) { BoxCollider bc = new BoxCollider(); bc.offsetSetzen(offset); bc.diagonale = new Vektor(br.breite, br.hoehe); return bc; } /** * {@inheritDoc} */ @Override public boolean verursachtCollision (Punkt positionThis, Punkt positionOther, Collider collider) { if (collider instanceof BoxCollider) { return Collider.boxboxCollision(this, (BoxCollider) collider, positionThis, positionOther); } else if (collider instanceof SphereCollider) { return Collider.sphereboxCollision((SphereCollider) collider, this, positionOther, positionThis); } else if (collider instanceof ColliderGroup) { return collider.verursachtCollision(positionOther, positionThis, this); } //Default: return false; } /** * {@inheritDoc} */ @Override public boolean istNullCollider () { return false; } @Override public Raum visualize(Punkt p, Farbe color) { Rechteck r = alsBR(p).ausDiesem(); r.farbeSetzen(color); return r; } /** * {@inheritDoc} */ @Override public Collider clone () { return new BoxCollider(offset.clone(), diagonale.clone()); } /** * Gibt ein Äquivalent des Box Colliders als <code>BoundingRechteck</code> aus. * * @param start Die aktuelle linke obere Ecke, an der der Box Collider für das * Äquivalent stehen soll. * @return Ein <code>BoundingRechteck</code>, dass die selbe Breite und Höhe wie * dieser Box Collider hat, und dessen linke obere Ecke <code>start</code> ist. */ public BoundingRechteck alsBR (Punkt start) { return new BoundingRechteck(start.x + offset.x, start.y + offset.y, diagonale.x, diagonale.y); } }