我正在尝试在2D游戏中正确旋转剑。我有一个剑图像文件,我希望在播放器的位置旋转图像。我尝试使用Graphics2D和AffineTransform,但问题是播放器在不同的坐标平面上移动,Screen类,而Graphics使用JFrame上像素的文字位置。所以,我意识到我需要通过旋转图像本身来渲染剑,然后将其保存到像素数组中以供我的屏幕类渲染。但是,我不知道该怎么做。这是我的屏幕渲染方法的代码:
public void render(double d, double yOffset2, BufferedImage image, int colour,
int mirrorDir, double scale, SpriteSheet sheet) {
d -= xOffset;
yOffset2 -= yOffset;
boolean mirrorX = (mirrorDir & BIT_MIRROR_X) > 0;
boolean mirrorY = (mirrorDir & BIT_MIRROR_Y) > 0;
double scaleMap = scale - 1;
for (int y = 0; y < image.getHeight(); y++) {
int ySheet = y;
if (mirrorY)
ySheet = image.getHeight() - 1 - y;
int yPixel = (int) (y + yOffset2 + (y * scaleMap) - ((scaleMap * 8) / 2));
for (int x = 0; x < image.getWidth(); x++) {
int xPixel = (int) (x + d + (x * scaleMap) - ((scaleMap * 8) / 2));
int xSheet = x;
if (mirrorX)
xSheet = image.getWidth() - 1 - x;
int col = (colour >> (sheet.pixels[xSheet + ySheet
* sheet.width])) & 255;
if (col < 255) {
for (int yScale = 0; yScale < scale; yScale++) {
if (yPixel + yScale < 0 || yPixel + yScale >= height)
continue;
for (int xScale = 0; xScale < scale; xScale++) {
if (x + d < 0 || x + d >= width)
continue;
pixels[(xPixel + xScale) + (yPixel + yScale)
* width] = col;
}
}
}
}
}
}
这是我从Sword Class调用render方法的不良尝试之一:
public void render(Screen screen) {
AffineTransform at = new AffineTransform();
at.rotate(1, image.getWidth() / 2, image.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(at,
AffineTransformOp.TYPE_BILINEAR);
image = op.filter(image, null);
screen.render(this.x, this.y, image, SwordColor, 1, 1.5, sheet);
hitBox.setLocation((int) this.x, (int) this.y);
for (Entity entity : level.getEntities()) {
if (entity instanceof Mob) {
if (hitBox.intersects(((Mob) entity).hitBox)) {
// ((Mob) entity).health--;
}
}
}
}
感谢您提供的任何帮助,如果有更好的方法,请随时告诉我。
答案 0 :(得分:3)
您可以rotate()
定位点周围的图片,也可以在Graphics2D
上下文中看到here。该方法连接translate()
,rotate()
和translate()
操作,同时将here视为显式转换。
附录:它会旋转图像,但如何将图像的像素保存为数组呢?
图像filter()
后,使用ImageIO.write()
方法之一保存RenderedImage
的结果example。