又一个KeyListener / KeyBinding问题

时间:2013-10-15 06:48:38

标签: java swing math 2d keylistener

呃,我很抱歉MadProgrammer,但我无法让KeyBinding以我想要的方式工作:(但是我会继续看一些教程,直到我弄明白。现在虽然我已经坚持使用KeyListener并且它可以工作。但现在我遇到了一个问题,其中 p.move(); 实际上并没有移动播放器。我放入的所有其他代码都可以正常工作除了 p.move(); 。我可能不应该问这么多问题,所以如果你想让我停下来就这么说,但整个SO社区真的很好。再说一次,我ll发布代码。

主要课程:

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;
boolean moving;

public Board() {

    setFocusable(true);
    requestFocus();

    addKeyListener(new KeyInputEvents());

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

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

    p = new Player();

}

public void paint(Graphics g) {
    g.drawImage(background, 0, 0, null);
    g.drawImage(p.getPlayer(), p.getX(), p.getY(), null);
}

public void actionPerformed(ActionEvent e) {
    repaint();
}
public JPanel getBoard(){
    return this;
}
)

玩家类(这可能是出错的地方):

import javax.swing.*;
import java.awt.*;
public class Player{
int x = 30;
int y = 187;
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;
    this.y += y;
}
public int getX(){
    return x;
}
public int getY(){
    return y;
}
)

KeyInputEvents类:

import java.awt.event.*;

import javax.swing.*;

public class KeyInputEvents extends KeyAdapter implements ActionListener{
int k;
boolean moving = true;
Player p = new Player();
public KeyInputEvents(){
    Timer timer = new Timer(25,this);
    timer.start();
}
public void keyPressed(KeyEvent e){
    k = e.getKeyCode();
    moving = true;
}
public void keyReleased(KeyEvent e){
    moving = false;
}
public void actionPerformed(ActionEvent e) {
    if(k == 'D' && moving == true){p.move(5,0);}
    if(k == 'A' && moving == true){p.move(-5,0);}
}

}

1 个答案:

答案 0 :(得分:1)

屏幕上显示的PlayerPlayer课程中移动的KeyInputEvents不一样......

Board中,您创建了Player ...

的实例
public class Board extends JPanel implements ActionListener {
    Player p;
    public Board() {
        //...
        p = new Player();
    }

KeyInputEvents中你创建另一个......

public class KeyInputEvents extends KeyAdapter implements ActionListener {
    //....
    Player p = new Player();

这两个实例没有任何关系......

虽然我在这里,但你不应该真的覆盖paint,而应覆盖paintComponent,你绝对应该调用super.paintXxx

使用密钥绑定示例进行更新

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;

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);

    }

    public class Board extends JPanel implements ActionListener {

        Image background;
        Player p;
        private int xDelta, yDelta;

        public Board() {

            setFocusable(true);
            requestFocus();

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

            p = new Player();

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "Left.move");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "Left.stop");

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "Right.move");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "Right.stop");

            ActionMap am = getActionMap();
            am.put("Left.move", new MoveLeft(this));
            am.put("Left.stop", new StopAllMovement(this));
            am.put("Right.move", new MoveRight(this));
            am.put("Right.stop", new StopAllMovement(this));

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

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
            g.drawImage(background, 0, 0, null);
            g.drawImage(p.getPlayer(), p.getX(), p.getY(), null);
        }

        protected void setMovement(int xDelta, int yDelta) {
            this.xDelta = xDelta;
            this.yDelta = yDelta;
        }

        public void actionPerformed(ActionEvent e) {
            p.move(xDelta, yDelta);
            repaint();
        }

        public JPanel getBoard() {
            return this;
        }

    }

    public class Player {

        int x = 30;
        int y = 187;
        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;
            this.y += y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
    }

    public abstract class AbstractMove extends AbstractAction {

        private Board board;
        private int xDelta;
        private int yDelta;

        public AbstractMove(Board board, int xDelta, int yDelta) {
            this.board = board;
            this.xDelta = xDelta;
            this.yDelta = yDelta;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            board.setMovement(xDelta, yDelta);
        }

    }

    public class MoveLeft extends AbstractMove {

        public MoveLeft(Board board) {
            super(board, -5, 0);
        }

    }

    public class MoveRight extends AbstractMove {

        public MoveRight(Board board) {
            super(board, 5, 0);
        }

    }

    public class StopAllMovement extends AbstractMove {

        public StopAllMovement(Board board) {
            super(board, 0, 0);
        }

    }

}