import java.awt.Rectangle; import java.util.ArrayList;
public class Collision {
Driver driver;
// Arrayliste für die Spriteobjekte anlegen
ArrayList<WorldObject> spriteListWorld;
// kleine Korrektion für genauere grafische Darstellung
int collisionCorrection = 6;
// Checksummen für Anzahl der Kollisionen
int checkSumRight = 0;
int checkSumLeft = 0;
// Konstruktor für die Sprites
public Collision(Driver driver, ArrayList<WorldObject> spriteListWorld) {
this.driver = driver;
this.spriteListWorld = spriteListWorld;
// Erstellen der Objekt Rechtecke
for (WorldObject sprite : spriteListWorld) {
sprite.rectangle = new Rectangle((int)sprite.x, (int)sprite.y, sprite.width, sprite.height);
}
}
// Kollisionsabfrage für Objekte
public void collisionObjects() {
// Kollisionsabfragen des Driverobjekts mit den Worldobjekten
for (WorldObject sprite : spriteListWorld) {
// // wechselt Kollisionsabfragen bei Imagewechsel // driver.DriverFlipImage();
// Erstellen des Driver Rechtecks
driver.rectangle = new Rectangle((int)driver.x, (int)driver.y, driver.width, driver.height);
// Abfrage Driver kollidiert mit oberer Kante eines Objekts und fährt auf dem Objekt weiter
if (driver.rectangle.intersectsLine(sprite.rectangle.getMinX() + collisionCorrection, sprite.rectangle.getMinY(),
sprite.rectangle.getMaxX() - collisionCorrection, sprite.rectangle.getMinY())) {
driver.y = sprite.rectangle.getMinY() - driver.height - collisionCorrection;
driver.landing = true;
}
// Abfrage Driver kollidiert mit unterer Kante eines Objekts
if (driver.rectangle.intersectsLine(sprite.rectangle.getMinX() + collisionCorrection, sprite.rectangle.getMaxY(),
sprite.rectangle.getMaxX() - collisionCorrection, sprite.rectangle.getMaxY())) {
driver.jumping = false;
}
// Kollisionsabfrage rechte Kante des Objekts (in der Folge kann der Driver solange nicht weiter nach Links)
if (sprite.rectangle.intersectsLine(driver.rectangle.getMinX(), driver.rectangle.getMinY() + collisionCorrection,
driver.rectangle.getMinX(), driver.rectangle.getMaxY() - collisionCorrection)) {
driver.collideLeft = true;
sprite.collideRight = true;
}
// Kollisionsabfrage linke Kante des Objekts (in der Folge kann der Driver solange nicht weiter nach Rechts)
if (sprite.rectangle.intersectsLine(driver.rectangle.getMaxX(), driver.rectangle.getMinY() + collisionCorrection,
driver.rectangle.getMaxX(), driver.rectangle.getMaxY() - collisionCorrection)) {
driver.collideRight = true;
sprite.collideLeft = true;
}
checkSum();
}
}
// Kollisionsabfrage für Gegner
public void collisionEnemy() {
}
// benötigte Checksumme der Kolisionen durch generierte Objekte
private void checkSum() {
// Gegenrechnen der Checksummen für Rechts und Links (erst wenn die Checksumme 0 ergibt kann der Driver in diese Richtung weiterfahren)
for (WorldObject sprite : spriteListWorld) {
// Checksumme Rechts
if (sprite.collideRight == true) {
checkSumRight++;
}
// Checksumme Links
if (sprite.collideLeft == true) {
checkSumLeft++;
}
// Reset der boolschen Checkvariablen
sprite.collideRight = false;
sprite.collideLeft = false;
}
// Wenn Checksumme gleich 0 darf der Driver weiterfahren (links)
if (checkSumRight == 0) {
driver.collideLeft = false;
}
else {
checkSumRight = 0;
}
// Wenn Checksumme gleich 0 darf der Driver weiterfahren (rechts)
if (checkSumLeft == 0) {
driver.collideRight = false;
}
else {
checkSumLeft = 0;
}
}
}