2016-09-02 2 views
0

Ich versuche, haltbare Elemente für meine slick2d Spiel zu machen, dachte ich, ein guter Weg, dies zu tun wäre, eine Hand auf den Spieler zu haben, um dies zu tun, ich habe 1 Pixel a einzigartige Farbe, die es mir erlaubt, diese Farbe zu finden, und die x +y.Slick2d Ortung x und y durch Pixelfarbe

Es funktionierte perfekt, bis ich versuchte, das Bild zu vergrößern, und ich bekomme diese verrückte Out-of-Bound-Ausnahme.

dies ist mein Code die x und y zu finden:

public int[] getLocation(Image i, Color c){ 
    Image scaled = i.getScaledCopy(getWidth(), getHeight()); 
    for(int x = 0; x < scaled.getWidth(); x++){ 
     for(int y = 0; y < scaled.getHeight(); y++){ 
      if(scaled.getColor(x, y).r == c.r && scaled.getColor(x, y).g == c.g && scaled.getColor(x, y).b == c.b){ 
       int[] xy = {x,y}; 
       return xy; 

      } 
     } 
    } 
    return null; 
} 

und das ist, wie ich es ist

float x = (float) (getLocation(walkLeft.getCurrentFrame(), new Color(1, 1, 1))[0] + getX()); 
    float y = (float) (getLocation(walkLeft.getCurrentFrame(), new Color(1, 1, 1))[1] + getY()); 
    g.fillRect(x, y, 2, 2); 

die Ausnahme verwenden:

java.lang.ArrayIndexOutOfBoundsException: 16384 

und führt Ich zurück zu dieser Zeile:

   if(i.getColor(x, y).r == c.r && i.getColor(x, y).g == c.g && i.getColor(x, y).b == c.b){ 

in der getLocation Methode .. Ich habe ein Gefühl, es ist tot einfach, doch es ist mir ratlos. Danke an alle, um zu antworten.

+0

Warum skalieren Sie das Bild? Die 'getLocation'-Schleife über die Breite/Höhe einer 2x skalierten Kopie des Bildes, dann versucht, die Pixel des Originals zu überprüfen – copeg

+0

Ich aktualisierte die getLocation, immer noch das gleiche Problem – TheRandomBeast1

+0

' Ich aktualisierte die getLocation' Das Update verwendet getWidth() und getHeight() - die sich wiederum in der Größe vom Original-Bild unterscheiden können (unklar vom geposteten Code). Warum musst du skalieren? – copeg

Antwort

0

Die Schleife (n) in getLocation Schleife über die Abmessungen einer 2x skalierten Kopie des Bildes, aber dann versuchen, auf die Pixel des Originals zuzugreifen. Wenn das Original die Hälfte der Größe hat, befinden Sie sich außerhalb der Grenzen der Bilddimensionen. Entweder:

  1. nicht skalieren das Bild
  2. Wenn Sie das Bild skalieren müssen, überprüfen Sie den Pixelwert des skalierten Bildes eher als das Original.

Als Nebenwirkung enthält der Code geschrieben redundante Anrufe ... a) in getLocation wenn Sie skalieren wollen, sollten Sie die Bildskalierung einmal anstatt diesen Code innerhalb der Schleife platzieren selbst b) keine Notwendigkeit zu nennen getLocation zweimal mit den gleichen Parametern. Rufen Sie es einmal und verwenden Sie einfach das zurückgegebene Array

+0

Ich aktualisiert die getLocation-Methode, um die skalierte Version zu überprüfen, das gleiche Problem. – TheRandomBeast1

+0

Ich habe eine temporäre Lösung für dieses Problem gefunden, aber es nervt mich immer noch. Ich mal das x um den skalierten Betrag des Bildes, es scheint zu funktionieren, aber ich suche immer noch nach Lösungen, warum mein vorheriger Code nicht funktioniert hat – TheRandomBeast1

Verwandte Themen