Hi, ich habe eine Collisionserkennung, mit dem ich versuche festzustellen, wie weit sich ein 2-px-großes Objekt, was am Rand eines 16-px-großen Objektes anfängt bewegen kann, bis es zu einer Kollision kommt. Die Methode wird in einem Thread mit 10 millisekunden Verzögerung aufgerufen, trotzdem schnellt die Prozessorauslastung auf 100% hoch. Hat jemand vielleicht eine Idee, wie ich das ganze optimieren könnte?
(Oder auch ganz ersetzen.)
Edit: Mir ist gerade eine Idee gekommen: Ich könnte mit einen Rectangle mit fixer Länge, z. B. 30 px anfangen. Wenn es dabei zu einer Kollision kommt, halbiere ich die Länge auf 15, und teste noch mal. Wenn nicht, verdoppel ich die Länge. Wenn ein Punkt, der kollidiert und nicht kollidiert gefunden wurde, wird so lange mit dem Durchschnitt der beiden getestet, bis ((max - 1) == min) ist. Ich weiß nur nicht, ob das Geschwindigkeitsvor- oder -nachteile bringen würde. Könnt ihr mir bitte etwas dazu sagen?
Java:
private void checkCollision()
{
Room parent = getParentRoom();
Rectangle rectangle = new Rectangle(getX() + 16, getY() + 7, 2, 2); //Erste Position
int startX = rectangle.x; //x-position, wo es anfängt.
for(boolean collisionFound = false; !collisionFound;) //Schleife, bis es zu einer Kollision kommt.
{
if(parent.collisionWithEntilitie(rectangle) || rectangle.x > 640) //Kommt es zu einer Kollision oder ist x außerhalb des sichtbaren Bereichs.
{
lock(); //Speeren.
x = startX; //Positionen in Felder setzen.
y = rectangle.y;
width = rectangle.x - getX();
height = 2;
unlock(); //Entspeeren
collisionFound = true; //Boolean setzen
}
rectangle.x = rectangle.x + 1; //Einen Pixel nach rechts.
}
}
public boolean collisionWithEntilitie(Rectangle rectangle)
{
boolean b = false; //Returnwert
listLock.lock(); //Listenzugriff speeren
try
{
for(int i = list.size() - 1; i >= 0 && !b; i--) //Schleife rückwärts durchlaufen, bis der letzte (erste) index erreicht ist oder b true ist.
b = rectangle.intersects(list.get(i).getBounds()); //Prüfen, ob das Rectangle mit etwas kollidiert.
}
finally
{
listLock.unlock(); //Listenzugriff entspeeren
}
return(b); //Und zurück mit der boolean.
}
Edit: Mir ist gerade eine Idee gekommen: Ich könnte mit einen Rectangle mit fixer Länge, z. B. 30 px anfangen. Wenn es dabei zu einer Kollision kommt, halbiere ich die Länge auf 15, und teste noch mal. Wenn nicht, verdoppel ich die Länge. Wenn ein Punkt, der kollidiert und nicht kollidiert gefunden wurde, wird so lange mit dem Durchschnitt der beiden getestet, bis ((max - 1) == min) ist. Ich weiß nur nicht, ob das Geschwindigkeitsvor- oder -nachteile bringen würde. Könnt ihr mir bitte etwas dazu sagen?
Zuletzt bearbeitet: