gpt4 book ai didi

java - 为什么我的球一直闪烁?

转载 作者:行者123 更新时间:2023-11-30 02:55:59 25 4
gpt4 key购买 nike

我还是个学生。我正在尝试学习如何自己画球和移动。

这是代码:

import javax.swing.*;
import java.awt.*;

public class Ball extends JFrame
{
int x = 50;
int y = 50;
int rad = 30;

Ball(){
setSize(500,500);
setTitle("Ball");
setVisible(true);
}

void move()
{
if (x < getWidth() - rad){
x = x + 1 ;
}
try
{
Thread.sleep(100);
}
catch( Exception e)
{
}
}

public void paint( Graphics g)
{
super.paint(g);
g.fillOval(x,y,rad,rad);
}
public static void main(String args[])
{
Ball b = new Ball();
while(true){
b.move();
b.repaint();
}
}
}

我想说这段代码可以完成 60% 的工作,因为

当我运行程序时,球向右移动,但由于某种原因它一直闪烁,我不知道为什么。

这是我的电脑问题,还是代码问题或某种错误?

我正在使用 eclipse luna

最佳答案

当屏幕仅更新您希望显示的部分数据时,您会遇到一个非常经典的问题。

在本例中,JFrame 的 update(Graphics) 使用 fillRect 清除屏幕,然后调用 paint(Graphics) 来使用 fillOval 绘制球。

如果屏幕在 fillRect 和 fillOval 之间更新,球将短暂消失,导致闪烁(又名闪烁)。

解决方案是双缓冲,其中所有图形操作都绘制到屏幕外图像,然后在一次操作中绘制到窗口。

这是您通过 JPanel 免费获得的东西,因此只需修改您的代码以继承它而不是 JFrame(在任何情况下这都是很好的做法)。这是经过最少代码更改的:

import javax.swing.*;
import java.awt.*;

public class Ball extends JPanel
{
int x = 50;
int y = 50;
int rad = 30;

void move()
{
if (x < getWidth() - rad){
x = x + 1 ;
}
try
{
Thread.sleep(100);
}
catch( Exception e)
{
}
}

public void paint( Graphics g)
{
super.paint(g);
g.fillOval(x,y,rad,rad);
}
public static void main(String args[])
{
Ball b = new Ball();
JFrame frame = new JFrame();
frame.add(b);
frame.setSize(500,500);
frame.setVisible(true);

while(true){
b.move();
b.repaint();
}
}
}

这应该是无闪烁的,但可能仍然不稳定。

为了获得更流畅的动画,您通常会考虑帧间计时和帧丢失,而不是仅仅每 100 毫秒更新一次并希望它能够及时重绘。

关于java - 为什么我的球一直闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37194539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com