四角形をキーボードのキーで操作する単純なゲームを作成しようとしているときに、ちょっと厄介な問題に遭遇しました。反対の方向キーを押すとキャラクターが停止するように動作させたいと思います。この状況で停止している間、キャラクターは他の 2 つの方向に移動できます。
これは、LEFT と RIGHT を押したままにすると完全に機能します。プレイヤーは上下に移動できます。ただし、UP キーと DOWN キーを押したままにすると、プレーヤーは移動せず、Java は LEFT または RIGHT キーが押されたことを認識しません。
import java.util.ArrayList;
import java.util.Random;
import org.lwjgl.*;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.*;
import static org.lwjgl.opengl.GL11.*;
public class Main {
private Man p;
private ArrayList<Integer> keysDown, keysUp;
public Main() {
try {
Display.setDisplayMode(new DisplayMode(640, 480));
Display.setTitle("LWJGLHelloWorld");
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
p = new Man(0, 0);
keysDown = new ArrayList<>();
keysUp = new ArrayList<>();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 640, 480, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT);
checkKeys();
p.draw();
Display.update();
Display.sync(60);
}
Display.destroy();
}
public void checkKeys() {
ArrayList<Integer> keys = new ArrayList<>();
keys.add(Keyboard.KEY_A);
keys.add(Keyboard.KEY_D);
keys.add(Keyboard.KEY_W);
keys.add(Keyboard.KEY_S);
for (int key : keys) {
if (Keyboard.isKeyDown(key))
keysDown.add(key);
else
keysUp.add(key);
}
keysDown.removeAll(keysUp);
keysUp = new ArrayList<>();
int speed = 4;
int dx = 0;
int dy = 0;
if (keysDown.contains(keys.get(2))) {
System.out.println("keyUP");
dy -= speed;
}
if (keysDown.contains(keys.get(3))) {
System.out.println("keyDOWN");
dy += speed;
}
if (keysDown.contains(keys.get(0))) {
System.out.println("keyLEFT");
dx -= speed;
}
if (keysDown.contains(keys.get(1))) {
System.out.println("keyRIGHT");
dx += speed;
}
//if (keysDown.contains(keys.get(0)) && keysDown.contains(keys.get(1))) dx = 0;
//if (keysDown.contains(keys.get(2)) && keysDown.contains(keys.get(3))) dy = 0;
p.update(dx, dy);
}
public static void main(String[] args) {
new Main();
}
class Man {
public int x, y, w, h;
public float cR, cG, cB;
public Man(int x, int y) {
this.x = x;
this.y = y;
w = 50;
h = 50;
Random rand = new Random();
cR = rand.nextFloat();
cG = rand.nextFloat();
cB = rand.nextFloat();
}
public void draw() {
glColor3f(cR, cG, cB);
glRecti(x, y, x+w, y+h);
}
public void update(int dx, int dy) {
x += dx;
y += dy;
}
}
}
それが私が取り組んでいるコードです。さらに、slick-util に加えて lwjgl ライブラリを使用している実行可能 jar をコンパイルする方法がわかりません。
編集:現在のセットアップであることに言及するのを忘れていました:ASDW、それには問題があります。JKLI と LEFT RIGHT UP DOWN でもこれらの問題を経験しました。行内のキー (例: ASDF) に変更すると、期待どおりに機能します。