Question

I want to, when i click the "d" button, start a timer. This is to animate a player walking. The timer doesn't start when i press the key, how do i do that?

The code I have is this:

public class Game extends JPanel implements KeyListener {
//Player variables
private BufferedImage playerStanding;
private BufferedImage playerWalking;
private BufferedImage playerFrame;
private boolean walking = false;
private final int PLAYER_HEIGHT = 100;
private final int PLAYER_WIDTH = 100;
private final int INITIAL_X = 0;
private final int INITIAL_Y = 500;
private int x = INITIAL_X;
private int y = INITIAL_Y;
//The timer I want to start on keypress-> "d"
private Timer playerAnimationTimer;



public Game() {
    setPreferredSize(new Dimension(800, 800));
    setBackground(Color.CYAN);
    //Player
    try {
        playerStanding = ImageIO.read(getClass().getResource("player1.gif"));
        playerWalking = ImageIO.read(getClass().getResource("player2.gif"));
        playerFrame = playerStanding;


    }
    catch (IOException ex) {
        ex.printStackTrace();
    }

    playerAnimationTimer = new Timer(500, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            walking = !walking;
            playerFrame = walking ? playerWalking : playerStanding;
            x += 10;
            if (x > getWidth() - PLAYER_WIDTH) {
                x = INITIAL_X;
            }
            repaint();
        }
    });
    playerAnimationTimer.setRepeats(true);
}

public Dimension setPreferredSize() {
    return new Dimension(800, 800);
}



@Override
public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);

    Graphics2D graphics2D = (Graphics2D) graphics;
    if (playerFrame != null) {
        graphics2D.drawImage(playerFrame, x, y, PLAYER_WIDTH, PLAYER_HEIGHT, this);
    }


    graphics2D.dispose();
}

@Override
public void keyTyped(KeyEvent e) {
    //This doesn't work
    playerAnimationTimer.start();
}

@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {

}
}
//The class to hold the gamepanel
public class StartGame extends JFrame implements ActionListener {
private static JButton startGame = new JButton();

StartGame() {
    setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
    setSize(200, 100);
    setVisible(true);
    setBackground(Color.BLUE);
    setLocationRelativeTo(null);

    startGame.setText("Play!");
    startGame.setSize(100, 25);
    startGame.addActionListener(this);
    add(startGame);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == startGame) {
        this.setVisible(false);
        new GameWindow();
    }
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new StartGame();
        }
    });
}
}

How could I make the timer start when I click the "d" button?

Was it helpful?

Solution

Your KeyListener doesn't work because you never add the KeyListener to anything much less to a component that has focus, which is needed for a KeyListener to work.

I suggest that you instead use Key Bindings as a cleaner safer way to capture the desired key press.

As an aside, never dispose of a Graphics object that is given to you from the JVM.

For a better answer, please edit your code to make it comply with the mcve standard. You should use no images files, and it should compile and run for us unaltered.

OTHER TIPS

You could set the private Timer like you did and start it like this...

public void startTimer(){
   timer.start();
   timer.setRepeats(true);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top