私は Java で 2D ゲームを作成しています。KeyListener といくつかのブール値を使用して、キーの押下を検出しました。しかし、問題は、キーを押したままにすると、プレーヤーが 0.5 秒間動かなくなり、その後動き出すことです。これを修正する方法を知っている人はいますか?
public void keyPressed(...) { PlayerX += 3; ありがとうございます。
私は Java で 2D ゲームを作成しています。KeyListener といくつかのブール値を使用して、キーの押下を検出しました。しかし、問題は、キーを押したままにすると、プレーヤーが 0.5 秒間動かなくなり、その後動き出すことです。これを修正する方法を知っている人はいますか?
public void keyPressed(...) { PlayerX += 3; ありがとうございます。
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;
}
これで、特定のキーが押された場合にアクセスできるクラスができましたが、最初に、keys.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];
}
これで、このクラスがすべてのkeyBindingを処理し、Canvasまたはその上で実行されているゲームにKeyListenerを追加すると、それに応じてKey.up / down / left / right/specialが機能して変更されます。
最後のステップは、これらすべてを実装して、キャラクターを効率的かつ簡単に動かすことです。
ゲーム内のエンティティに、すべてのティックなどを実行するupdate()メソッドがあると仮定します。これで簡単に追加できます。
if(Key.up.isDown) y+=3;
または、あなたの場合、それをメインクラスに入れて、ゲームのティックループにある限り同じ方法で実行できます。
if(Key.right.isDown) PlayerX += 3;
これは、OSで押されたキーのリピート(自動リピート)の通常の動作のように聞こえます。テキストエディタでキーを押したままにしてみると、最初の文字が表示されてから次の文字が表示されるまでに少し時間がかかることがわかります。Windowsではこれは500ミリ秒ですが、他のプラットフォームではわかりません。