计时器延迟问题 Java
Timer Delay Problems Java
我正在尝试制作蛇类游戏,但我无法让 "pellets" 以固定的时间间隔随机出现(我想让它出现 10 秒)。当我 运行 程序在我给它的短暂延迟(1000 毫秒)后开始出现在不同位置的屏幕上非常快速地闪烁。我想要做的是让弹丸每 10 秒一次出现在随机位置,而不是快速闪烁。任何帮助将不胜感激。
P.S。我以前从未做过这样的事情,如果代码看起来有点粗糙,我深表歉意。任何关于编码的建议也非常受欢迎。
编辑:我知道这仍然不正确,但我只想知道到目前为止我是否走在正确的轨道上。现在 "pellet" 就位于框架的右上角。我的计时器或列表或一般情况下现在有问题吗?顺便说一句,如果本网站不赞成更新我的代码以显示新问题,请告诉我,我将在评论部分寻求帮助并停止编辑。
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();
}
}
您的代码尝试存在很多问题,所以让我们尝试解决这些问题。
- 首先,这是一个 Swing 程序,因此您必须注意不要踩到 Swing 事件线程,
java.util.Timer
会这样做。
- 您还在绘画方法中创建
java.util.Timer
,这是永远不应该做的事情,因为此方法仅用于绘画和绘画,不应减慢速度或涉及非绘画代码.
- 您的绘画方法不是 Swing 组件的真正绘画方法覆盖,因为它具有错误的签名(它使用 Graphics2D 参数而不是预期的 Graphics 参数)并且您的 class 没有扩展 Swing 组件,所以这个方法对你没有任何用处。
建议:
- 在扩展 JPanel 的 class 中重写 paintComponent 方法。
- 先调用super.paintComponent方法。
- 使用
javax.swing.Timer
或 "Swing" Timer 来驱动您的动画。
- 在您的 Timer 中创建一个新的 pellet,将其添加到 pellets 的 ArrayList,然后调用
repaint()
这将告诉 JVM 重新绘制您的 GUI,因此它会自动为您调用您的 paintComponent 方法。
- 在您的 paintComponent 方法中,调用 super 的方法后,遍历 pellet ArrayList 并像您一样绘制每个单独的 pellet。
- 查看 Swing 教程,尤其是图形部分。你可以在这里找到他们的link:swing info.
- 并查看此站点以获取 Swing 动画示例,其中许多是我编写的。您可以使用 this search.
找到一些结果
我正在尝试制作蛇类游戏,但我无法让 "pellets" 以固定的时间间隔随机出现(我想让它出现 10 秒)。当我 运行 程序在我给它的短暂延迟(1000 毫秒)后开始出现在不同位置的屏幕上非常快速地闪烁。我想要做的是让弹丸每 10 秒一次出现在随机位置,而不是快速闪烁。任何帮助将不胜感激。
P.S。我以前从未做过这样的事情,如果代码看起来有点粗糙,我深表歉意。任何关于编码的建议也非常受欢迎。
编辑:我知道这仍然不正确,但我只想知道到目前为止我是否走在正确的轨道上。现在 "pellet" 就位于框架的右上角。我的计时器或列表或一般情况下现在有问题吗?顺便说一句,如果本网站不赞成更新我的代码以显示新问题,请告诉我,我将在评论部分寻求帮助并停止编辑。
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();
}
}
您的代码尝试存在很多问题,所以让我们尝试解决这些问题。
- 首先,这是一个 Swing 程序,因此您必须注意不要踩到 Swing 事件线程,
java.util.Timer
会这样做。 - 您还在绘画方法中创建
java.util.Timer
,这是永远不应该做的事情,因为此方法仅用于绘画和绘画,不应减慢速度或涉及非绘画代码. - 您的绘画方法不是 Swing 组件的真正绘画方法覆盖,因为它具有错误的签名(它使用 Graphics2D 参数而不是预期的 Graphics 参数)并且您的 class 没有扩展 Swing 组件,所以这个方法对你没有任何用处。
建议:
- 在扩展 JPanel 的 class 中重写 paintComponent 方法。
- 先调用super.paintComponent方法。
- 使用
javax.swing.Timer
或 "Swing" Timer 来驱动您的动画。 - 在您的 Timer 中创建一个新的 pellet,将其添加到 pellets 的 ArrayList,然后调用
repaint()
这将告诉 JVM 重新绘制您的 GUI,因此它会自动为您调用您的 paintComponent 方法。 - 在您的 paintComponent 方法中,调用 super 的方法后,遍历 pellet ArrayList 并像您一样绘制每个单独的 pellet。
- 查看 Swing 教程,尤其是图形部分。你可以在这里找到他们的link:swing info.
- 并查看此站点以获取 Swing 动画示例,其中许多是我编写的。您可以使用 this search. 找到一些结果