2017-03-05 5 views
6

Ich habe ein Bild, das ich vor dem Zeichnen rotiere. Das Bild wird um die Winkel eines Sechsecks gedreht. Mit anderen Worten, das Bild "hebt" im Grunde die einzelnen Kanten eines Sechsecks hervor. Ich muss erkennen, ob die Maus innerhalb dieses gedrehten Bildes geklickt wurde. Das Erkennen eines Mausklicks in einem nicht gedrehten Bild ist ziemlich einfach, aber ich habe keine Ahnung, wie man Klicks innerhalb gedrehter Punkte erkennt. Gibt es eine Möglichkeit, die Punkte der Bildecken nach der Drehung zu erhalten, damit ich ein unsichtbares Polygon über das Bild legen kann und Polygon.contains() verwende?Wie kann ich einen Klick auf ein gedrehtes Bild in Slick2D erkennen?

    Image highlightEdge = new Image("assets/img/highlightEdge.png"); 
        if(angle == 90){ 
         highlightEdge.setCenterOfRotation(highlightEdge.getWidth(), 0); 
         highlightEdge.rotate(new Float(angle)); 
         highlightEdge.draw(testPoint.x - 56, testPoint.y); 
        } else if(angle == 210) { 
         highlightEdge.setCenterOfRotation(0, 0); 
         highlightEdge.rotate(new Float(angle)); 
         highlightEdge.draw(lastSettlement.x - 72, lastSettlement.y - 32); 
        } else if(angle == 330){ 
         highlightEdge.setCenterOfRotation(0, 0); 
         highlightEdge.rotate(new Float(angle)); 
         highlightEdge.draw(lastSettlement.x - 8, lastSettlement.y - 32); 
        } else if(angle == 30){ 
         highlightEdge.setCenterOfRotation(0, 0); 
         highlightEdge.rotate(new Float(angle)); 
         highlightEdge.draw(lastSettlement.x-8, lastSettlement.y); 
        } else if(angle == 150){ 
         highlightEdge.setCenterOfRotation(0, 0); 
         highlightEdge.rotate(new Float(angle)); 
         highlightEdge.draw(lastSettlement.x-72, lastSettlement.y); 
        } else { 
         highlightEdge.setCenterOfRotation(0, 0); 
         highlightEdge.rotate(new Float(angle)); 
         highlightEdge.draw(lastSettlement.x-40, lastSettlement.y - 48); 
        } 

Antwort

0

Sie könnten eine Shape schaffen genau die Form des Image, anzupassen und dann contains seine Methode verwenden, um festzustellen, ob die Maus innerhalb geklickt wurde.

Um die Drehung der Image zu berücksichtigen, könnten Sie eine entsprechende Drehung Transform auf die Shape anwenden.

Ich erstellte die Methode shapeFromImage, die dies tut; es erhält eine Image und seine Position und gibt die entsprechenden Shape:

float positionX; 
float positionY; 

if (angle == 90) { 
    highlightEdge.setCenterOfRotation(highlightEdge.getWidth(), 0); 
    highlightEdge.rotate(new Float(angle)); 

    positionX = testPoint.x - 56; 
    positionY = testPoint.y; 

    highlightEdge.draw(positionX, positionY); 
} 

... 

// you can now use this Shape to use its method "contains" 
imageShape = shapeFromImage(highlightEdge, positionX, positionY); 
:

/** 
* Returns the Shape of an Image considering its rotation 
* @param image 
* @param x the x position of the Image 
* @param y the y position of the Image 
*/ 
public static Shape shapeFromImage(Image image, float x, float y) { 

    // create a rectangle with same position and size of the image 
    Shape imageShape = new Rectangle(x, y, image.getWidth(), image.getHeight()); 

    // get the rotation angle of the image 
    float angle = image.getRotation(); 

    // if the image is rotated, we also need to rotate our shape 
    if (angle != 0.f) { 

     // convert the rotation angle in radians to use in Transform 
     float angleInRadians = (float) Math.toRadians(angle); 

     // get the point of rotation to use in Transform. 
     // image.getCenterOfRotation returns a point relative to the image. 
     // for Transform we need an absolute point, so we add the image position to it 
     float rotationX = image.getCenterOfRotationX() + x; 
     float rotationY = image.getCenterOfRotationY() + y; 

     // create the rotation Transform to match the image rotation 
     Transform rotationTransform = Transform.createRotateTransform(angleInRadians, rotationX, rotationY); 

     // apply the rotation Transform to our shape 
     imageShape = imageShape.transform(rotationTransform); 

    } 

    return imageShape; 
} 

In Ihrem Beispiel Sie es wie folgt verwenden könnte

Verwandte Themen