1

私はゲームをコーディングしており、Java の Swing を使用しています。そして今、私は KeyListeners と Action リスナーを動作させようとしています。

私がやろうとしているのは、押しているキーに応じてオブジェクトを動かすことです。(左、右、上、下)、しかし、何らかの理由で、これらのキーのいずれかを押しても何も起こりませんが、同時に3つ押すと何も起こりません。物体が妙に左に動いている..

したがって、ランナーオブジェクトを作成するクラスのコードは次のとおりです。

import java.awt.*;


public class Runner{
    private int xpos, ypos, base, side;

    public Runner(int b, int h ) {
        base = b;
        side = h;
    }
    public void setPosition(int x, int y){
        xpos = x;
        ypos = y;
    }
    public void view(Graphics g) {
        int x[] = { xpos, xpos-base/2, xpos + base/2};
        int y[] = { ypos, ypos + side, ypos + side };
        g.setColor(Color.lightGray);
        g.fillPolygon( x, y, 3 );
        g.setColor(Color.darkGray);
        g.drawLine(xpos, ypos, xpos, ypos + side);
    }
    public void shoot(Graphics g){
        g.setColor(Color.red);
        g.drawLine(xpos,ypos, xpos, 0);
    }
}

そして、これがいまいましいことを実行すると思われるコードです:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class RunningGame extends JPanel implements KeyListener, ActionListener{
    Runner rs;
    int x,y;
    Timer t;
    boolean shot = false;
    boolean left = false, right = false, up = false, down = false;

    public RunningGame() {
        x = 100;
        y = 150;
        rs = new Runner(40,60);
        rs.setPosition(x,y);
        this.addKeyListener(this);
        this.setBackground(Color.black);
        t = new Timer(40, this);
        t.start();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        rs.view(g);
        if(shot) rs.shoot(g);
    }
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == 37) {left = true;}
        if (e.getKeyCode() == 39) {right = true;}
        if (e.getKeyCode() == 38) {up = true;}
        if (e.getKeyCode() == 40) {down = true;}
        if (e.getKeyCode() == 32) {shot = true;}

        rs.setPosition(x,y);
        this.repaint();
}
    public void keyReleased(KeyEvent e){
        if (e.getKeyCode() == 37) left = false;
        if (e.getKeyCode() == 39) right = false;
        if (e.getKeyCode() == 38) up = false;
        if (e.getKeyCode() == 40) down = false;
        if (e.getKeyCode() == 32) shot = false;
        this.repaint();
    }
public void keyTyped(KeyEvent e){}
    public void actionPerformed(ActionEvent e) {
        if (left) {
            if(right){
                right = false;
                x = x - 10; shot = false;
            }
        }
        if (right) {
            if(left){
            left = false;
            x = x + 10; shot = false;
            }
        }
        if (up) {
            if(down){
                down = false;
                y = y - 10; shot = false;
            }
        }
        if (down) {
            if(up){
                up = false;
                y = y + 10; shot = false;
            }
        }
        rs.setPosition(x,y);
        this.repaint();
}

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 300); f.setLocation(100,100);
        f.setTitle("Running");
        RunningGame p = new RunningGame();
        f.add(p); f.setVisible(true);
        p.requestFocus();

    }
}

(これは最終的なコードではなく、宇宙船の例を使用しているだけです。後で別のオブジェクトを使用します。続行する前に KeyListener と ActionListener をテストしたいだけです。)

とにかく、誰かが宇宙船をスムーズに動かすのを手伝ってくれませんか? すべてのキーを解放して別のキーをアクティブにする必要はありませんか? つまり、左を押したままにすると、別のボタンを押すことができるようになります。右を押すと、代わりに宇宙船がその方向に動き始めます。

//MrElephants

4

1 に答える 1

2

次のようなブロックで:

if (left) {
    if(right){
        right = false;
        x = x - 10; shot = false;
    }
}

x = x - 10;私はあなたが2番目の外にあるべきだと思いますif

if (left) {
    if(right){
        right = false;
        shot = false;
    }
    x = x - 10;
}

そのインナーifが何のためにあるのかはよくわかりませんが、完全に削除する必要があるかもしれません(ただし、x-= 10などを維持してください)。これは、動きが自然に見えるようにするのに十分なはずです。

于 2012-04-12T16:17:34.553 に答える