Java - 为游戏添加控件的最佳方式

问题描述 投票:0回答:2

我正在用Java制作2D游戏,我使用KeyListener和一些布尔来检测按键。但问题是,当我按住一个键时,玩家不会移动半秒钟,然后开始移动。有谁知道如何解决这一问题?

public void keyPressed(...){PlayerX + = 3;任何答案将不胜感激谢谢。

java 2d keylistener
2个回答
2
投票

在java中有多种方法来处理游戏控件,但我更喜欢的方法是包含一个叫做的类..让我们说“Key.class”

在Key.class里面我们可以:

public class Key{
   // Creating the keys as simply variables
   public static Key up = new Key();
   public static Key down = new Key();
   public static Key left = new Key();
   public static Key special = new Key();

   /* toggles the keys current state*/
   public void toggle(){
       isDown =  !isDown;
   }

   public boolean isDown;
}

现在我们有一个类,如果按下某些键我们可以访问,但首先我们需要确保键.isDown函数将正确切换。我们在实现KeyListener的类中执行此操作。

假设我们有“Controller.class”

package game;
// Importing the needed packages
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.HashMap;

public class Controller implements KeyListener{
//Assigning the variable keys to actual letters
public Controller(Main main){
    bind(KeyEvent.VK_W, Key.up);
    bind(KeyEvent.VK_A, Key.left);
    bind(KeyEvent.VK_S, Key.down);
    bind(KeyEvent.VK_D, Key.right);
    bind(KeyEvent.VK_SPACE, Key.special);
    mainClass = main;
}

@Override
public void keyPressed(KeyEvent e) {
    other[e.getExtendedKeyCode()] = true;
    keyBindings.get(e.getKeyCode()).isDown = true;
}

@Override
public void keyReleased(KeyEvent e) {
    other[e.getExtendedKeyCode()] = false;
    keyBindings.get(e.getKeyCode()).isDown = false;
}

public boolean isKeyBinded(int extendedKey){
    return keyBindings.containsKey(extendedKey);
}

@Override
public void keyTyped(KeyEvent e) {
}


public void bind(Integer keyCode, Key key){
    keyBindings.put(keyCode, key);
}

public void releaseAll(){
    for(Key key : keyBindings.values()){
        key.isDown = false;
    }
}

public HashMap<Integer, Key> keyBindings = new HashMap<Integer, Key>();
public static boolean other[] = new boolean[256];

}

现在这个类将为我们处理所有的keyBindings,并假设你为Canvas添加了KeyListener或者你的游戏正在运行它将运行并相应地改变Key.up / down / left / right / special。

现在最后一步是将所有这些实现为高效,轻松地移动我们的角色。

假设游戏中的实体具有update()方法,这些方法运行每个tick或类似的东西..我们现在可以简单地添加到它中

if(Key.up.isDown) y+=3;

或者在你的情况下,我们可以把它放到主类中,只要它在游戏滴答循环中就可以这样做。

if(Key.right.isDown) PlayerX += 3;

1
投票

这听起来像是操作系统中按下的键重复(自动重复)的正常行为。只需在任何文本编辑器中按住一个键,您就会注意到第一个字符和下一个字符之间的时间很短。在Windows上,这是500毫秒,在其他平台上不确定。

© www.soinside.com 2019 - 2024. All rights reserved.