gpt4 book ai didi

java - 拉伸(stretch)游戏以适应屏幕尺寸并保持坐标系

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:15 24 4
gpt4 key购买 nike

我正在尝试创建一个与此类似的游戏 tutorial ,您可以在其中找到源代码。 GameFrame 内有 GamePanel。 GamePanel 内有 StatsPanel 和 PlayPanel。 GameFrame 和 GamePanel 的尺寸为 1280 x 640,StatsPanel 的尺寸为 1280 x 40,位于 GamePanel 的顶部,PlayPanel 的尺寸为 1280 x 600,位于 GamePanel 的底部。

但是,我希望使游戏全屏,但我不希望更改坐标系,因为不同的屏幕尺寸会存在差异。所以这是我的问题:如何拉伸(stretch)游戏以适应屏幕尺寸并保持坐标系引用?

我相信可以将游戏渲染为图像,然后缩放以适合屏幕。通过这种方式,我仍然可以引用 1280 x 640 边界框中的组件。我不知道在哪里以及如何实现这一点。

到目前为止我所尝试过的(引用教程的源代码):

GameFrame(扩展 JFrame)

构造函数:

this.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()-WIDTH)/2),
((int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()-HEIGHT)/2));
this.setSize(WIDTH,HEIGHT);

替换为:

this.setLocation(0,0);
this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setUndecorated(true);

GameManager(扩展线程)

run()方法:

gamePanel.repaintGame();

替换为:

gamePanel.repaint();

GamePanel(扩展 JPanel)

repaintGame() 方法:

public void repaintGame(){
playPanel.repaint();
}

替换为paintComponent()方法:

public void paintComponent(Graphics g)
{
super.paintComponent(g);
playPanel.repaint();
BufferedImage img = new BufferedImage(1280, 640, BufferedImage.TYPE_INT_RGB);
g.drawImage(img, 0, 0, getWidth(), getHeight(), 0, 0, 1280, 640, null);
}

这些更改并未拉伸(stretch)游戏以适应屏幕尺寸。虽然 GameFrame 和黑色 GamePanel 跨越了屏幕尺寸,但 StatsPanel 和 PlayPanel 似乎仍保留在 1280 x 640 边界框中。

我在 Java 方面不太有经验,所以请原谅我可能做出的任何疏忽。

编辑:更改后的图像(忽略终端窗口):

Screenshot

正如对 c0der 答案的评论:

My main issue is to maintain the coordinate system. For example, point (500, 300) is different in a 1920 by 1080 screen than its location in a 1280 by 640 screen. As such, I was wondering whether it would be possible to stretch GamePanel, along with its components StatsPanel and PlayPanel, across a full screen GameFrame as an image or some other means. That way, the point (500, 300) will always refer to the (500, 300) within GamePanel, and GamePanel will subsequently be stretched across the screen. I've uploaded a picture to my post. I wish to stretch the game to the screen size.

最佳答案

假设这是布局的良好表示:

import java.awt.Color;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame extends JFrame {

public static final int WIDTH=1280;
public static final int HEIGHT=640;

public GameFrame(GamePanel gamePanel){

//set frame to appear at the center of the screen
this.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()-WIDTH)/2),
((int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()-HEIGHT)/2));

this.setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);

this.add(gamePanel);
setVisible(true);
}

public static void main(String[] args) {

new GameFrame(new GamePanel());
}
}

class GamePanel extends JPanel{

public static final int PLAY_PANEL_HEIGHT=640;
public static final int STATS_HEIGHT=40;

public GamePanel(){

this.setSize(WIDTH, HEIGHT);
setLayout(null);
setBackground(Color.BLACK);

JPanel statsPanel= new JPanel();
statsPanel.setSize(GameFrame.WIDTH, STATS_HEIGHT);
statsPanel.setLayout(null);
statsPanel.setBackground(Color.CYAN);

statsPanel.setLocation(0, 0);
this.add(statsPanel);

JPanel playPanel=new JPanel();
playPanel.setSize(GameFrame.WIDTH, PLAY_PANEL_HEIGHT);
playPanel.setLayout(null);
playPanel.setBackground(Color.DARK_GRAY);
playPanel.setLocation(0, STATS_HEIGHT);
this.add(playPanel);
}
}

按照评论中的说明进行更改以使其全屏显示:

public class GameFrame extends JFrame {

public GameFrame(GamePanel gamePanel){

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
this.add(gamePanel);

setExtendedState(JFrame.MAXIMIZED_BOTH);
setUndecorated(true);
setVisible(true); //make sure you have means to close the window
}

public static void main(String[] args) {

new GameFrame(new GamePanel());
}
}

class GamePanel extends JPanel{

public static final int STATS_HEIGHT=40;

public GamePanel(){

//using null layout manager requires that you manually handle all size or
//other layout changes. a much better practice is to use layout manager
setLayout(new BorderLayout());//use BorderLayout instead of null
setBackground(Color.BLACK);

JPanel statsPanel= new JPanel();
//width is ignored for NORTH components of BorderLyayout
statsPanel.setPreferredSize(new Dimension(0, STATS_HEIGHT));
statsPanel.setLayout(null);
statsPanel.setBackground(Color.CYAN);
this.add(statsPanel, BorderLayout.NORTH);

JPanel playPanel=new JPanel();
//height is ignored for CENTER components of BorderLyayout
playPanel.setPreferredSize(new Dimension(WIDTH, 0));
playPanel.setBackground(Color.DARK_GRAY);
this.add(playPanel, BorderLayout.CENTER);
}
}

编辑
拉伸(stretch)图像意味着要么使每个像素变大(这是您无法控制的),要么在您的情况下添加像素。
添加像素显然会将 (500,300) 坐标(作为示例)更改为其他值。
我看到两个选择:
a.无论帧大小如何,都将 GamePanel 保持固定大小。
b.根据实际大小动态计算坐标,而不是使用像(500,300)这样的固定值。
我会推荐选项b。

关于java - 拉伸(stretch)游戏以适应屏幕尺寸并保持坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44212280/

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