当前位置: 首页 > 知识库问答 >
问题:

Java图形更新严重结巴(简单乒乓游戏)

谷梁承宣
2023-03-14

我对更动态的java摇摆编程很陌生。我当然以前用过常规的摇摆组件,比如ButtonPanels等等。

所以我试图用SwingGraphics2D制作一个非常基本的乒乓球游戏。我以前做过一个绘画项目,我成功了。

我的问题是,当程序运行时,图形会严重口吃。到目前为止,我只实现了球,它只是选择了一个随机的方向,并开始在面板中反弹。这很有效。但是,我只能看到球,如果我一直不断调整帧的大小,否则它会严重口吃,看起来很空白。在第一秒钟左右的时间里,你可以看到球在移动,但严重口吃,然后面板开始显得空白。

相关代码和结构:

程序的主要部分是控制器框架类。其中,控制器实现runnable并包含执行游戏更新的run方法。

Frame类扩展了JFrame,并包含一个私有实例变量JPanelgamePanel,所有的图形都在其中绘制。

控制器更新程序时,它在框架中调用一个名为updateGraphics()的类,该类以前称为paint(getGraphics())

public class Frame extends JFrame {

    private JPanel gamePanel;

    ....

    public void paint(Graphics g) {
        super.paint(g);

        label.setText(Integer.toString(ball.getPos().x) + ", " +  Integer.toString(ball.getPos().y));
        Graphics2D g2 = (Graphics2D) gamePanel.getGraphics();
        g2.setStroke(new BasicStroke(2));
        //g2.drawRect(0, 0, gamePanel.getWidth(), gamePanel.getHeight());

        try{
            //Draws the ball
            g2.fillOval(ball.getPos().x, ball.getPos().y, 10, 10);

            //Draws the player1(left) shield
            g2.setStroke(new BasicStroke(2));
            g2.drawLine(playerShield.getNorthX(), playerShield.getNorthY(), playerShield.getSouthX(), playerShield.getSouthY());
            g2.drawLine(playerShield.getNorthX(), playerShield.getNorthY(), playerShield.getSouthX(), playerShield.getSouthY());

            //Draws the computer/Player2(right) Shield
            g2.drawLine(computerShield.getNorthX(), computerShield.getNorthY(), computerShield.getSouthX(), computerShield.getSouthY());
            g2.drawLine(computerShield.getNorthX(), computerShield.getNorthY(), computerShield.getSouthX(), computerShield.getSouthY());
        } catch(Exception e) {
            System.out.println(e);
        }
    }

    ...

    public void updateGraphics() {
          paint(getGraphics());
    }

    //Another version of the updateGraphics i have tried to use with as little success

    public void updateGrapgics() {
         gamePanel.validate();
         gamePanel.repaint();
    }

}

在搜索时,我发现有人说我应该也不应该使用油漆或重新油漆的方法

有人能给我解释一下为什么会口吃,我应该怎么做才能让它不口吃吗?

共有2个答案

白云
2023-03-14

我认为应该实现某种双缓冲。

你的问题与这个Java面板双缓冲相似,本教程应该会帮助你很多http://www.cokeandcode.com/info/tut2d.html.

卢嘉誉
2023-03-14

不需要实现双缓冲或其他技巧。只需执行以下操作:

public class SomeVisualObject extends JComponent {
  public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;  
    // paint things
  }
}

...
final SomeVisualObject obj = new SomeVisualObject()
frame.add(obj);
...

final Timer repaintTimer = new Timer(20, new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    // do some stuff here, for example calculate game physics.
    // repaint actually does not repaint anything, but enqueues repaint request
    obj.repaint();
  }
});
repaintTimer.start();

它将运行和油漆顺利,没有故障。

只是不要弄乱循环。Swing运行自己的事件循环,这对于重新绘制和其他内容至关重要。

请参见2d游戏对象(弹跳球)的完整工作示例:https://gist.github.com/akhikhl/8199472

 类似资料:
  • 我试图用Java创建一个简单的乒乓球游戏进行处理。我还没有完成,一切都很顺利,只是我不能让球从乒乓桨上反弹。我已经成功地做到了,如果球低于桨板,它会反弹回来,但出于某种原因,如果球高于桨板,它会穿过。 paddleFunctions选项卡:

  • 我想创造一个和乒乓球一样的游戏。我创建了一个沿着圆周移动的桨。注意桨是弧形的。我想知道我如何检测球和桨之间的碰撞。为了更好地理解这个:http://gyazo.com/7bac8acdf0faf66005015d496498ca33球将在圆圈内,当与桨碰撞时反射出去。提前感谢!

  • 本教程将教你如何使用 Kivy 编写一款乒乓球游戏。我们将从一个基本的应用程序开始,描述创建这个游戏的每个步骤。 Kivy 是用 Python 和 Cython 编写的,基于 OpenGL ES 2,支持各种输入设备并拥有丰富的部件库。使用相同的代码,你可直接实现多平台应用,包括 Windows、macOS、Linux、Android 和 iOS。所有 Kivy 部件都支持多点触控。

  • 根据https://tools.ietf.org/html/rfc6455#page-37中的文档,必须使用响应请求。 我已经实现了来处理来自客户端的连接。 我对此有疑问- 我是否必须在中处理这些请求? 如果是,如何在spring boot应用程序中实现此功能,并使用响应请求?

  • 我想做一个正在处理的乒乓球游戏。但是球的移动不是很平稳。我试着改变帧速率并降低球的速度,但是移动速度似乎不是恒定的。这可能是性能问题吗?我是否做错了什么,或者即使对于简单的游戏,处理可能也不是正确的事情?(我的目标是试用processing.js,制作一款没有插件的游戏)。这是我的代码:

  • 本文向大家介绍python使用pygame实现笑脸乒乓球弹珠球游戏,包括了python使用pygame实现笑脸乒乓球弹珠球游戏的使用技巧和注意事项,需要的朋友参考一下 今天我们用python和pygame实现一个乒乓球的小游戏,或者叫弹珠球游戏。 笑脸乒乓球游戏功能介绍 乒乓球游戏功能如下: 乒乓球从屏幕上方落下,用鼠标来移动球拍,使其反弹回去,并获得得分,如果没有接到该球,则失去一条命。玩家有一