-1

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

}
Wumbo4Dayz
  • 75
  • 1
  • 8
  • 1) For better help sooner, post an [SSCCE](http://sscce.org/). 2) One way to get image(s) for an example is to hot-link to the images seen in [this answer](http://stackoverflow.com/a/19209651/418556). – Andrew Thompson Oct 15 '13 at 06:55
  • The problem is though since I don't know the error, I don't know what to take out. I may take out something that is involved with the error. – Wumbo4Dayz Oct 15 '13 at 06:58
  • *"I may take out something that is involved with the error."* Odd, the SSCCE document explicitly mentions that possibility. Did you *read* it? – Andrew Thompson Oct 15 '13 at 07:08
  • BTW - which member of Led Zeppelin are you? Of the 3 remaining, I don't remember one going by the name 'Wumbo'.. – Andrew Thompson Oct 15 '13 at 07:10
  • @Wumbo4Dayz, so did you read the link I provided you in your last question? It gives working examples. – camickr Oct 15 '13 at 15:51

1 Answers1

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

    }

}
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366