本帖最后由 weiminghuaa 于 2012-02-07 22:15:22 编辑

解决方案 »

  1.   

    不触发repaint的话,你的子弹坐标虽然移动了,但容器是不知道啥时候需要重绘的。所以这里直接要求容器每100毫秒重绘一次,虽然暴力点,但是很有效。
      

  2.   

    可以没有前者的repaint只有要有线程的repain其实就可以了。
      

  3.   


    谢谢,我想知道的是:如果不把MyPanel做成线程,即不要第二个repaint。子弹坐标也在变,为什么第一个repaint不起作用?代码在这段:if (e.getKeyCode() == KeyEvent.VK_J)
      {
      this.mytank.fire();//进入调用子弹线程,子弹坐标已经在变
      }
      this.repaint();//这里repaint为什么不起作用?
      

  4.   


    你好,请问第一个repaint就在按J事件处理下面,为什么不会重绘?
      

  5.   


    没说事件处理的repaint不会重绘啊。说的是:如果我开炮后,就啥按钮都不按,你怎么触发重绘?怎么让子弹能够在屏幕上动起来?
      

  6.   

    第二个repaint是必须的,它是控制坦克和子弹的运动,只有不断的重绘,坦克和子弹才能动起来,第一个可以不要,以多线程方式运行的话,第二个repaint一直在执行
      

  7.   

    第一个repaint的作用是让子弹立即显示出来,虽然说第二个repaint一直在执行,但是它有间隔时间,如果间隔时间长的话,第一个 repaint就很重要了,否则你点下射击键子弹不会立即出来,得等到第二个repaint再次执行。上面的程序间隔时间是100毫秒,即使没有第一个repaint子弹也会立即显示出来,如果你把时间改成5000毫秒,你就会知道第一个repaint的重要性了
      

  8.   

    韩老师的视频我也看过,还写过一个类似的,话说键盘监听那里的repaint()是当你按了方向键的时候,每按一次,就会重绘一次,而下面线程里的,则是按照sleep的周期,每隔一定的时间执行一次。
      具体来说,
      1.现在这个游戏的情况就是每隔100毫秒重绘一次,不管你按不按键盘。而当你每按一下键盘,Mypanel会额外重绘一次。
      2.如果只保留键盘监听里的,删掉线程里的repaint(),那么mypanel不会每隔100毫秒重绘一次,但是你按一下键盘依然会重绘,如楼上所说,这时候你发射炮弹,炮弹坐标是一直改变的,但因为没有重绘,所以看不到。如果你发射完炮弹,马上按键盘让你的坦克动起来,这时候mypanel重绘了,你就能看到炮弹了
      3.同样如楼上所说,如果只保留线程中的repaint(),删掉键盘监听中的,没有什么影响,但是估计100毫秒的刷新频率有点低,建议把sleep改成50或者30,看起来比较流畅另外建议LZ不要照着韩老师的写,需要用到的知识点明白了,然后照着教程中所达到的效果,用自己的思路来写,或许思路不太好,写出来的代码不怎么样,但是过程中遇到种种问题,在解决这些问题的过程中的思考我觉得还是很有好处的
        同样作为初学者,LZ我们共同努力呦!
      

  9.   

    多谢各位给力的回复,偶明白了!我账户里只有15分,我就看着给了!也多谢这位兄弟littwo78168218细致的回复和提醒,共同加油!
      

  10.   

    第一次用cdsn,不清楚分数怎么回事,资源页面我的“积分: 15"???