如何使用java扩展整个游戏

时间:2015-12-15 03:11:59

标签: java

您好我几乎已经用java编写了我的游戏编码,但我遇到了一个大问题。 缩放 - 每个人都有不同大小的屏幕。

我的大多数游戏都是通过键盘控制的,但有一个设置功能,其中使用了按钮。

为了修复缩放,我计划通过创建一个整数'缩放来简单地缩放每个JBufferedImage。

这是我的第一款游戏,我试图通过封装和正确使用可用库来完善它,并且我按照我的方式单独缩放一切似乎是一种非常简单的方法。所以我不得不问是否有任何"官方"比例法。

1 个答案:

答案 0 :(得分:2)

如果您添加了一些上下文来帮助我们了解您的游戏是如何工作的,那将会很有帮助,但这可能会让您走上正轨。在我的旧Java游戏中,我只是将所有内容绘制为固定大小的BufferedImage,并将缓冲的图像缩放到面板大小。有更好的" (更高效)的方法,但这可能是最简单的。

创建一个面板:

panel = new JComponent()
{
    @Override
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;

        buffer = getCurrentBuffer();  // Get the updated game image from somewhere

        // Figure out how to scale the image
        int w = this.getWidth();
        int h = this.getHeight();

        int[] scale = scaleImage(buffer, w, h);

        // Make sure scaling isn't all pixely
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // Clear the screen
        g2.setColor(Color.black);
        g2.fillRect(0, 0, getWidth(), getHeight());

        // Paint image scaled
        g2.drawImage(buffer, scale[2], scale[3], scale[0], scale[1], null);
    }
};

辅助功能:

/**
 * Gets image scaling keeping its aspect ratio
 * @param image Image to scale
 * @param newWidth Width goal
 * @param newHeight Height goal
 * @return new int[] {Width to make it, height to make it, x to draw at, y to draw at}
 */
public static int[] scaleImage(Image image, int newWidth, int newHeight)
{
    double thumbRatio = (double) newWidth / (double) newHeight;
    int imageWidth = image.getWidth(null);
    int imageHeight = image.getHeight(null);
    double aspectRatio = (double) imageWidth / (double) imageHeight;

    int x = 0;
    int y = 0;

    if (thumbRatio < aspectRatio)
    {
        y = newHeight;
        newHeight = (int) (newWidth / aspectRatio);
        y /= 2;
        y -= newHeight / 2;
    }
    else
    {
        x = newWidth;
        newWidth = (int) (newHeight * aspectRatio);
        x /= 2;
        x -= newWidth / 2;
    }

    return new int[] { newWidth, newHeight, x, y };
}

创建固定大小的缓冲图像时,请确保只创建一次,因为在每次游戏循环迭代中重新创建它是非常低效的。

buffer = new BufferedImage(NOMINAL_GAME_WIDTH, NOMINAL_GAME_HEIGHT, BufferedImage.TYPE_INT_RGB);