标题:键盘输入导致的运动延迟问题??!!
只看楼主
999hits
Rank: 1
等 级:新手上路
威 望:1
帖 子:227
专家分:0
注 册:2005-10-2
 问题点数:0 回复次数:17 
键盘输入导致的运动延迟问题??!!
我先引用一下前几天的经典的乌龟程序:

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 延迟 
2006-10-17 21:25
999hits
Rank: 1
等 级:新手上路
威 望:1
帖 子:227
专家分:0
注 册:2005-10-2
得分:0 
我的想法就是,只要你按住移动键,乌龟就会一直运动,而中间不会延迟或暂停

J3D的摸瞎人
2006-10-17 22:01
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
这就需要你不要乱调用repaint方法了,它是全屏重画,这是比较耗性能的
所以,你就计算好你的乌龟在哪里,把它附近重绘一下就可以了
你要知道,键盘的按下后,它的press事件会连续发生的非常快

可惜不是你,陪我到最后
2006-10-18 09:22
999hits
Rank: 1
等 级:新手上路
威 望:1
帖 子:227
专家分:0
注 册:2005-10-2
得分:0 
那如果我的程序做的很大,画面上需要重画的东西特别多,也就是说我必须全屏重绘,那么我们用来交互的时候该怎样修改运动延迟问题啊

J3D的摸瞎人
2006-10-18 12:56
禹_二
Rank: 1
等 级:新手上路
帖 子:661
专家分:0
注 册:2006-9-13
得分:0 
我也想知道,版主快点帮帮忙.

2006-10-19 11:19
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
那也可以,那就需要设置不要经常重绘
比如你以前是10毫秒重绘一次,你可以改成50毫秒重绘一次
你的之所以会卡,是因为你按着键不放那个速度是很快的
并且键盘事件和重绘事件是共用一个线程的
所以会等键盘事件结束后才会产生重绘事件

可惜不是你,陪我到最后
2006-10-19 11:23
禹_二
Rank: 1
等 级:新手上路
帖 子:661
专家分:0
注 册:2006-9-13
得分:0 
除了重绘repaint(),就没有其他解决的办法么,比如我要修改keyPressed()方法,在里面添加一个计时器线程等的其他方法啊??!!
版主棒棒忙,写的详细一点

2006-10-19 18:03
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 

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


可惜不是你,陪我到最后
2006-10-20 09:37
999hits
Rank: 1
等 级:新手上路
威 望:1
帖 子:227
专家分:0
注 册:2005-10-2
得分:0 
除了修改调用repaint()的时间,还有其他方法没??!!

J3D的摸瞎人
2006-10-21 09:26
999hits
Rank: 1
等 级:新手上路
威 望:1
帖 子:227
专家分:0
注 册:2005-10-2
得分:0 
版主,给我们写一段没有延迟的代码加在上面的程序里

J3D的摸瞎人
2006-10-21 16:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-97017-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.124707 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved