需要帮助在Java中实现2D游戏的KeyListener

时间:2014-01-11 20:15:57

标签: java

我声明用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

它不应该留在中间!

我希望我能很好地解释我的问题并抱歉英语不好!

1 个答案:

答案 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()
}