如何在java中为游戏实现双缓冲?

2024-01-10

因此,在我正在开发的游戏中,我有一个弹珠跟随鼠标,但当它这样做时,屏幕会闪烁。

背景包括两个 jpeg 和 9 个矩形。我该如何进行双缓冲呢?这是主窗口的代码。

/**
 * Write a description of class Window here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Window extends JApplet implements MouseMotionListener
{
    private BufferedImage image; 
    private BufferedImage side;
    private int mouseX;
    private int mouseY;

    public Window(){
        try {
            image = ImageIO.read(new File("Backgrounds/violet.jpg"));
            side = ImageIO.read(new File("Backgrounds/side margin.jpg"));
        } catch (IOException ex) { }    
    }   

    private void delay(int delay)
    {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {}
    }

    public void init()
    {
        this.addMouseMotionListener(this);
    }

    public void paint (Graphics page)
    {
        page.drawImage(image, 0, 0, null);
        page.setColor(Color.blue);
        page.fillRect(0, 0, 160, 160);
        page.setColor(Color.black);
        page.fillRect(15, 15, 130, 130);
        page.setColor(Color.green);
        page.fillRect(340, 0, 160, 160);
        page.setColor(Color.black);
        page.fillRect(355, 15, 130, 130);
        page.setColor(Color.yellow);
        page.fillRect(0, 340, 160, 160);
        page.setColor(Color.black);
        page.fillRect(15, 355, 130, 130);
        page.setColor(Color.red);
        page.fillRect(340, 340, 160, 160);
        page.setColor(Color.black);
        page.fillRect(355, 355, 130, 130);
        page.drawImage(side, 500, 0, null);
        page.drawString(Score.getScore(), 560, 110);
        //conveyors
        page.setColor(Color.gray);
        page.fillRect(235, 0, 30, 160);

        //marble
        delay(100);

        page.fillOval(mouseX, mouseY , 40, 40);          
    }

    public void mouseMoved(MouseEvent e)
    {
        mouseX = e.getX();
        mouseY = e.getY();
        repaint();
    }

    public void mouseDragged(MouseEvent e)
    {

    }
}

双缓冲在概念上非常简单,您不是一个接一个地绘制对象,而是将它们绘制在图像上,然后告诉渲染器绘制整个图像。这消除了闪烁。

以下是您可以如何执行此操作的示例(source http://www.ecst.csuchico.edu/~amk/classes/csciOOP/double-buffering.html)

class DoubleBufferedCanvas extends Canvas {

    public void update(Graphics g) {
    Graphics offgc;
    Image offscreen = null;
    Dimension d = size();

    // create the offscreen buffer and associated Graphics
    offscreen = createImage(d.width, d.height);
    offgc = offscreen.getGraphics();
    // clear the exposed area
    offgc.setColor(getBackground());
    offgc.fillRect(0, 0, d.width, d.height);
    offgc.setColor(getForeground());
    // do normal redraw
    paint(offgc);
    // transfer offscreen to window
    g.drawImage(offscreen, 0, 0, this);
    }
}

现在,您不必自己实现这一点,您可以使用 BufferStrategy 和相关类。有关示例,请参阅 lakam99 的回答。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在java中为游戏实现双缓冲? 的相关文章

随机推荐

  • 如何从 JTable 中删除一行? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想从 JTable 中删除一些行
  • 利用浏览器缓存外部文件

    我试图让我的谷歌页面速度洞察评级达到不错的水平 但是我也想缓存一些外部文件 有人知道处理这个问题的最佳方法是什么吗 https s swiftypecdn com cc js 5 minutes https pagead2 googlesy
  • 如何使用python比较两个球点的大圆距离和欧氏距离?

    我试图检查当您使用欧几里德距离而不是使用大圆距离 gcd 计算地球上两点的距离时引入的错误 我有两个由纬度和经度定义的点 我使用了 python geopy 框架大圆距离 https github com geopy geopy blob
  • Unity Animator SetTrigger 未重置为默认值

    正如我希望正确理解动画器 SetTrigger 一旦完成就会将动画设置为 false 如果我错了请纠正我 但我的项目并非如此 我有两种状态 默认 不执行任何操作 和移动 打开应用程序时会自动输入默认值 并且当我调用 SetTrigger 时
  • 获取 GIF 图像的第一帧而不下载所有其他帧

    我想从网络上获取一张GIF图像 但我发现如果我下载整个GIF图像 会导致大量的网络流量 我可以只获取 GIF 图像的第一帧而不下载所有其他帧吗 9 年零 6 个月后 正是伸出援手的最佳时机 这可以使用 ImageMagick 使用以下命令来
  • 离子服务/离子运行不反映变化

    ionicserve 和 ionicrun 都没有反映我的任何最新更改 ionicserve 显示了几个小时前的情况 ionicrun 显示了大约一个小时后的情况 从那时起 我放弃了所有更改 并从父分支创建了一个新分支 但它仍然在第一个分支
  • 如何以守护进程模式运行 Django 服务器?

    我想在守护进程模式下运行 Django 开发服务器 这样当我退出 shell 时 服务器仍然会运行 我怎样才能做到这一点 除了 Bernhard 所说的之外 如果您计划将其用于生产环境 您应该使用 mod wsgi 在 apache 下运行
  • 当用户滚动到页面最底部时淡入/淡出固定位置 div

    这看起来相当简单 但我试图让固定位置的页脚 div 在用户滚动到网页最底部时滑动并淡入 然后在用户向上滚动时滑动并淡出 我搜索了 Stack Overflow 其他人提出了建议的解决方案 但我的代码导致我的 div 只能滑动和淡入 当用户向
  • 我的数据库没有更新,如果我的JSON数据也会增加

    我正在将 JSON 数据解析到数据库 该数据显示在我的 lisview 中 但是第一次它从我的 JSON 获取数据并将其存储在数据库中 如果我在网站中添加任何内容 它不会升级 json 也会增加 但不会增加反映在数据库中 数据库部分也没有升
  • Prism可以使用.NET Core内置的依赖注入吗?

    我想使用 NET Core 3 1 启动 WPF 应用程序Prism可以利用 Net Core的内置DI IServiceCollection 或者我必须使用Unity之类的东西吗 如果Prism不能使用内置DI 它们可以并存吗 Prism
  • 为什么编译器不能完全解决死代码检测问题?

    我在 C 或 Java 中使用的编译器具有死代码预防功能 当一行永远不会被执行时发出警告 我的教授说编译器永远无法完全解决这个问题 我想知道这是为什么 我不太熟悉编译器的实际编码 因为这是一个基于理论的课程 但我想知道他们检查什么 例如可能
  • 测试文件是否已下载 Selenium/C# (Google Chrome)

    我想单击下载文件的按钮on click 并测试是否已下载所需的文件 我已经用 google 搜索过这个问题 但不幸的是没有找到关于这个主题的任何具体答案 我发现的很多帖子都已经过时了 2014 年 我敢打赌 Selenium 现在肯定已经改
  • WSO2 API 管理器,无效。无法找到请求目标的有效认证路径

    我已经在本地启动了 WSO2 API Manager 我正在尝试添加 API 端点https联系 它向我展示了这种错误 它向我展示了Invalid unable to find valid certification path to req
  • C# 与 Excel 中的模数有何不同?

    我正在试验负基数系统 并使用 Excel 来处理和检查我的计算 我注意到 C 与 Excel 之间存在差异 为什么 C 返回的结果与 Excel 不同 例如 C 146 3 2 Excel mod 146 3 1 假设我们有四个整数 x y
  • string.replace(fromCharCode() , '') 无法替换字符

    当我解析 XML 时 它包含异常的十六进制字符 所以我尝试用空白来代替它 但这根本不起作用 原人物 hex code 253 255 code xmlData String replace String fromCharCode 253 2
  • 查找矩阵内的最大和子=矩形[重复]

    这个问题在这里已经有答案了 可能的重复 获取总和最大的子矩阵 https stackoverflow com questions 2643908 getting the submatrix with maximum sum 给定一个正整数和
  • 如何根据不同的URL参数和请求值写入不同的数据库?

    我正在尝试创建一个 REST API 它选择要写入的适当的 mongo 数据库以及正确的集合 如何选择与参数同名的数据库以及集合 即将推出的 v0 6 Eve 将原生支持多个 Mongo 实例 新功能 支持多个 MongoDB 数据库和 或
  • 如何在 Mac OS 上使用 homebrew 将 postgresql 从 10.1 降级到 9.6 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的 Mac 上装有 postgresql 10 1 我的工作网站需要 9 6 才能在本地计算机上运行 找不到有关如何卸载或降级到 9 6
  • 如何解决此错误 (GWT)

    运行我的应用程序后出现此错误 编译过程中没有出现错误 另外 没有其他应用程序在运行 在端口 8888 警告 上启动 Jetty 失败 电子邮件受保护 cdn cgi l email protection 8888 java net Bind
  • 如何在java中为游戏实现双缓冲?

    因此 在我正在开发的游戏中 我有一个弹珠跟随鼠标 但当它这样做时 屏幕会闪烁 背景包括两个 jpeg 和 9 个矩形 我该如何进行双缓冲呢 这是主窗口的代码 Write a description of class Window here