- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Java2D 制作一个简单的游戏以获得最大的兼容性。它在 Mac OS X Yosemite 上的 Java 8 下工作得很好,但当我在 Windows 7 下尝试相同的代码时,它就不那么流畅了。当调整 JFrame 大小时, Canvas 会闪烁,这真的很难看。
我的应用程序使用带有 BufferStrategy 的 AWT Canvas,并且工作原理如下。当环境中的物体移动时,另一个线程调用重绘。但对于窗口大小调整处理,我的策略如下:
public class TestCanvas
{
private static final Color[] colors = new Color[]{Color.black, Color.darkGray, Color.gray, Color.lightGray, Color.blue.darker().darker(), Color.blue, Color.blue.brighter().brighter(), Color.white};
public static void main(String[] args)
{
JFrame frame = new JFrame("Test Canvas");
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
Canvas canvas = new Canvas()
{
@Override
public void paint(Graphics g)
{
BufferStrategy bufferStrategy = getBufferStrategy();
g = bufferStrategy.getDrawGraphics();
paint100Circles(g);
g.dispose();
bufferStrategy.show();
}
@Override
public void update(Graphics g)
{
paint(g);
}
@Override
public void repaint()
{
paint(null);
}
};
contentPane.add(canvas, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(1000, 1000);
frame.setVisible(true);
canvas.createBufferStrategy(2);
}
public static void paint100Circles(Graphics g)
{
Random random = new Random(0);
for (int i = 0; i < 100; i++)
{
int x = Math.abs(random.nextInt()) % 1000;
int y = Math.abs(random.nextInt()) % 1000 + (Math.abs(random.nextInt() % 1000) / 25);
int size = 50 + Math.abs(random.nextInt()) % 50;
g.setColor(colors[Math.abs(random.nextInt()) % colors.length]);
g.fillOval(x, y, size, size);
}
}
}
也许我没有以正确的方式使用 BufferStrategy?
最佳答案
我使用createBufferStrategy(3),但2也应该可以。
在 this answer基本上鼓励您使用paintComponent,而不是paint()。引用:
“这里的问题是,paint 做了许多重要的工作,调用paintComponent 只是其中之一。”
您可能想尝试切换到paintComponent。你所做的其他事情看起来都很好。
不过话虽如此,在我自己的代码中我根本不调用paint()或paintComponent()。相反,我会尽可能地写入 bufferStrategy(render() 循环尽可能多地运行)
我认为当您使用 bufferStrategy 时,您会在 Paint() 之外写入缓冲区,并且在绘制期间只需将缓冲区写入屏幕。就像 this answer 中所说的那样,虽然它没有获得任何分数,但它可能仍然有有效的提示。
所以我认为要么使用paintComponent并在那里进行绘画(我认为您仍然可以设置双缓冲策略,但绘制到您的图形)或写入paintComponent/paint外部的缓冲区并让组件绘制缓冲区当它需要的时候。
关于java - AWT Canvas BufferStrategy 和调整大小闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27136250/
从Canvas可以看出类和 JFrame类,与BufferStrategy(Canvas 和JFrame)相关的方法不来自同一个父类。例如 JFrame 的 createBufferStrategy
经过几个小时的尝试解决这个问题后,我被难住了。我对 Java 有点陌生,可以使用一些帮助。 堆栈跟踪: java.lang.IllegalStateException: Component must
我尝试使用graphics2D和JFrame在Java中制作一个简单的GUI。我在 JFrame 上添加了背景颜色,在 initWindow() 方法中输入 this.setBackground(ne
我试图了解 BufferStrategy 是如何工作的。我制作了一个简单的应用程序,每 60 帧每秒一次又一次地绘制一些 Sprite 对象。我可以看到 Canvas 上的图像,但由于某种原因它们在闪
我正在尝试使用 JFrame 和 canvas 为游戏构建简单的 gui。 Window 是一个扩展 JFrame 类的类,我使用 fillRect 方法来填充黑色矩形。每次我运行程序时,框架窗口都不
首先,我知道以前曾有人问过类似的问题,但似乎没有答案可以解决我的问题。 我正在开发一个小游戏,由于某种原因,每当我尝试创建新的缓冲区策略时,java都会返回IllegalStateException。
我的桌面应用程序滞后。我认为 java.awt.image.BufferStrategy 中有问题。 private void render() { BufferStrategy bs
我是 java 的新手。我想做一个游戏。经过大量研究,我无法理解 bufferstrategy 是如何工作的。我知道基础知识..它创建了一个屏幕外图像,您可以稍后将其放入您的 Windows 对象中.
我用 BufferStrategy 等初始化一个扩展的 jFrame,在屏幕上得到一个漂亮的动画圆圈。我设置了一个关键监听器(在更新绘制线程之外),它告诉更新绘制线程在全屏独占模式之间切换,在更改完成
你好, 我尝试在 BufferStrategy 上使用其 Graphics 绘制图片。图片有透明背景,如果我在屏幕上绘制它,透明区域会变成黑色。 蓝色的东西是我想画的图像,但没有黑色部分(在原始图片中
当我试图弄清楚如何使用缓冲策略时,总体上只是改进我编写代码和清理东西的方式。当我运行以下代码时,在“createBufferStrategy(3)” 时出现错误 package Game1Te
所以我正在制作一个游戏,并且我的主游戏应用程序运行良好。问题是,当我尝试通过菜单(例如使用按钮 ActionEvent)启动游戏时,我的游戏似乎无法检测到提供给它的 KeyEvent。所以我决定制作一
我有一个 JFrame,我在其中添加了一个 JPanel。我正在做一些动画,所以我实现了 BufferStrategy 来进行渲染。我还有一个渲染循环,以使其在运行时保持渲染。 如果我像平常一样运行程
我是 Java 初学者,在扩展 JPanel 但不扩展 canvas 的类中创建 bufferstaregy 时遇到困难。有人可以在这里展示如何添加缓冲策略吗?我编写了非常简化的代码来说明我的问题。我
BufferStrategy 是 AWT 的一部分,通常与 Canvas 类一起使用,但它是否也可以与 Swing UI 结合使用而不会导致任何窗口显示问题,或者在这种情况下我应该更好地使用纯 AWT
我正在尝试使用 Java2D 制作一个简单的游戏以获得最大的兼容性。它在 Mac OS X Yosemite 上的 Java 8 下工作得很好,但当我在 Windows 7 下尝试相同的代码时,它就不
所以我最近一直在做一个小游戏,但遇到了一个奇怪的问题。虽然游戏在我不使用时运行得非常完美game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
Graphics g = bs.getDrawGraphics(); g.setColor(Color.BLACK); g.fillRect(0, 0, getWidth(), getHeight()
我正在尝试使用 BufferStrategy 和 Graphics2D 渲染图像。代码运行良好,但图像闪烁。在我用 Graphics2D 测试它之前,我只尝试了 Graphics,并且 Frame 疯
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 5 年前。 我一直在尝试制作 3d 游戏,但
我是一名优秀的程序员,十分优秀!