2016-07-31 26 views
-1

Ich benutze die GetBounds-Methode als Teil der Kollisionserkennung für ein Spiel und es macht einige seltsame Dinge. GetBounds gibt eine Begrenzungsbox für die ursprüngliche Position meines Polygons zurück, aber nicht die aktuelle Position, an die ich es verschoben habe. Das ist sehr verwirrend, denn wenn ich mein Polygon zeichne, erscheint es an der richtigen Stelle. Ich denke, dass es wahrscheinlich ist, dass ich einen Fehler mache, indem ich mein Polygon verschiebe, also habe ich eine detaillierte Beschreibung darüber eingefügt, wie ich es verschiebe.Java GetBound gibt Original-Polygon-Position nicht aktuell

Die Art, wie ich die Polygonposition ändere, besteht darin, das Array "xpoints" und "ypoints" zu ändern, die vom Klassenpolygon übernommen werden. Die xpoints- und ypoints-Arrays werden geändert, indem die gewünschte Position des Polygons zu einem anderen Array hinzugefügt wird, das das Polygon an der Position 0,0 enthält und das Array ersetzt. Hier

ist der Code:

Public Class Sword extends Polygon{ 

int[] SwordXPoints, SwordYPoints 

public void main(int DesiredLocation){ 
for(int i = 0; i < super.ypoints.length; i++){ 
super.ypoints[i] = SwordXPoints + DesiredLocation; 
} 
for(int i = 0; i < super.xpoints.length; i++){ 
super.xpoints[i] = SwordYPoints + DesiredLocation; 
} 
} 
} 

Ich hoffe, diese Erklärung ist einfacher zu verstehen und einfacher.

Danke, Sam.

+0

dies nicht einmal abgeschlossen ist, und Sie verwenden Ihre eigenen Klassen Schwerter etc, so wie die hec tun wir knoe was du da tun ?? – gpasch

+0

Sorry gpasch, das schien mir einen Sinn zu ergeben. Ich werde es umschreiben und versuchen, keinen spezifischen Code aus meinem Spiel zu verwenden, sondern einfach neu schreiben, um leichter lesbar zu sein. –

Antwort

0

Der Aufruf von getBounds() läuft dieses Stück Code:

if (bounds == null) { 
    calculateBounds(xpoints, ypoints, npoints); 
} 
return bounds.getBounds(); 

Das erste Mal durch, bounds null ist und calculateBounds aufgerufen. Dies führt durch Ihre Punkte, berechnet min und max X und Y und erstellt bounds. Bei nachfolgenden Aufrufen ist bounds nicht null und der zwischengespeicherte Wert wird zurückgegeben.

Was Sie tun müssen, ist einen Anruf zu invalidate() hinzufügen, nachdem Sie alle Punkte aktualisiert haben.

Alternativ können Sie AffineTransform verwenden, um den Ursprung und den Maßstab des Graphics2D zu ändern, zeichnen Sie Ihr Polygon so, wie es ist, und stellen Sie den ursprünglichen Ursprung und Maßstab wieder her. Die grobe Reihenfolge der Anrufe wäre:

AffineTransform origAT = g2.getTransform(); // Save original 
AffineTransform newAT = new AffineTransform(); 
newAT.concatenate(origAT); 
newAt.translate(newX, newY); 
g2.setTransform(newAt); 
g2.draw(polygon); 
g2.setTransform(origAt); // restore original 
+0

Danke Devon_C_Miller. Dies ist eine perfekte Erklärung dafür, warum es nicht funktioniert. Ich würde gerne wissen, wo Sie diesen Code tatsächlich gefunden haben, ich verbrachte eine ganze Weile damit, die Seite von Orakel zu durchsuchen und konnte keinen Code finden, wie Grenzen funktionieren. –

+0

@SamChapman Wenn Sie das JDK installieren, befindet sich irgendwo in der Installation ein 'src.zip', das die Java-Quellen enthält. Zur Not können Sie das auspacken und schauen. Allerdings sollte eine IDE es Ihnen ermöglichen, auf ein Symbol zu klicken und die Quelle zu sehen. Ich habe Eclipse noch nicht ausprobiert, aber ich weiß, dass es sowohl in NetBeans als auch in IntelliJ IDEA funktioniert. –