如何模拟连续按键

danielkoo 2003-12-12 02:58:46
在不支持连续按键的手机上如何模拟连续按键呢?用什么方法好呢?
我想应该使用线程把,但不知道具体怎样实现好!
...全文
60 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kylinpro 2003-12-16
  • 打赏
  • 举报
回复
小弟觉得如果是一般应用的话,不一定非要用多线程实现,可以使用类似锁变量的方法至状态的切换,在keypressed时至ture,在keyup时至false。在实际的手机游戏上使用过,感觉还可以
danielkoo 2003-12-13
  • 打赏
  • 举报
回复
谢谢楼上的,之前我自己也实现了连续按键,方法基本上与你的相同。我的方法是不断的销毁和重新生成线程。不过我看了这段代码:public void run()
{
while (true)
{
while (hasRepeat)
{
try
{
PlayG();
Thread.sleep(10);
}
catch (Exception e)
{}
}
}
}
}
让我受益匪浅,此方法好多了!真的十分感激:)
itfly 2003-12-12
  • 打赏
  • 举报
回复
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class KzYxPlay extends Canvas implements CommandListener,Runnable
{
private MIDlet midlet;
private Command cmExit;
private Image fj,Dj,zd,d_zd;
private Image BzT[] = new Image[3];//爆炸的图片
public int fj_x,fj_y,zd_y,zd_x,zd_yy,w_zd,df_zd,zd_x1;
private boolean fd=false;
private boolean hasRepeat;
private int gameAction;
private Timer repeatTimer;
private Thread thread;
private RepeatTask task;
private Random var;
public KzYxPlay(MIDlet midlet)
{
this.midlet=midlet;
cmExit= new Command("退出",Command.SCREEN,1);
addCommand(cmExit);
setCommandListener(this);
try
{
fj=Image.createImage("/fj.png");
BzT[0]=Image.createImage("/bz1.png");
BzT[1]=Image.createImage("/bz2.png");
BzT[2]=Image.createImage("/bz3.png");
Dj=Image.createImage("/dj.png");
zd=Image.createImage("/zd.png");
d_zd=Image.createImage("/d_zd.png");
}
catch(Exception e){}
fj_x=getWidth()/2;
fj_y=getHeight()-fj.getHeight();
w_zd=fj_y;
var = new Random();
thread = new Thread(this);
thread.start();
task = new RepeatTask();
repeatTimer = new Timer();
if(zd_x<=0&&zd_x1==0)
{
zd_x=30;
zd_x1=60;
}

}
public void showNotify()
{
repeatTimer.schedule(task,0);
}

public void paint(Graphics g)
{
g.setColor(0xffffff);
g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(fj,fj_x,fj_y,0x10|0x04);
//for(int i=0;i<2;i++)
//{
if(zd_y<=getHeight())
{
g.drawImage(Dj,zd_x,zd_y,0x10|0x04);
g.drawImage(Dj,zd_x1,zd_y,0x10|0x04);
if(zd_yy<getHeight()&&zd_y<fj_y-25)
{
g.drawImage(d_zd,zd_x,zd_yy,0x10|0x04);
g.drawImage(d_zd,zd_x1,zd_yy,0x10|0x04);
zd_yy=(zd_yy+10);
}
else
{
zd_yy=zd_y;
}
zd_y+=3;
}
else
{
zd_x=Math.abs(var.nextInt())%getWidth();
zd_x1=Math.abs(var.nextInt())%getWidth();
if(Math.abs(zd_x-zd_x1)<d_zd.getWidth())
{
if(zd_x>zd_x1)
{
if(zd_x1+30>getWidth())
{
zd_x=zd_x1-30;
}
else
{
zd_x=zd_x1+30;
}
}
else
{
if(zd_x+30>getWidth())
{
zd_x1=zd_x+30;
}
else
{
zd_x1=zd_x-30;
}
}
}
zd_y=0;
}
// }
if(fd==true)
{
g.drawImage(zd,fj_x,w_zd,0x10|0x04);
g.drawImage(zd,fj_x+20,w_zd,0x10|0x04);
w_zd=w_zd-10;
if(w_zd<0)
{
w_zd=fj_y;
fd=false;
}
}

}
public void commandAction(Command c,Displayable d)
{
if(c==cmExit)
{
((KzYx)midlet).exitApp();
}
}
protected void keyRepeated(int keyCode)
{
gameAction=getGameAction(keyCode);
}
protected void keyPressed(int keyCode)
{
gameAction = getGameAction(keyCode);
hasRepeat = true;
}
protected void keyReleased(int keyCode)
{
hasRepeat = false;
}
public void PlayG()
{
switch(gameAction)
{
case LEFT:
if(fj_x>0)
fj_x-=3;
break;
case RIGHT:
if(fj_x<getWidth())
fj_x+=3;
break;
case UP:
if(fj_y>0)
fj_y-=3;
break;
case DOWN:
if(fj_y<getHeight())
fj_y+=3;
break;
case FIRE:
fd=true;
break;
}
repaint();
}
public void run()
{
while(true){
repaint();
try
{
Thread.sleep(10);
}
catch(InterruptedException interruptedexception) { }
}
}

class RepeatTask extends TimerTask
{
public void run()
{
while (true)
{
while (hasRepeat)
{
try
{
PlayG();
Thread.sleep(10);
}
catch (Exception e)
{}
}
}
}
}

}
我写的PAINT的部分乱写的,不多实现了重复按键的。你可以参考一下。我也参考了一位网友的游戏。!希望对你有帮助!

13,097

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧