我声明用java编写我的第一个游戏,我需要一些帮助来改变KeyListener以适合我的游戏。在教程中进行了一些搜索后,我发现了这样的内容:
frame.addKeyListener(new KeyAdapter(){
private boolean[] keys = new boolean[120];
public boolean up , down , left , right;
public void tick() {
up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];
down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];
left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() != KeyEvent.VK_F5) keys[e.getKeyCode()] = true;
tick();
if (up){
yMap+=4;
direction='n';
xInd=0;
}
else if(down){
yMap-=4;
direction='s';
xInd=2;
}
else if(right){
xMap-=4;
direction='e';
xInd=1;
}
else if(left){
xMap+=4;
direction='w';
xInd=3;
}
wait++;
if(wait==5){
yInd++;
wait=0;
}
if(yInd==3)
yInd=0;
cha=sprites[xInd][yInd];
panel.repaint();
}
public void keyReleased(KeyEvent e) {
keys[e.getKeyCode()] = false;
tick();
yInd=0;
cha=sprites[xInd][yInd];
panel.repaint();
}
public void keyTyped(KeyEvent e) {
}
});
然而,在这段代码中,每件事情都很好,角色正确移动精灵是完美的,但它只缺少一件事,我唯一需要的是当我向一个方向移动角色时,让我们说例如,只需单击向上按钮(通常只需要向上移动4个像素即可使其移动),角色应自动完成步行到下一个方格(每个方格为32 * 32像素)。
这里有一个例子,让我说我有的东西就像这张地图:
http://i.stack.imgur.com/I6hwj.jpg
红色的cercle是我想要移动的角色,我需要的是当我按下UP按钮时,红色cercle应该像这样自动进入下一个方块:
http://i.stack.imgur.com/1XPPX.jpg
它不应该留在中间!
我希望我能很好地解释我的问题并抱歉英语不好!
答案 0 :(得分:1)
您可以使用线程(java.lang.Thread)来完成。当玩家按下某个键时,你会启动一个新的线程,该线程将该圈移动1个像素,32次,延迟(Thread#sleep)。你还需要一个变量(flag),你在玩家按下键时设置为true,并在线程结束后设置为false(所以如果玩家开始以疯狂的方式按键,则圆圈将不会开始全部移动可能的方向)。
编辑:好的,这是代码的骨架:
// we react only if the circle is currently not moving
if (!moving) {
moving = true; // can't do new move until circle finishes current one
Thread t = new Thread() {
public void run() {
for (int i = 0; i < 32; i++) {
// move the circle
Thread.sleep(10); // sleep for 10 ms
}
moving = false;
}
}
t.start()
}