2017-06-17 216 views
0

我想制作水果篮游戏。这里的想法是,我想从屏幕顶部绘制水果到底部,我也想用timer.I尝试几种方法,但我没有结果。这是我所做的,但它完全做错了。设置游戏计时器

Timer timer = new Timer(); 
while (getY() != 1500) { 
     timer.schedule(new DrawFruit(frame, g, x) { 
      @Override 
      public void run() { 

       g.drawImage(Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(Consts.ImageResource.APRICOT_DIR)), 500, getY(), frame); 
       frame.repaint(); 
       setY(getY() + 30); 

      } 
     }, 0, 1000); 
    } 

和DrawFruit类

abstract class DrawFruit extends TimerTask { 
private JFrame jFrame; 
private Graphics g; 
private int x; 

public JFrame getJFrame() { 
    return jFrame; 
} 

public void setJFrame(JFrame jFrame) { 
    this.jFrame = jFrame; 
} 

public Graphics getG() { 
    return g; 
} 

public void setG(Graphics g) { 
    this.g = g; 
} 

public int getX() { 
    return x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public DrawFruit(JFrame frame , Graphics g , int x){ 
    setJFrame(frame); 
    setG(g); 
    setX(x); 
} 


@Override 
public void run() { 

} 

}

+0

欢迎来到Stack Overflow!寻求调试帮助的问题(“为什么这个代码不工作?”)必须在问题本身中包含所需的行为,特定的问题或错误以及必要的最短代码**。没有明确问题陈述的问题对其他读者无益。请参阅:[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

你在做什么会导致问题的发展......基于计时器的解决方案对于动画循环来说是一个天真的实现。我强烈建议您查看** Delta-Time循环**,以及它们为什么用于动画。 – XenoRo

回答

1

你不应该使用循环的代码。定时器的一点是它取代了循环。一个定时器所做的就是在指定的时间间隔内生成一个事件。所以当事件产生时,只需调整“Y”值并重新绘制组件。

但是,你不应该为此使用TimerTask。

摆动部件应在Event Dispatch Thread (EDT)上更新。因此您应该使用Swing Timer。阅读本教程以获取有效的示例,帮助您入门。