Yet another KeyListener/KeyBinding Issue

匿名 (未验证) 提交于 2019-12-03 02:43:01

问题:

Ugh, I'm sorry MadProgrammer but I just couldn't get the KeyBinding to work the way I wanted it to :(. But I'll keep looking at some more tutorials till I figure it out. For now though I've stuck to a KeyListener and it works. But now I'm having an issue where p.move(); doesn't actually move the player. All other code I've put in works fine except p.move();. I probably shouldn't be asking this many questions, so if you want me to stop just say so, but the whole SO community is really nice. Again, I'll post the code.

Main class:

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

Board Class:

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

Player Class (This is probably where stuff goes wrong):

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 Class:

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:

The Player that is on the screen is not the same Player you are moving in your KeyInputEvents class...

In Board you create an instance of Player...

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

And in KeyInputEvents you create another one...

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

These two instances are in no way related...

While I'm here, you shouldn't really override paint, but instead, override paintComponent and you should definitely be calling super.paintXxx

Update with a Key Bindings example

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!