最近在学java,做了一个俄罗斯方块小游戏,但是遇到一点小问题,就是,如果线程 sleep 时间过长,按键就反应迟钝,如果过短,游戏就没法玩了,请教高手怎么解决啊

解决方案 »

  1.   

    如果线程 sleep 时间过长,按键就反应迟钝,如果过短,游戏就没法玩了
    你可以设置下睡眠的时间啊  你应该设置的时间都在两端了 还有仔细检查下你的线程
      

  2.   

    你需要定时控制的应该只有方块的自动下落这个算法而已下落算法写在一个线程或者定时器中每多少秒下落一次,并repaint平时有操作时也repaint这样就不会有什么反应慢的问题听你这么形容,你肯定是只有下落时才repaint了
      

  3.   

    你可能是把事件响应部分代码放到了Swing的EDT(事件处理线程)中了,这是不合理的,这种情况会导致你所说的响应迟钝。你应该另起一个线程专门处理。具体可以去搜索
    SwingWorker EDT
      

  4.   

    3楼说的像点,我也不太明白,这是我重绘线程的代码
    private class PaintThread implements Runnable {
    GameFace gf;

    PaintThread(GameFace gf) {
    this.gf = gf;
    }

    public void run() {
    while(true) {
    //此处产生一个新的 block
    gf.repaint();
    if(!gf.getBlock().fallDown()) {
    gf.fullDelete();
    gf.getBlock().reset();
    }
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }//class PaintThread
    你看下有问题么
      

  5.   

    private class PaintThread implements Runnable {
    GameFace gf;

    PaintThread(GameFace gf) {
    this.gf = gf;
    }

    public void run() {
    while(true) {
    //此处产生一个新的 block
    gf.repaint();
    if(!gf.getBlock().fallDown()) {
    gf.fullDelete();
    gf.getBlock().reset();
    }
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }//class PaintThread
      

  6.   

    GameFace 继承 Canvas,
    fallDown()是下落,当不能下落时,返回false
    而且消去满行,产生下一个新块,按键迟钝应该不是完全是sleep时间长短的问题,我是先读了别人的代码写的,他sleep(1000),时,就不迟钝,很灵敏
      

  7.   

    建议在run方法内,用System.currentTimeMills()方法打印下各条语句耗时情况。然后根据结果有的放矢地分析。
    另外多线程处理不当的情况下也有可能导致你说的问题。
     gf.repaint();
     if(!gf.getBlock().fallDown()) {
            gf.fullDelete();
            gf.getBlock().reset();
     }
    比如上面repaint如果是完全重绘,那么就是个耗时比较长的线程(repaint方法调用肯定要重启一个线程的)。fallDown方法判断是否还可以落下,如果判断的算法效率不高的话,也要消耗不少时间。还有fullDelete和reset方法都有可能要耗不少时间。假设他们各在各的线程(注意我只是假设,实际情况我没看完整代码,所以不能确定)里,那么你不能保证程序实际执行顺序是按照上面语句的先后顺序执行。即先执行完重绘线程,再fallDown,再..。
    这样4个线程(我假设是4个线程,且这4个线程运行时间分别为t1、t2、t3、t4)如果还共享某些变量的话,而你又未对这些共享变量进行同步互斥处理,可能会出现线程间的资源竞争问题,这样实际运行时间就不是t1+t2+t3+t4,而是大于t1+t2+t3+t4,就可能导致你说的反应迟钝问题了。
      

  8.   

    哈哈,3 楼说的方法管用,我在每个键盘监听,调用完移动的函数后,加了一个repaint(),就不迟钝了,但不知道这种写法规不规范,
    谢谢 3 楼啊,
    也非常感谢 4楼的热心解答,我学到了很多新东西其实前两天用3楼的方法搞定了,但论坛不让连续回复3次