计时器延迟问题 Java

3
我正在尝试制作一款贪吃蛇游戏,但在使“食物”以固定间隔(我想要让它每10秒出现一次)随机出现的问题上遇到了麻烦。当我在程序中给出一个简短的延迟时间(1000毫秒)后运行程序时,食物开始在屏幕上不同位置极快地闪现。我想要做的是让食物每10秒在随机位置逐个出现,而不是围绕着屏幕快速闪烁。非常感谢任何帮助。
附言:我以前从未做过这样的事情,因此如果代码看起来有点粗糙,请见谅。非常感谢任何关于编码的建议。
编辑:我知道这仍然不正确,但我只想知道目前是否至少朝着正确的方向前进。现在,“食物”只是坐落在框架的右上角。我的定时器或列表是否存在问题,还是整个程序都有问题?顺便说一句,如果更新我的代码只是为了显示新问题在这个网站上看起来很不好,请告诉我,我会在评论部分寻求帮助并停止编辑。
package snake;

import java.awt.* ;
import java.awt.event.*;
import java.util.* ;
import javax.swing.*;
import javax.swing.Timer;
/**
 *
 * @author Carlos
 */
public class Pellet extends JPanel
{
    Random randomNumber = new Random() ; 
    int x = 0 ;
    int y = 0 ;
    private Game game ;
    private Timer timer ;
    private final int DELAY = 100 ;
    private ArrayList<Pellet> al = new ArrayList<>() ;

    public Pellet(Game game)
    {        
        this.game = game ;        
    }

    @Override
    public void paint(Graphics g)
    {  
       super.paintComponent(g);
       g.fillOval(x, y, 10, 10);

       for(int i = 0 ; i < al.size() ; i++)
       {
           Pellet p = al.get(i) ;
           p.paintComponent(g);
       }

    }

    public void pelletTimer()
    {
        timer = new Timer(DELAY, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                x = randomNumber.nextInt(game.getWidth()) ;
                y = randomNumber.nextInt(game.getHeight()) ;
                Pellet p = new Pellet(game) ;
                al.add(p) ;
                repaint() ;
            }
        }) ;    
        timer.start();
    }


}
1个回答

5
您的代码尝试存在许多问题,因此让我们尝试解决这些问题。
  • 首先,这是一个Swing程序,因此您必须注意不要踩在Swing事件线程上,而java.util.Timer会这样做。
  • 您还在paint方法中创建了java.util.Timer,这是不应该做的事情,因为这个方法只用于绘图,不应该被减速或与非绘图代码有关。
  • 您的paint方法不是Swing组件的真正绘制方法覆盖,因为它使用了错误的签名(它使用Graphics2D参数而不是预期的Graphics参数),并且您的类没有扩展Swing组件,因此此方法对您没有任何用处。
建议:
  • 在扩展JPanel的类中覆盖paintComponent方法以绘制图形。
  • 首先调用super.paintComponent方法。
  • 使用javax.swing.Timer或Swing Timer来驱动动画。
  • 在Timer中创建新的pellet,将其添加到pellets的ArrayList中,并调用repaint()方法,这将告诉JVM重新绘制GUI,从而自动调用您的paintComponent方法。
  • 在调用超类方法后,在paintComponent方法中遍历pellet ArrayList,并像往常一样绘制每个pellet。
  • 查看Swing教程,特别是图形部分。您可以在此处找到链接:swing info。
  • 并查看此网站上的Swing动画示例,其中许多由我编写。您可以在此搜索结果中找到一些结果:this search。

我修好了!现在它按照预期工作,我要感谢你 Hovercraft Full of Eels,感谢你的帮助! - Saliva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接