Tag: 2d games

JavaFX Canvas Double Buffering

我正在使用JavaFX在Java中复制经典游戏Pong。 我使用java.util.Timer,java.util.TimerTask进行游戏循环,使用JavaFX的Canvas进行渲染。 有没有办法为Canvas添加双缓冲,以便动画不会闪烁? 或者我应该采用不同的方法吗? 贝娄是代码。 我删除了它的一些部分,我认为这些部分无关紧要,因为代码长约200行。 Canvas canvas = new Canvas(stageW, stageH); GraphicsContext gc; public void start(Stage stage) throws Exception { Group root = new Group(); gc = canvas.getGraphicsContext2D(); Timer loop = new Timer(); root.getChildren().add(canvas); loop.schedule(new GameLoop(), 0, 1000 / 60); stage.setScene(new Scene(root,stageW, stageH)); stage.show(); } public class GameLoop extends TimerTask { @Override public void […]

Java:使用Swing编程游戏

我对游戏开发比较陌生。 我一直在开发游戏和学习游戏开发2-3个月。 我用的是Java。 我一直使用Swing作为我的图形(也就是说,整个游戏都显示在JPanel ,使用Graphics2D对象)。 到目前为止我对此没有任何麻烦。 最近,我在最近的项目中遇到了一个问题。 某些方法在以一致的时间间隔调用时存在问题(有时它会每15-16毫秒运行一次,因为它应该运行,有时它会开始每隔3000(!)毫秒运行一次)。 我做了一些令人沮丧的调试和一些研究,并发现发生这种情况的原因可能是因为我没有正确处理Swing和线程。 我的entrie游戏循环在线程的run()方法内run()不是EDT)。 所以我一直在修改EDT之外的Swing元素。 显然这必然会引起问题。 当我发现这是问题所在时,我想: “嘿,我只是使用SwingUtilities.invokeLater()来运行EDT中的游戏循环!” 但后来我记得,就像在EDT 之外操纵Swing元素一样“被禁止”, 从EDT 内部操纵非Swing对象也是有问题的 ( 我认为……这是正确的吗? )。 如果是这样,那么我不知道如何使用Swing在Java中开发游戏而不会遇到奇怪的问题 。 我的问题是: 如何使用Swing安全地开发游戏? 为了避免涉及Swing和线程的问题,对我来说要严格的准则是什么? 每个使用Swing的游戏开发者都应该知道吗? 这对我来说非常重要,因为我真的希望使用Java进行游戏开发,但如果我不理解这一点,我总会遇到奇怪的问题并且无法进展。 谢谢您的帮助

集成图形上的慢Java2D绘图

我正在开发一个简单的2D游戏,通过Java2D API渲染。 我注意到,当我尝试在集成显卡上绘图时性能崩溃。 我已经在我的主钻机上测试了这款游戏,其中包括更新的ATI Radeon和我5岁的笔记本电脑,它还有一个(令人难以置信的过时)Radeon。 两者都得到了很好的FPS,但是当我尝试使用我的Intel i5的板载HD 4000显卡时,它的速度大约是20 FPS。 我正在使用全屏独占模式。 在任何特定时刻,我一次渲染大约1000张图像。 令人讨厌的是,当我尝试getAvailableAcceleratedMemory()时,它只返回-1这张卡,它似乎拒绝加速任何图像。 有没有人有任何想法如何解决这个问题? 渲染代码: Graphics g = bufferStrategy.getDrawGraphics(); g.drawImage(img, x, y, img.getWidth(), img.getHeight(), null) g.dispose(); bufferStrategy.show(); 图片加载代码: BufferedImage I = null; I = ImageIO.read(new File(currentFolder+imgPath)); imgMap.put(imgIdentifier, I); 图像存储在由字符串标识的BufferedImages的散列图中,因此当实体需要绘制并对其进行成像时,只需将其从散列图中取出并绘制它。 在当前情况下,实体主要是地板和墙砖,因此它们永远不会改变(因此不必从第一次以外的哈希图中获取图像)。 编辑 – 我已经合并了MadProgrammer的方法,但它没有改变我的FPS。