有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

旋转Java已旋转的缓冲图像被切断

首先,我尝试用Java制作一个简单的游戏。我有一个视图,显示了一个平铺图,中间有一个坦克,它通过控制视口驻留在滚动窗格中的JSCROLBAR来移动。到目前为止,一切都进展顺利,直到我需要旋转图像。这是一张游戏的图片:注意:坦克车身和tilemap位于不同的面板上,不共享相同的图形

非旋转罐体图片:

https://i.stack.imgur.com/IqeEA.png

基本上,我希望使用箭头键围绕缓冲图像的中心旋转(原地旋转)。我已经有了关键点的代码,我也有一个方法尝试旋转缓冲图像,给定缓冲图像和角度(角度在方法中更改为弧度)。此方法将返回正确旋转的缓冲图像。代码如下:

public static BufferedImage rotateImage(BufferedImage image, double angle) {
        if(angle == 0)
            return image;
        else {
            
            angle = Math.toRadians(angle);
            double x = Math.abs(Math.cos(angle));
            double y = Math.abs(Math.sin(angle));
            int newWidth = (int) Math.floor(image.getWidth()*x + image.getHeight()*y);
            int newHeight = (int) Math.floor(image.getHeight()*x + image.getWidth()*y);
            
            BufferedImage rotated = new BufferedImage(newWidth, newHeight, image.getType());
            Graphics2D tool = rotated.createGraphics();
            
            AffineTransform transformer = new AffineTransform();
            transformer.rotate(angle, image.getWidth()/2, image.getHeight()/2);
            tool.drawImage(image, transformer, null);
            tool.dispose();
            
            return rotated;
        }   
    }

但是,正如标题所示,旋转图像时,图像的顶部和左侧会被切断,如图所示:

旋转罐体图片:

https://i.stack.imgur.com/HUpyL.png

所以我看了很多不同的论坛,但我不能解决我的问题。我可以在图像周围添加空白,但这会对我计划稍后进行的碰撞检测造成很大干扰。我知道这与原始显示比旋转图像的显示要小有关,我试着在许多方面进行相应的转换。如果我专门用这行代码翻译

transformer.translate((newWidth - image.getWidth())/2, (newHeight - image.getHeight())/2);

然后图像(罐体)旋转而不剪切,但反弹出如图所示的位置(我画了一个矩形以显示其位置):

带平移的旋转水箱图片:

https://i.stack.imgur.com/ZJ4UC.png

我也尝试过否定翻译,但它只适用于时髦的动作

所以,我真的不知道如何解决这个问题,我在这个问题上花费了太多的时间。如果可能的话,我会非常感激一个能直接编辑我的方法的有用的答案


共 (2) 个答案

  1. # 1 楼答案

    回答

    这是我需要认识到的一个开始的想法来回答这个问题。 平移和旋转的方法意味着图像不会被切断。但是,它不会像第三张图中所示的那样围绕中心。但同样,该方法并不打算重新居中。绘画代码本身需要考虑这种变化。我只是添加了变量来解释这一点:

    xOffset = (newWidth - image.getWidth())/2;

    yOffset = (newHeight - image.getHeight())/2

    简单地从我画坦克车身的地方减去这些

    感谢@camickr提供的解决方案

  2. # 2 楼答案

    当围绕中心点旋转方形精灵时,目标图像应比原始图像大2倍的平方根(约1.41)。例如,将不会以45°的旋转角度剪裁精灵

    我希望这些信息能帮助你解决你的问题