0

四角形をキーボードのキーで操作する単純なゲームを作成しようとしているときに、ちょっと厄介な問題に遭遇しました。反対の方向キーを押すとキャラクターが停止するように動作させたいと思います。この状況で停止している間、キャラクターは他の 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) に変更すると、期待どおりに機能します。

4

1 に答える 1

1

キーボードのハードウェア制限に直面しています。これについては、こちらの回答で説明しています。

完全な n キー ロールオーバーが可能なので、可能であれば ps/2 の別のキーボードを使用してみてください。

于 2012-07-09T21:44:25.207 に答える