gpt4 book ai didi

java - 将微小的低分辨率应用程序缩放到更大的屏幕尺寸

转载 作者:行者123 更新时间:2023-12-03 00:57:18 25 4
gpt4 key购买 nike

我正在用 Java 创建一个复古街机游戏。游戏的屏幕分辨率为 304 x 256,我想保留该分辨率以保留游戏的复古特征(视觉效果、动画、字体 block 度等)。

但是当我在大型桌面显示器上渲染它时,正如人们所期望的那样,它太小了。

我希望能够将窗口放大一个常数因子,而不必编写各种 paint(Graphics) 方法来了解存在比例的事实 -向上。也就是说,我希望渲染代码相信屏幕为 304 x 256。我也不想更改桌面分辨率或进入全屏独占模式。本质上只是想要一个带有放大像素的大窗口。

我正在寻找以下内容:

scale(myJFrame, 4);

并让所有内容自动放大。

更新:关于输入,我的游戏碰巧使用键盘输入,所以我自己不需要trashgod描述的逆变换。我仍然可以想象其他人会需要它,所以我认为这是一个合适的建议。

最佳答案

建议的一种方法 here ,就是依靠drawImage()来缩放内容的图像。您的游戏将在 BufferedImage 的图形上下文中呈现自身,而不是在 paintComponent() 的实现中。如果游戏包含鼠标交互,您必须如图所示缩放鼠标坐标。在下面的变体中,我为 CENTER 面板指定了 SCALE = 8 倍数的首选尺寸,并将原始尺寸添加为 WEST 中的图标BorderLayout。由于默认值 CENTER 会忽略组件的首选大小,因此您可能希望将其添加到具有 FlowLayout 的(可能是嵌套的)面板。调整框架大小以查看效果。

f.setLayout(new FlowLayout());
f.add(new Grid(NAME));
//f.add(new JLabel(ICON), BorderLayout.WEST);

image

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;

/**
* @see https://stackoverflow.com/a/44373975/230513
* @see http://stackoverflow.com/questions/2900801
*/
public class Grid extends JPanel implements MouseMotionListener {

private static final String NAME = "OptionPane.informationIcon";
private static final Icon ICON = UIManager.getIcon(NAME);
private static final int SCALE = 8;
private final BufferedImage image;
private int imgW, imgH, paneW, paneH;

public Grid(String name) {
super(true);
imgW = ICON.getIconWidth();
imgH = ICON.getIconHeight();
image = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) image.getGraphics();
ICON.paintIcon(null, g2d, 0, 0);
g2d.dispose();
this.addMouseMotionListener(this);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(imgW * SCALE, imgH * SCALE);
}

@Override
protected void paintComponent(Graphics g) {
paneW = this.getWidth();
paneH = this.getHeight();
g.drawImage(image, 0, 0, paneW, paneH, null);
}

@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
int x = p.x * imgW / paneW;
int y = p.y * imgH / paneH;
int c = image.getRGB(x, y);
this.setToolTipText(x + "," + y + ": "
+ String.format("%08X", c));
}

@Override
public void mouseDragged(MouseEvent e) {
}

private static void create() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Grid(NAME));
f.add(new JLabel(ICON), BorderLayout.WEST);
f.pack();
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
create();
}
});
}
}

关于java - 将微小的低分辨率应用程序缩放到更大的屏幕尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com