Java - 旋转图像总是失败

标签 java image rotation jpanel repaint

我已经被这个问题困扰了好几个小时了。我有一个 JPanel,可以在其中画几张图片。

这是一款 2D 游戏,我只需使用 repaint(); 即可将所有内容打印到屏幕上。

在某些时候,我想画一个拿着手枪的人。到目前为止,一切正常,但前提是该人看向北方,因为我的动画图片都是向北绘制的。手动旋转它们并随后将它们粘贴到我的项目中会太过分,所以我决定旋转图像以使其在任何方向都可用,但我不知道该怎么做。这是一些代码:

此方法中的一个简单开关会检查当前的朝向。请注意,第一种情况(北)工作正常,因为默认情况下图片是向北绘制的。

switch(CharDirection){
        case NORTH:
            if(PistolAnim == 0){
            try {
                Man = ImageIO.read(ManNorthURL);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }else{
                try{
                    if(PistolAnim == 1){
                    Man = ImageIO.read(Shoot1URL);
                    PistolAnim = 2;
                    return;
                    }
                    if(PistolAnim == 2){
                    Man = ImageIO.read(Shoot2URL);
                    PistolAnim = 3;
                    return;
                    }
                    if(PistolAnim ==3){
                    Man = ImageIO.read(Shoot3URL);
                    PistolAnim = 0;
                    return;
                    }
                } catch (IOException e){

                }
            }
            break;
        case EAST:
            if(PistolAnim == 0){
                try {
                    Man = ImageIO.read(ManEastURL);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }else{
                    try{
                        if(PistolAnim == 1){    
                        Man = ImageIO.read(Shoot1URL);
                        PistolAnim = 2;
                        return;
                        }
                        if(PistolAnim == 2){
                        Man = ImageIO.read(Shoot2URL);
                        PistolAnim = 3;
                        return;
                        }
                        if(PistolAnim ==3){
                        Man = ImageIO.read(Shoot3URL);
                        PistolAnim = 0;
                        return;
                        }
                    } catch (IOException e){

                    }
                }
            break;

整数变量“PistolAnim”用于显示动画的状态。 0 - 没有动画正在进行 1 - 图片1

2 - 图片2

3 - 图片3

绘制函数(嗯,重要的部分)如下所示:

g.drawImage(Man, CharX, CharY, Man.getWidth(), Man.getHeight(), null);

我尝试使用以下旋转方法:

public void rotate(double Degrees, BufferedImage img1){
        ImageIcon icon = new ImageIcon(img1);
        BufferedImage BlankCanvas = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = (Graphics2D)BlankCanvas.getGraphics();
        g2d.rotate(Math.toRadians(Degrees), icon.getIconWidth()/2, icon.getIconHeight()/2);



        g2d.drawImage(img1, 100, 100, null);
        img1 = BlankCanvas;
    }

我在互联网上找到了它,它在我的一些测试中有效,但现在它没有做它应该做的事情。我插入了该行

rotation(90, Man);

几乎在我的代码的每个点上,但没有任何效果。我也无法在绘图中旋转整个 Graphics2D 对象(它称为 g),因为它也绘制其他图片。

有人有想法吗?

谢谢!

最佳答案

 Graphics2D g2d = (Graphics2D)BlankCanvas.getGraphics();

这段代码是错误的。您不应该使用 getGraphics() 方法。您应该在 JPanel 的 paintComponent() 方法中进行自定义绘制,并使用传递给该方法的 Graphics 对象。然后,当您调用“rotate(...)”方法时,您可以将此 Graphics 对象传递给该方法并使用它来绘制旋转的图像。

您不必担心旋转/平移代码,只需使用 Rotated Icon 。然后您可以使用 paintIcon(...) 方法绘制图标:

RotatedIcon rotated = new RotatedIcon(icon, degrees);
rotated.paintIcon(...) 

关于Java - 旋转图像总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050769/

相关文章:

java - 在 eclipse-Java 中重写 hashCode()

java - 为什么在 Netbeans 中调试 Web 项目时无法单步执行库代码?

java - 如何减少 Elasticsearch 滚动响应时间?

css - 在 chrome 中打印预览后管理图像的 css 样式

matrix - 如何使用原始陀螺仪数据°/s来计算3D旋转?

android - 旋转位图图像

css - 伪元素之前的响应式 CSS 转换

java - 如何在图像上放置 JButton?

html - 使背景图像正确适合宽屏

python - 我收到错误 : np.append(Image()) TypeError: __init__() 缺少 1 个必需的位置参数: 'imgtype'