Въртящ се курсор или изображение на курсора Java

Добре. Така че се опитвам да завъртя изображението на курсора или самия курсор в зависимост от позицията му. Опитах да използвам

    Graphics2D g2d = (Graphics2D)g;
    AffineTransform old = g2d.getTransform();
    g2d.rotate(Math.toRadians(degrees));
    Toolkit toolkit = Toolkit.getDefaultToolkit();   //Get the default toolkit  
    Image image = toolkit.getImage("pictures/skills/skill" +InfoReader.SkillData("CastImage") +".png");   //Load an image for the cursor  
    Cursor cursor = toolkit.createCustomCursor(image, new Point(0, 0), "Cursor");
    setCursor(cursor);
    g2d.setTransform(old);

Така че си мислех, че това трябва да завърти изображението, но g2d.rotate() не изглежда да има никакъв ефект върху курсора? Не съм 100% сигурен дали има ефект върху самото изображение. Поне изображението на курсора е това, което искам да бъде.

РЕДАКТИРАНЕ: Ето едно примерно видео :) (В моя случай просто искам да го завъртя около определена точка, която остава на едно и също място през цялото време). https://www.youtube.com/watch?v=TQ71QXa-B-s


person user3738243    schedule 04.08.2014    source източник


Отговори (2)


Докато търсих и разпитвах за решение на подобен проблем, намерих вашия въпрос, както и отговора на него. Това е кодът, който използвам в моята програма и работи. Имайте предвид, че този метод е проектиран да бъде извикан само веднъж и постоянното му извикване може да изисква оптимизация. Също така научих AffineTransform днес и може би съм направил някои грешки (въпреки че кодът работи).

По принцип завъртам изображение, създавам ново изображение от него и задавам новото изображение като курсор. Моят "cursor.png" е в папката с данни.

private void rotateCursor(double rotation) {
    // Get the default toolkit
    Toolkit toolkit = Toolkit.getDefaultToolkit();

    // Load an image for the cursor
    BufferedImage image = null;
    try {
        image = ImageIO.read(this.getClass().getResource("/data/cursor.png"));
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    AffineTransform at = new AffineTransform(); 
    // affineTransform applies the added transformations in the reverse order

    // 3. translate it back to the center of the picture
    at.translate(image.getWidth() / 2, image.getWidth() / 2);

    at.rotate(rotation);//2- adds rotation  to at (they are not degrees)

    //1- translate the object so that you rotate it around the center
    at.translate(-image.getWidth() / 2, -image.getHeight() / 2);

    BufferedImage rotated = null; // creates new image that will be the transformed image

    // makes this: at + image= rotated
    AffineTransformOp affineTransformOp = new AffineTransformOp(at,
            AffineTransformOp.TYPE_BILINEAR);
    image2 = affineTransformOp.filter(image, rotated);

    // Create the hotSpot for the cursor
    Point hotSpot = new Point(10, 0); // click position of the cursor(ex: + shape's is middle)

    Cursor cursor = toolkit.createCustomCursor(rotated, hotSpot, "cursor");

    // Use the custom cursor
    this.setCursor(cursor);

}

Можете да използвате window.getMousePosition().x; и window.getMousePosition().y; за получаване на позиция на мишката, ако използвате mouseListener.

Трябва да извикате rotateCursor() метод с правилното двойно. Как да изчисля правилното двойно е нещо, с което не мога да ви помогна.

Надявам се да помогне.

Научих това от тези източници:

съхраняване на трансформирано BufferedImage в Java

http://www.codebeach.com/2008/02/using-custom-cursors-in-java.html

Въртящи се екземпляри на BufferedImage

http://stumpygames.wordpress.com/2012/07/22/particles-tutorial-foundation/ (този урок също има слушател на мишката)

person WVrock    schedule 21.10.2014

Струва ми се малко объркващо, какво се опитвате да завъртите?

Нека си представим, че имате обект BufferedImage, можете да получите обект Graphics2D от него и чрез операция над него можете да получите това, което искате.

java.awt.image.BufferedImage buffImage = null;

try {
    java.io.InputStream imageStream = 
            MyClass.class.getResourceAsStream( "pictures/skills/skill" +InfoReader.SkillData("CastImage") +".png" );
    //MyClass is anyclass that you use as relative path...
    //use ClassLoader.getSystemClassLoader().getResourceAsStream( ... ) 
    //for a absolute path
    buffImage = javax.imageio.ImageIO.read( imageStream );
}
catch ( java.io.IOException | IllegalArgumentException ex ) {
    //It may throw IllegalArgumentException if imageStream is null.
}

Graphics2D g2d = buffImage.createGraphics();
try {
    AffineTransform old = g2d.getTransform();
    g2d.rotate(Math.toRadians(degrees));
    g2d.setTransform(old);
}finally {
    g2d.dispose();
}

Toolkit toolkit = Toolkit.getDefaultToolkit();   //Get the default toolkit  
Cursor cursor = toolkit.createCustomCursor(image, new Point(0, 0), "Cursor");
setCursor(cursor);

Сега, ако възнамерявате да го завъртите, докато го използвате, не знам как, но се надявам да съм помогнал малко.

РЕДАКТИРАНЕ: Опитайте да видите тази връзка, може да ви помогне: https://www.google.com/#q=java+rotate+Cursor

РЕДАКТИРАНЕ 2: Сега виждам какво точно искате, не знам как да ви помогна, но опитайте да видите връзката, която ви дадох (да, от Google е). Дори и да не намерите много, това може да ви помогне в търсенето.

person saclyr    schedule 04.08.2014