当前位置: 代码迷 >> Java相关 >> 键盘输入导致的运动延迟问题??!!
  详细解决方案

键盘输入导致的运动延迟问题??!!

热度:338   发布时间:2006-10-17 21:25:02.0
键盘输入导致的运动延迟问题??!!
我先引用一下前几天的经典的乌龟程序:

import java.awt.*;
import java.awt.event.*;
import java.util.EventListener;
/*打算你按上,乌龟上爬,按下,乌龟下爬。但是一直没有repaint,怎么回事呀,请教下什么地方错了,怎么才能动。*/

public class WuGui{
public static void main(String args[]){
Frame f = new Frame();
f.setSize(1024, 860);
MyPanel m = new MyPanel();
f.add(m);
f.setVisible(true);
}
}

class MyPanel extends Panel implements KeyListener{

int b = 250;//body Y
int h = 200;//head Y
int f1 = 270;//hand F
int f2 = 270;//hand F
int s1 = 400;//hang S
int s2 = 400;//hang S
int ey = 220; boolean a = true;
public MyPanel(){
this.addKeyListener(this);
}
public void paint(Graphics g){
//super.paint(g);
g.setColor(Color.BLUE); /* draw backGround begin*/
g.fillRect(1,1,1024,860);
g.setColor(Color.GREEN);
g.fillOval(330,b,140,200); /* draw body */
g.fillOval(370,h,60,100);
g.setColor(Color.BLACK);
g.fillOval(370,ey,10,10);
g.fillOval(420,ey,10,10); /* draw head */
g.setColor(Color.GREEN);
g.fillOval(310,f1,70,30); /* draw left up */
g.fillOval(310,s1,70,30); /* draw left down */
g.fillOval(420,f2,70,30); /* draw right up*/
g.fillOval(420,s2,70,30); /* draw right down*/

}

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
// TODO: Add your code here

if(KeyEvent.VK_UP == e.getKeyCode())
{
if(a == true)
{
a = false;
f1=f1-10;
s2=s2-10;
b=b-5;
h=h-5;
ey=ey-5;
}else{
a = true;
f2=f2-10;
s1=s1-10;
b=b-5;
h=h-5;
ey=ey-5;
}
repaint();
}
if(KeyEvent.VK_DOWN == e.getKeyCode())
{
if(a == true)
{
a = false;
f2=f2+10;
s1=s1+10;
b=b+5;
h=h+5;
ey=ey+5;
}else{
a = true;
f1=f1+10;
s2=s2+10;
b=b+5;
h=h+5;
ey=ey+5;
}
repaint();
}



}

public void keyReleased(KeyEvent e) {
}

}
大家运行时候一定会发现,当你持续按住up或down键时候,乌龟先移动一点,然后暂停一下,最后才持续运动,各位有没有办法让乌龟持续运动,而没有延迟
搜索更多相关的解决方案: 键盘  import  java  awt  延迟  

----------------解决方案--------------------------------------------------------
我的想法就是,只要你按住移动键,乌龟就会一直运动,而中间不会延迟或暂停

----------------解决方案--------------------------------------------------------
这就需要你不要乱调用repaint方法了,它是全屏重画,这是比较耗性能的
所以,你就计算好你的乌龟在哪里,把它附近重绘一下就可以了
你要知道,键盘的按下后,它的press事件会连续发生的非常快

----------------解决方案--------------------------------------------------------
那如果我的程序做的很大,画面上需要重画的东西特别多,也就是说我必须全屏重绘,那么我们用来交互的时候该怎样修改运动延迟问题啊
----------------解决方案--------------------------------------------------------
我也想知道,版主快点帮帮忙.
----------------解决方案--------------------------------------------------------
那也可以,那就需要设置不要经常重绘
比如你以前是10毫秒重绘一次,你可以改成50毫秒重绘一次
你的之所以会卡,是因为你按着键不放那个速度是很快的
并且键盘事件和重绘事件是共用一个线程的
所以会等键盘事件结束后才会产生重绘事件

----------------解决方案--------------------------------------------------------
除了重绘repaint(),就没有其他解决的办法么,比如我要修改keyPressed()方法,在里面添加一个计时器线程等的其他方法啊??!!
版主棒棒忙,写的详细一点
----------------解决方案--------------------------------------------------------

效果都一样,都是不要调用太多次的repaint方法,因为这个方法会全屏重绘


----------------解决方案--------------------------------------------------------
除了修改调用repaint()的时间,还有其他方法没??!!

----------------解决方案--------------------------------------------------------
版主,给我们写一段没有延迟的代码加在上面的程序里
----------------解决方案--------------------------------------------------------