Java,未能实现计时器。请帮忙吗?

时间:2014-04-29 00:37:32

标签: java timer

我发布了一个问题并获得了工厂的回答。

我接受了他们的建议并试图实现一个计时器来让我的Java游戏循环。

    public static void run()
    {
        init();
        long lastTime = System.nanoTime();
        final double amountOfTicks = 60D;
        double ns = 1000000000/ amountOfTicks;
        double delta = 0;

        while(running)
        {
            long now = System.nanoTime();//gets time from pc in nano seconds 
            //tick();//this is the problem, slow computer will slow things down
            delta += (now - lastTime) / ns;
            lastTime = now;
            if(delta >=1)
            {
                tick();//limited to 60 times a second 
                delta--;
            }
            render();//render and draw graphics many times a second// as fast as we can 
        }
        stop();
    }

    public void tick()
    {
        //update all game components
        runTimer();
    }

    public void render()
    {
        //draw the images 
        //first time game runs
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null)//bs equalnothing create 
        {
            createBufferStrategy(3);
            return;//exit render method until called again 
        }

        Graphics g = bs.getDrawGraphics();//paint brush, paints all sorts, draw text lines images etc. paint brush yeah
        //render here i guess
        createGUI();            
        //end the render please
        g.dispose();
        bs.show();


    }

    Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Cannot make a static reference to the non-static method init() from the type           CbabyBall
Cannot make a static reference to the non-static method tick() from the type  CbabyBall
Cannot make a static reference to the non-static method render() from the type CbabyBall
Cannot make a static reference to the non-static method stop() from the type CbabyBall

我已经尝试通过查看oracle和其他示例来植入计时器,但是我实现的代码不喜欢它。

我所拥有的是鼠标点击,当你点击一个网格(2D数组)时,玩家X和Y位置应该到达那个位置。

    private void runTimer()
{

    if(BPOS_X!=MOUSE_X && BPOS_Y != MOUSE_Y){
        if(BPOS_X<MOUSE_X)
        {
            if(MOUSE_X+1==this)
            {
                //moveBallR();
                //moveRight();
                moveUp();
            }
            else
            {
                moveRight();
            }
        }
        if(BPOS_X>MOUSE_X)
        {
            moveLeft();
        }
        if(BPOS_Y<MOUSE_Y)
        {
            moveDown();
        }
        if(BPOS_Y>MOUSE_Y)
        {
            moveUp();
        }
        }
        else if(BPOS_X==MOUSE_X && BPOS_Y == MOUSE_Y)
        {
        }

}

我尝试在循环中捕获它,Eclipse已经崩溃,我太害怕再次尝试循环。

有人可以给我一个治疗之手吗?

    public class CbabyBall extends JFrame

    public KeyListener listenKey;
    public ActionListener listenAction;
    public ChangeListener  listenChange;

2 个答案:

答案 0 :(得分:2)

如果你提供的后一个代码实际上是在一个循环中,你就会立即出现问题;如果鼠标不在同一个地方,它总会移动。

其次,最有可能的问题是init()实际上并不是一个静态方法,你将其称为run one;这会导致冲突,因为您没有明确地将init()更改为静态,静态方法中的所有变量必须具有静态访问修饰符。

如果run不是静态方法,那么我会改变它。你可以改变它的方式是这样的:

class Main {
    public Thread runThread = new Thread() {
        public void run() {
        //Put Code Here...
        }
    }

    public static void main(String args[]) {
         Main m = new Main();
         m.runThread().start();
    }
}

希望这有助于:)

P.S @HoverCraftFullOfEels意味着你不应该专注于你应该做的计时器,确实在你做其他任何事情之前确保你的其余代码有效

P.P.S以下是JPanel扩展的工作原理:

`class mainRun extends JPanel {

 public void paintComponent() {//Code In Here}

 public static void main(String args[]) {
 JFrame frame = new JFrame("Title"); 
 //JFrame Code

 mainRun mr = new mainRun();

 KeyEvent event = new KeyEvent() {
 //Default Code
 }

 frame.add(mr);
 frame.addKeyListener(event);

 }
 }
 `

答案 1 :(得分:2)

你说:

  

我所拥有的是鼠标点击,当你点击一个网格(2D数组)时,玩家X和Y位置应该到达那个位置。

这听起来不像是需要一个游戏循环&#34;一点都不这种行为所需要的只是一个MouseListener,就是这样。

另外,为了重申我的评论,我担心你在最近的另一个问题中收到的建议不是好建议,因为他们建议你使用带有Swing应用程序的java.util.Timer,这可能很危险。通常情况下,最好使用javax.swing.Timer也称为&#34; Swing Timer&#34;。

为了获得更好的建议,您需要提供有关您尝试创建的更多详细信息。


修改
你说:

  

我想要刷新我的Jpanel,让它看起来好像广场正在移动到那个位置。

这样做 - 在MouseListener中。