您好我几乎已经用java编写了我的游戏编码,但我遇到了一个大问题。 缩放 - 每个人都有不同大小的屏幕。
我的大多数游戏都是通过键盘控制的,但有一个设置功能,其中使用了按钮。
为了修复缩放,我计划通过创建一个整数'缩放来简单地缩放每个JBufferedImage。
这是我的第一款游戏,我试图通过封装和正确使用可用库来完善它,并且我按照我的方式单独缩放一切似乎是一种非常简单的方法。所以我不得不问是否有任何"官方"比例法。
答案 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);