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

Java,未能实现计时器。请帮忙?,java,timer,Java,Timer,我贴了一个问题,得到了一个极好的答案 我接受了他们的建议,并尝试实现一个计时器来让我的Java游戏循环 public static void run() { init(); long lastTime = System.nanoTime(); final double amountOfTicks = 60D; double ns = 1000000000/ amountOfTicks; double

我贴了一个问题,得到了一个极好的答案

我接受了他们的建议,并尝试实现一个计时器来让我的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和其他示例来植入计时器,但是我实现的代码不喜欢它

我所做的是鼠标点击,当你点击一个二维网格阵列时,玩家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)
        {
        }

如果您提供的后一个代码实际上在一个循环中,那么您马上就会遇到问题;如果鼠标不在同一点上,它总是会移动的

其次,最可能的问题是init实际上不是一个静态方法,在这个方法中,您将run称为一个静态方法;这会导致冲突,因为您没有将init显式更改为static,并且静态方法中的所有变量都必须具有静态访问修饰符

如果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);

 }
 }
 `
你说:

我所做的是鼠标点击,当你点击一个二维网格阵列时,玩家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)
        {
        }
这听起来根本不需要游戏循环。你需要的只是一个鼠标听筒,就这样

此外,为了重申我的意见,我担心您在最近的另一个问题中收到的建议不是好的建议,因为他们建议您在Swing应用程序中使用java.util.Timer,这可能很危险。通常最好使用javax.swing.Timer,也称为swing计时器

为了获得更好的建议,您需要提供更多关于您正试图创建的内容的详细信息

编辑 你说:


我想刷新我的Jpanel,让它看起来好像正方形正在移动到那个位置


所以,在鼠标侦听器中这样做。

你现在的问题不是让计时器工作,而是让代码编译。您不应该尝试运行未编译的代码。首先尝试修复编译问题,然后尝试运行它,然后再处理程序的逻辑问题。查找该错误消息,因为它非常常见,您会发现类似的问题和解决方案:不要尝试对类调用非静态方法。对一个对象,一个实例调用它。@hovercraftfullofels对不起,我对Java很陌生,你是什么意思?这段代码应该做什么?我不太确定您在最近的另一个问题中收到的建议是否是好的建议,因为他们建议您在Swing应用程序中使用java.util.Timer,这可能很危险。通常最好使用javax.swing.Timer,也称为swing计时器。卡地亚,谢谢。但我的代码实现类似于这个公共类CbabyBall扩展了JFrame实现了KeyListener、ActionListener和ChangeListener{我个人认为你应该基于监听器创建一个变量,然后将它们添加到你的jframe中,我也会将其作为一个变量,同时从你的主类扩展jpanel…但这不是破坏了子类和超级类的整个对象吗?我应该删除执行计时器的代码吗?我有太多错误。M无法解决d m.run;@Moynul:一点也不。你只在适当的时候和适当的地方使用子类。过度使用和错误使用继承在新手程序中太常见了。我建议你的GUI程序都不要实现侦听器接口,因为你会创建一些试图做得太多的类。我想刷新我的Jpanel,让它看起来像正方形正在向那个位置移动。