0

そこで手続き型生成などでローグライクゲームを作ろうとしているのですが、キャラクターの扱いに困っています。問題は、キーボードでキャラクターを動かしたいときです。座標を変更するだけです。もちろん、それを行う必要がありますが、画面に表示されません。このサイトでいくつかの回答を読みましたが、それは少し役に立ちましたが、問題を完全に解決することはできませんでした.
だから、私が間違っていることに注意してください。ここに少しのコードがあります(長すぎないことを願っています):

public class PanelTest extends JPanel implements KeyListener{


    private static final long serialVersionUID = 1L;
    private Game game;
    private int width, height;
    private int tileSize;

    public PanelTest(Game game, int tileSize) {
        super();

        this.game = game;
        this.tileSize = tileSize;
        this.width = game.getMap().getWidth()*tileSize;
        this.height = game.getMap().getHeight()*tileSize;

        this.addKeyListener(this);

        setPreferredSize(new Dimension(width, height));
        setRequestFocusEnabled(true);
        requestFocus();
        setVisible(true);

    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(int i=0; i < game.getMap().getWidth(); i++){
            for(int j=0; j < game.getMap().getHeight(); j++){
                g.setColor(game.getMap().getColor(i,j));
                g.fillRect(i*tileSize, j*tileSize, tileSize, tileSize);
            }
        }
// print the correct coordinates
        System.out.println(game.getPlayer().getX()+" "+game.getPlayer().getY());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        switch(e.getKeyCode()){
        case(KeyEvent.VK_Z) : game.getPlayer().moveUp();break;
        case(KeyEvent.VK_S) : game.getPlayer().moveDown(); break;
        case(KeyEvent.VK_Q) : game.getPlayer().moveLeft(); break;
        case(KeyEvent.VK_D) : game.getPlayer().moveRight(); break; 
        }
        revalidate();
        repaint();

    }

    public void addNotify() {
        super.addNotify();
        requestFocus();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setBounds(0, 0, 400, 400);

        Map map = MapFactory.createNewEmptyMap();
        RoomMaker rm = new RoomMaker(map.getWidth()/7,map);
        TunnelMaker tm = new TunnelMaker(rm, map);
        rm.carveOut();
        tm.carveOut();
        Room r = rm.getRandomRoom();
        Player p = new Player(map, r.getxCenter(),r.getyCenter());
        Game game = new Game(map,p);

        frame.getContentPane().add(new PanelTest(game, 10));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }


}

あなたが助けてくれることを願っています, ありがとう!

4

1 に答える 1

1

デフォルトでは、JPanel は FlowLayout を使用します。

コードがプレーヤーの位置を変更しているように見えますが、revalidate() を呼び出すと、レイアウト マネージャー コードが呼び出され、コンポーネントの位置が再計算されます。

したがって、ランダムな動きをするゲームでは、null レイアウトを使用する必要があり、revalidate() と repaint() を呼び出す必要はありません。これは、コードが setLocation() メソッドを直接呼び出す責任を負わないためです。

keyListener の使用に関する問題については、キーボードを使用したモーションも参照してください。

setRequestFocusEnabled(true);
requestFocus();
setVisible(true);

上記は必要ありません。true に設定している 2 つのプロパティのデフォルトは true です。コンポーネントが目に見える GUI に表示されていない限り、コンポーネントへのフォーカスを要求することはできないため、そのコードをここに追加しても何も起こりません。また、使用する適切なメソッドは、requestFocus() ではなく、requestFocusInWindow() です。

于 2013-10-27T21:33:52.387 に答える