Java 从另一个类调用图形

Java 从另一个类调用图形,java,graphics,repaint,Java,Graphics,Repaint,我正在尝试创建一个两人游戏,使用键盘输入来移动玩家。到目前为止,当我在自己的职业中测试它时,它是有效的,我可以移动玩家,但当我在游戏职业中调用它时,它不起作用。我在另一门课上也遇到了图形方面的问题。他们出现了,但不动。 我不确定我是说错了还是有什么需要补充的。我想这可能与我如何重新粉刷有关,但我不确定 我在其中绘制不同图形的代码(这在我的游戏类中): 我的一个玩家类的代码: public class PlayerOne extends JPanel implements ActionListen

我正在尝试创建一个两人游戏,使用键盘输入来移动玩家。到目前为止,当我在自己的职业中测试它时,它是有效的,我可以移动玩家,但当我在游戏职业中调用它时,它不起作用。我在另一门课上也遇到了图形方面的问题。他们出现了,但不动。 我不确定我是说错了还是有什么需要补充的。我想这可能与我如何重新粉刷有关,但我不确定

我在其中绘制不同图形的代码(这在我的游戏类中):

我的一个玩家类的代码:

public class PlayerOne extends JPanel implements ActionListener{

    private int x = 10, y = 10, velx = 0, vely = 0;
    public static int healthOne = 200;
    int power = 5;
    Timer tm = new Timer(5, this);
    boolean playing = true;

    public PlayerOne(){
        tm.start();
        InputMap im = getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), "W.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true), "W.released");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), "S.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true), "S.released");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "A.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "A.released");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "D.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "D.released");

        am.put("W.pressed", new MoveAction(-1, 0));
        am.put("W.released", new MoveAction(0, 0));
        am.put("S.pressed", new MoveAction(1, 0));
        am.put("S.released", new MoveAction(0, 0));
        am.put("A.pressed", new MoveAction(0, -1));
        am.put("A.released", new MoveAction(0, 0));
        am.put("D.pressed", new MoveAction(0, 1));
        am.put("D.released", new MoveAction(0, 0));  
    }
    //@Override
    /*public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 30, 30);
        healthbar(g);
    }*/
    public void drawplayer (Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 30, 30);
    }

    public void healthbar (Graphics g){

        g.setColor(Color.GREEN);
        g.fillRect(0, 640, healthOne, 25);
        //health -=20;
        repaint();

    }

    public class MoveAction extends AbstractAction {

        private int yDelta;
        private int xDelta;

        public MoveAction(int yDelta, int xDelta) {
            this.yDelta = yDelta;
            this.xDelta = xDelta;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            vely = yDelta;
            velx = xDelta;
        }
    }    
    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
        x += velx;
        y += vely;

    }
}

新定时器(5,此)可能没有足够的时间来实际绘制任何内容。尝试100毫秒开始,你可以在工作后收紧它。我尝试过,但不起作用。你是否尝试过从一个不做任何绘制的方法调用
repaint
?我发现了我忘记在我的绘制方法中添加repaint的问题。
public class PlayerOne extends JPanel implements ActionListener{

    private int x = 10, y = 10, velx = 0, vely = 0;
    public static int healthOne = 200;
    int power = 5;
    Timer tm = new Timer(5, this);
    boolean playing = true;

    public PlayerOne(){
        tm.start();
        InputMap im = getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), "W.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true), "W.released");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), "S.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true), "S.released");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "A.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "A.released");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "D.pressed");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "D.released");

        am.put("W.pressed", new MoveAction(-1, 0));
        am.put("W.released", new MoveAction(0, 0));
        am.put("S.pressed", new MoveAction(1, 0));
        am.put("S.released", new MoveAction(0, 0));
        am.put("A.pressed", new MoveAction(0, -1));
        am.put("A.released", new MoveAction(0, 0));
        am.put("D.pressed", new MoveAction(0, 1));
        am.put("D.released", new MoveAction(0, 0));  
    }
    //@Override
    /*public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 30, 30);
        healthbar(g);
    }*/
    public void drawplayer (Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 30, 30);
    }

    public void healthbar (Graphics g){

        g.setColor(Color.GREEN);
        g.fillRect(0, 640, healthOne, 25);
        //health -=20;
        repaint();

    }

    public class MoveAction extends AbstractAction {

        private int yDelta;
        private int xDelta;

        public MoveAction(int yDelta, int xDelta) {
            this.yDelta = yDelta;
            this.xDelta = xDelta;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            vely = yDelta;
            velx = xDelta;
        }
    }    
    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
        x += velx;
        y += vely;

    }
}