2014-01-11 73 views
-1

我声明在java中编写我的第一个游戏,我需要一些帮助让KeyListener适合我的游戏。在教程一些搜索后我已经imlemented这样的:需要帮助在Java中实现用于2D游戏的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) { 
} 
}); 

但是每一件事情就是在这段代码罚款,字符正确地移动精灵是完美的,但它缺少的只有一件事,我唯一需要的是当我向一个方向移动角色时,让我们说例如UP,只需点击向上按钮(这通常应该使它只有4个像素点向上移动),角色应该完成自动走向下一个方形(每个方格是32 * 32像素)。

这里的为例,可以说我有什么一些事情是这样地图:

http://i.stack.imgur.com/I6hwj.jpg

红色的色格拉是我想招的角色,我需要的是当我按下上升按钮红色色格拉应自动转到下一广场这样的:

http://i.stack.imgur.com/1XPPX.jpg

,它不应该停留在中间!

我希望我解释得很好,我的问题和对英语不好的抱歉!

+1

你有点说的代码应该做的,但到底是什么它目前办?而且,如果你在这个主题上搜索,你肯定发现你根本不应该使用KeyListeners,而是使用Key Bindings。 –

+0

如何使用密钥绑定? – anony50600

+0

谷歌教程。这是非常有用的,是教我如何使用这些。 –

回答

1

你可以使用线程(java.lang.Thread)。当玩家按下一个按键时,您将开始一个新的线程,该线程将延迟(Thread#sleep),将该圆圈移动1个像素,32次。您还需要一个变量(标志),一旦玩家按下按键,您就将其设置为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() 
} 
+0

thx的建议,但我希望你能告诉我如何使用线程在这种情况下,因为我仍然不专业在Java! – anony50600

+0

我尝试过,但仍然不能完美工作,当我点击向上按钮时,它似乎已经被传送到下一个角色而不改变角色间的角色! – anony50600

+0

然后通过发布完整的实际代码 –