旋转BufferedImage并将其保存到像素阵列中

时间:2014-11-06 19:01:38

标签: java swing graphics rotation bufferedimage

我正在尝试在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--;
            }
        }

    }
}

感谢您提供的任何帮助,如果有更好的方法,请随时告诉我。

1 个答案:

答案 0 :(得分:3)

您可以rotate()定位点周围的图片,也可以在Graphics2D上下文中看到here。该方法连接translate()rotate()translate()操作,同时将here视为显式转换。

附录:它会旋转图像,但如何将图像的像素保存为数组呢?

图像filter()后,使用ImageIO.write()方法之一保存RenderedImage的结果example