【发布时间】:2021-03-21 21:20:02
【问题描述】:
首先,我正在尝试用 Java 制作一个简单的游戏。我有一个显示平铺地图的视口,中间有一个坦克,它通过控制视口所在的滚动窗格的 JScrollBars 来移动。到目前为止,一切进展顺利,直到我需要旋转图像。这是游戏的图片:注意:坦克车身和地图位于不同的面板上,并且不共享相同的图形。
非旋转罐体图片:
基本上,我想使用箭头键围绕其中心旋转缓冲图像(原地旋转)。我已经有了键的代码,并且我还有一种方法可以尝试在给定缓冲图像和角度(在方法中将角度更改为弧度)的情况下旋转缓冲图像。此方法将返回正确旋转的缓冲图像。代码如下:
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;
}
}
但是,正如标题所暗示的那样,图像在旋转时会在图像的顶部和左侧被切断,如下所示:
旋转的罐体图片:
所以我查看了许多不同的论坛,但我无法解决我的问题。我可以在图像周围添加空白,但这会干扰我计划稍后进行的碰撞检测。我知道它必须与原始显示小于旋转图像的显示有关,并且我尝试以多种方式进行相应的翻译。如果我专门用这行代码翻译,
transformer.translate((newWidth - image.getWidth())/2, (newHeight - image.getHeight())/2);
然后图像(罐体)在没有切割的情况下旋转,但是如图所示弹回了位置(我画了一个矩形来显示它的位置):
带有平移的旋转坦克图片:
我也尝试过否定翻译,但它只适用于时髦的动作。
所以,我真的不知道如何解决这个问题,而且我在这个问题上花费了太多时间。如果可能的话,我真的很感激一个有用的答案,它可以直接编辑我的方法。
【问题讨论】:
-
以度为单位的角度 - 角度应以弧度为单位。使用
Math.toRadians(...)进行转换。有关工作示例,请参阅:stackoverflow.com/questions/28755136/…。Rotation示例旋转 BufferedImage。 -
@camickr ,感谢您的回复,但我已经查看了该答案并实施了它,但遗憾的是它没有到位(此时我已经实施了来自不同论坛的许多答案,但他们没有为我工作)。另外,我的方法有 line angle = Math.toRadians(angle) 所以角度确实是弧度。
-
它不是为原地旋转而设计的。您的方法旨在返回 BufferedImage。然后由您的绘画代码根据其新尺寸将图像居中。查看
Rotation2示例。它演示了如何代替原始图像进行旋转(不创建旋转的 BufferedImage) -
这与您的问题并没有真正的关系。但是你知道实现 keylistene 很容易,对吧?我只是不明白你为什么要使用 JScrollBars 来控制坦克。我无法想象用它们进行流畅的控制。
-
@camickr 所以我只想说声谢谢,因为这真的让我很沮丧。您发布的第二条评论刚刚帮助我解决了我的问题。我制作了变量来解释偏移量,并在重新绘制时计算它们。我想我需要更有创意...再次感谢。
标签: java rotation bufferedimage cut