Java: Moving second rectangle using different keys

2019-09-07 04:16发布

I am making a little program where two rectangles drive around a race car track. When I run the program everything goes as planned and I can move the black rectangle around the track using the arrow keys. If I want to move the red rectangle using W,A,S,D, what should I do?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class first extends JLabel implements ActionListener, KeyListener {

Timer t = new Timer(5, this);
double x = 0, y = 25, velx = 0, vely = 0;


public first() {
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

public static void main(String[] args) {
    JLabel jl = new JLabel();
    JPanel jp = new JPanel();
    JFrame f = new JFrame();
    first m = new first();

    f.add(m);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(1650,1080);
    f.setExtendedState(JFrame.MAXIMIZED_BOTH);

    //The image below is a race car track I drew in Microsoft Paint
    jl.setIcon(new ImageIcon("C:\\Users\\Jack\\Pictures\\JavaImages\\racetrack2.png"));

    f.add(jp);
    jp.add(jl);

    f.validate();
}

public void paintComponent (Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;     
    g2.setColor(Color.RED);
    g2.fill(new Rectangle2D.Double(0, 80, 90, 50));

    g2.setColor(Color.BLACK);
    g2.fill(new Rectangle2D.Double(x, y, 90, 50));
}


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

public void up() {
    vely = -3.5;
    velx = 0;
}

public void down() {
    vely = 3.5;
    velx = 0;
}

public void left() {
    velx = -4.5;
    vely = 0;
}

public void right() {
    velx = 4.5;
    vely = 0;
}

/*public void upStopped() {
    velx = 0;
    vely = 0;
}

public void downStopped() {
    velx = 0;
    vely = 0;
}

public void leftStopped() {
    velx = 0;
    vely = 0;
}

public void rightStopped() {
    velx = 0;
    vely = 0;
}*/

public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_UP) {
        up();
    }
    if(code == KeyEvent.VK_DOWN) {
        down();
    }
    if(code == KeyEvent.VK_LEFT) {
        left();
    }
    if(code == KeyEvent.VK_RIGHT) {
        right();
    }

    if(code == KeyEvent.VK_W) {

    }
    if(code == KeyEvent.VK_S) {

    }
    if(code == KeyEvent.VK_A) {

    }
    if(code == KeyEvent.VK_D) {

    } 
}

public void keyReleased(KeyEvent e) {
    /*int code2 = e.getKeyCode();
    if(code2 == KeyEvent.VK_UP) {
        upStopped();
    }

    if(code2 == KeyEvent.VK_DOWN) {
        downStopped();
    }

    if(code2 == KeyEvent.VK_LEFT) {
        leftStopped();
    }

    if(code2 == KeyEvent.VK_RIGHT) {
        rightStopped();
    }*/
}

public void keyTyped(KeyEvent e) {}

}

1条回答
啃猪蹄的小仙女
2楼-- · 2019-09-07 05:00

I can move the black rectangle around the track using the arrow keys. If I want to move the red rectangle using W,A,S,D, what should I do?

  1. Use Key Bindings not a KeyListener.
  2. You also need to use a Timer to start the animation when a key is pressed and stop the animation when a key is released, since events can only be generated for a single key at a time.

Check out Motion Using The Keyboard for more information about the above concepts. The keyboardAnimation code is a complete working example implementing both of the concepts.

查看更多
登录 后发表回答