1

プログラミングを次のステップであるゲームの作成に移す時が来たと判断しました。これまでのところ、私はすべてを問題なくコーディングすることができました。あまり慣れていないものをグーグルで検索する必要があるかもしれませんが、うまくいくはずだと感じています。グラフィックはペイントされており、すべてが素晴らしくダンディですが、キー リスナーに関しては、そこが問題でした。Key Listener を実装する内部クラスを作成し、それを Board コンストラクターに追加しました。コードを確認する必要があると思いますが、かなり長くて少し面倒です。これは初めてのことなので、おそらく不要なものもあれば、本当に明白なことを忘れているだけかもしれません。

メインクラス:

import javax.swing.*;

public class Game extends JFrame{
public static void main(String[] args){
    new Game();
}
public Game(){

    add(new Board());

    setTitle("Hi mom");
    setSize(555,330);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(3);
    setVisible(true);
}
}

ボード クラス:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Board extends JPanel implements ActionListener {

Image background;
Player p;
int k;
boolean moving;

public Board() {

    setFocusable(true);

    Timer timer = new Timer(25, this);
    timer.start();

    ImageIcon img = new ImageIcon(getClass().getResource("images/map.png"));
    background = img.getImage();

    addKeyListener(new Kl());

    p = new Player();

}

public void paint(Graphics g) {
    g.drawImage(background, 0, 0, null);
    g.drawImage(p.getPlayer(), p.setX(30), p.setY(187), null);
}

public void actionPerformed(ActionEvent e) {

    if (k == 'W' && moving == true) {
        p.move(0,-5);
    }
    if (k == 'S' && moving == true) {
        p.move(0,5);
    }
    if (k == 'D' && moving == true) {
        p.move(5,0);
    }
    if (k == 'A' && moving == true) {
        p.move(-5,0);
    }

    repaint();
}

public class Kl implements KeyListener {
    public void keyPressed(KeyEvent e) {
        k = e.getKeyCode();
        moving = true;
    }

    public void keyReleased(KeyEvent e) {
        moving = false;
    }

    public void keyTyped(KeyEvent e) {
    }

}
}

プレイヤークラス:

import javax.swing.*;
import java.awt.*;
public class Player{
int x, y;
Image player;
public Player(){
    ImageIcon img = new ImageIcon(getClass().getResource("images/player.png"));
    player = img.getImage();
}
public Image getPlayer(){
    return player;
}
public void move(int x, int y){
    this.x += x;
}
public int setX(int x){
    this.x = x;
    return x;
}
public int setY(int y){
    this.y = y;
    return y;
}
}
4

1 に答える 1

1

問題はKeyListener、登録されているコンポーネントがフォーカス可能で、キーボード フォーカスがある場合にのみ、キー イベントがトリガーされることです。電話をかけるだけでsetFocsuableは不十分です。これは、コンポーネントがキーボード フォーカスを受け取ることができることを意味するだけであり、それを持っていることを意味するわけではありません。

代わりに、とりわけこの制限を克服する手段を持つKey Bindings APIを使用する必要があります。

于 2013-10-15T03:44:48.307 に答える