Way

(Tom Krümmel)

Die Datenstruktur Way repräsentiert eine Tür eines Raumes. Wir haben uns dazu entschieden, ein seperates Objekt zu erstellen, da die Türen einzeln gezeichnet werden sollen und einige wichtige Teileigenschaften haben, die den Room überladen hätten.

Way erbt wie Room vom DrawableObject, um die Zeichenfähigkeit zu erhalten. Er speichert seinen Typ, Position, Normale und zugehörigen (father). Davon unabhängig wird in allen Wayobjekten die maximale Distanz, die erlaubt ist, um zwei Türen aneinanderzusetzen, gespeichert, 10 Pixel. Desweiteren verfügt er über die Methoden "getActualPosition", "compareDistance", "calcNormal", "fittingPos" und "paint". Diese werden im Nachfolgenden erläutert.

getActualPosition

Diese Methode hat das Ziel, sich der finalen, anfangs erstellten Doublekoordinaten des Coordinatesobjekts zu bedienen, um mit dessen Hilfe die aktuelle Doubleposition für die XML-Datei zu determinieren und diese demzufolge auszugeben.

Zum Anfang rechnet die Methode die ursprünglichen Doubles auf die Centerposition des Vaters, um die richtige Position der Tür zu bestimmen.

double updatedX = father.getCenter().getPosx() + pos.getX(); double updatedY = father.getCenter().getPosy() + pos.getY();

Anschließend erstellt sie ein neues Koordinatenobjekt und rotiert es mithilfe einer for-Schleife um den Center des zugehlrigen Raumes bis die Rotation korrekt ist.

int angle = father.getCenter().getAngle(); Coordinates updatedCoordinates = new Coordinates(updatedX, updatedY, angle); for(int i =0; i<angle ; i+=90 ){ updatedCoordinates.rotation(90, father.getCenter()); }

Die daraus entstandene Koordinate wird zurückgegeben.

compareDistance

Die Methode compareDistance bestimmt, ob der User zwei Wayobjekte nah genug beieinander platziert hat, damit sie verbindbar sind. Demzufolge ist sie vom Typ boolean. Sie bekommt einen anderen Way(other) als Input, den sie mit dem aktuellen vergleicht.

Am Anfang der Methode wird der Betrag der Differenz zwischen X und Y Koordinate auf der Zeichenfläche der beiden Wayobjekte berechnet um die Distanz zu bestimmen.

double distX = Math.abs(this.pos.getScaledIntCoordinates(this.getFather().getCenter()).x - other.pos.getScaledIntCoordinates(other.getFather().getCenter()).x);

double distY = Math.abs(this.pos.getScaledIntCoordinates(this.getFather().getCenter()).y - other.pos.getScaledIntCoordinates(other.getFather().getCenter()).y);

Im nachfolgenden wird geprüft, ob diese Distanz kleiner ist als die gespeicherte Maximaldistanz, ob die Normalen in entgegengesetzte Richtungen zeigen, damit Räume korrekt aneinander und nicht ineinander gesetzt werden und ob beide Ways denselben Typ haben, damit nicht z.B. an einer Stelle gleichzeitig Glas- und Holztür gesetzt werden. Ist dies alles der Fall, gibt die Methode true zurück, ansonsten false.

if(distX < maxDistance && distY < maxDistance
                && (other.getNormal().getInvert().getVector().getX()==this.normal.getVector().getX()
                        || other.getNormal().getInvert().getVector().getY()==this.normal.getVector().getY())
                && other.getType().equals(this.type)) {

            return true;
        }

        return false;
    }

calcNormal

Die Methode calcNormal hat die Aufgabe im Falle einer Rotation die Normale des aktuellen Wayobjektes anzupassen.

Hierfür bedienten wir uns wieder der Tatsache, das nur um 90 Grad gedreht wird. Dies lässt zwei einfache Fallunterscheidungen zu, die Drehung von X Ausdehnung nach Y Ausdehnung oder umgekehrt.

Für den Fall, dass nach X gedreht wird, muss das Vorzeichen des X-Wertes gewechselt werden und Y auf 0.

if(normal.getPosx()==0){
            normal.setPosx(normal.getPosy()*-1);
            normal.setPosy(0.0);
        }

Im umgekehrten Fall ist dieselbe Rechenoperation bis auf den Vorzeichenwechsel vonnöten.

else{
            normal.setPosy(normal.getPosx());
            normal.setPosx(0.0);

fittingPos

Die Methode fittingPos gibt ganz simpel die skalierten Intkoordinaten der Türposition im Bezug auf den Center des zugehörigen Raumes zurück.

Point nowPos = pos.getScaledIntCoordinates(father.getCenter()); return nowPos;

Dies erleichtert die Übersicht in der Zeichenmethode.

paint

Die Paintmethode erstellt zunächst einen Punkt mit der aktuellen Position des Wayobjekts.

Point a = this.fittingPos();

Anschließend wird ein Dummypunkt erstellt, dessen Koordinaten abhängig von der Normale gesetzt werden. Für die Richtung, in die die Normale zeigt, wird die Maximaldistanz auf die Koordinate addiert und die andere wird von der Originalposition übernommen. So hat man nach dem Zeichnen einen Indikator, ab wann zwei Räume verbindbar sind.

Point b = new Point (0, 0);


        if(normal.getPosx() > 0){
            int x = a.x + maxDistance;
            b.x = x;
            b.y = a.y;
        }else if(normal.getPosx() < 0){
            int x = a.x - maxDistance;
            b.x = x;
            b.y = a.y;
        }else if(normal.getPosy() > 0){
            int y = a.y + maxDistance;
            b.x = a.x;
            b.y = y;
        }else{
            int y = a.y - maxDistance;
            b.x = a.x;
            b.y = y;
        }

Darauffolgend wird abhängig vom Typ der zum Wayobjekt zugehörigen Tür eine Farbe für die Zeichnung festgesetzt.

Color c = Color.BLACK;
        if (type.equals("glass")) {
            c = Color.BLUE;
        } else if (type.equals("floor")) {

            c = Color.MAGENTA;
        } else {

            c = Color.GREEN;
        }

        g.setColor(c);

Zuletzt wird eine Linie zwischen Punkt a und b gezeichnet.

new Line(a, b).paint(g);

results matching ""

    No results matching ""