java, поверните BufferedImage с углом мыши - PullRequest
0 голосов
/ 27 апреля 2020

Я искал во всем inte rnet простой способ просто вращать спрайт на угол.

Цель состоит в том, чтобы спрайт оружия следовал за мышью, вращаясь в центре экран (шутер сверху вниз Java). Я пробовал разные вещи:

Примечание: функция render(Graphics g) находится внутри моего класса Gun. java и использует g, элемент Graphics, который я использую для рисования на холсте игры. image - это BufferedImage, содержащий оригинальный спрайт. reticle.getAngle() задает угол, на который указывает мышь, считая центр экрана центром координат.

Попытка 1

public void render(Graphics g) {
        // create a new BufferedImage with the image of the gun on it
        BufferedImage rotatedImage = new BufferedImage(image.getWidth(), image.getHeight(),
            BufferedImage.TYPE_INT_ARGB);
        Graphics gRotatedImage = rotatedImage.getGraphics();
        gRotatedImage.drawImage(image, 0, 0, null);

        // rotate this gun image in the direction of shoot
        private AffineTransform at = new AffineTransform();
        at.rotate(reticle.getAngle() + Math.PI,
            rotatedImage.getWidth()/2, rotatedImage.getHeight()/2);

        AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
        rotatedImage = op.filter(rotatedImage, null);

        // finally display the rotated version of the gun image
        g.drawImage(rotatedImage,
            (int)(handler.getDisplay().getWidth()/2 - rotatedImage.getWidth()/2), 
            (int)(handler.getDisplay().getHeight()/2 - rotatedImage.getHeight()/2), 
            rotatedImage.getWidth(), rotatedImage.getHeight(), null);

}

При этом Решение, с java2s.com , я получаю спрайт, отображаемый в центре и вращающийся, но больше похожий на вертолет ... Он продолжает вращаться, не следуя за мышью.

Я также проверил все решения из соответствующего вопроса StackOverflow . На этот раз я вижу оружие, отображаемое в левом верхнем углу вслед за мышью, но не могу найти способ разместить его в центре экрана. Я пробовал переводы, но затем изображение спрайта поворачивается, принимая во внимание верхний левый угол в качестве центра.

Попытка 2

public void render(Graphics g) {
        Graphics2D g2d = (Graphics2D) g.create();

        double rotation = 0f;

        int width = image.getWidth() - 1;
        int height = image.getHeight() - 1;

        rotation = reticle.getAngle();
        rotation = Math.toDegrees(rotation) + 180;

        g2d.rotate(Math.toRadians(rotation), width / 2, height / 2);
        // g2d.translate(handler.getDisplay().getWidth()/2, handler.getDisplay().getHeight()/2);
        g2d.drawImage(image, 0, 0, null);

        int x = width / 2;
        int y = height / 2;
        g2d.setStroke(new BasicStroke(3));
        g2d.setColor(Color.RED);
        g2d.drawLine(x, y, x, y - height / 4);
        g2d.dispose();
}

Я просто хотел бы поворачивать мой спрайт каждые тик игры под углом, указанным reticle.getAngle(), который я знаю, это хорошо. Я чувствую себя действительно потерянным о том, как использовать Graphics2D или AffineTransform для выполнения вращения. Может ли кто-нибудь привести пример того, как вращать спрайт, следуя за мышью, и затем отображать его в центре экрана?

Каков наилучший способ поворота изображения, которое мы затем хотим отобразить в центре экран?

...