- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个与此类似的游戏 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 方面不太有经验,所以请原谅我可能做出的任何疏忽。
编辑:更改后的图像(忽略终端窗口):
正如对 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/
我遇到了问题,似乎无法解决。 基本上,我希望我的菜单和文本随着分辨率的变化/放大/缩小而调整大小;图片工作正常,内容 div 工作正常,只是菜单似乎无法适应。 请帮我解决这个问题.. 普通 View
我在map reduce上开发了大约20个工作,包括pagerank算法。我从未发现任何具有挑战性的问题可以在线适应mapreduce框架。我想提高自己的技能。有这样的指南吗? 最佳答案 您正在寻找的
我了解到 Java 中没有 NOR,我可以使用 !A && !B 或 !(A||B)。既然 A 和 B 都是假的,为什么我不能使用 !A || B? 最佳答案 因为Java没有NOR运算符,你的表达式
我需要根据构建 CLI 工具的要求评估“GO”,该工具应该可以在不同的操作系统中运行。这是如何在诸如“Cloud Foundry CLI”之类的 CLI 工具中实现的?GO 如何处理这种对操作系统的适
所以我试图让我的下拉菜单正常工作。下拉列表位于我的标题中的列表项下,该列表项会根据用户的用户名而变化。这使得大小不同,但我无法让下拉菜单跟随宽度调整大小。 示例 1: http://jsfiddle.
我已经很努力了,但我还是被 matplotlib 卡住了。请忽略,mpl 文档让我有点困惑。我的问题涉及以下方面: 我用 matshow 函数画了一个对称的 n*n 矩阵 D。行得通。 我想做同样的事
我正在尝试调整 Boyer-Moore c(++) Wikipedia implementation获取字符串中模式的所有匹配项。实际上,维基百科实现返回第一个匹配项。主要代码如下: char* bo
我在底部嵌套了带有文本的 flex 元素。顶部元素具有小于文本的固定宽度: .list-header { display: flex; width: 150px; height: 80px
我想初始化 std::any带有仅 move 类型变量。我找到了 Cannot move std::any . 编译错误案例 在使用链接答案中的 shared_ptr 解决方法之前,我测试了以下代码:
现在我正在使用 webview 处理 ListView 。在这个 listview webview 中用于显示图像。它来自 url。现在我面临一个问题,我无法从 url 获得唯一尺寸的图像,一些图像很
我的文件夹结构是这样的: src --main.cpp tests --src ----main_test.cpp Makefile 我想制作一个像make main_test这样的目标,以便能够以.
前段时间我也在讨论类似的话题。我正在查看我的应用程序,我认为它有很多不必要的代码。我的意思是我有服务负责从两家书店的不同类别的书籍中抓取数据。现在我有 5 个类别,所以我有 5 个方法,但如果我要添加
我使用多个 div 子元素创建父元素,然后根据 data-value 属性在 JavaScript 中计算这些子元素的宽度。 如果我对所有 child 的计算宽度求和,我最终将得到 100%。但出于某
我像这样使用减速板 gem : require 'airbrake' Airbrake.configure do |config| config.api_key = 'XXXXX' confi
我们在企业环境中有一个 svn 存储库结构,如下所示: root libs shared_lib1 shared_lib2 private_lib public_cod
我制作了一个应用程序,其中有许多从 UIView 子类化的 View 。这些 View 的大小和方向是随机的,并且可以保存应用程序屏幕的状态。当用户在打开屏幕的同一设备上保存屏幕时,屏幕状态为“正常”
我需要调整 lucene 的 StandardTokenizer 以适应有关 twitter 数据的一些特殊目的。目前,我使用 StandardTokenizer 来标记一些我想要处理的推文。它工作得
在Windows Store应用中,如果内容是固定的,我们可以把它封装成一个ViewBox,让内容适应不同的分辨率。但是,如果内容不固定,在我的应用程序中,有一个 GridView 哪些项目是动态的,
一切都在标题中。 在我的应用程序中,根据用户所做的选择,我用一个列表填充一个组合框,该列表有时很小(1 个元素)有时很大(150 个元素)。 我想要的不是在启动时将固定高度设置为给定值,而是将 max
我的 2 div 动画感谢我下面的 jquery 脚本。当屏幕小于 700px 时,div 变成更小的正方形(35px 而不是 50px)。我希望 .animate({width:100px}); 仅
我是一名优秀的程序员,十分优秀!