如何使用keylistener移动矩形

lf3rwulv  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(202)

我试图移动一个矩形,而按键被按下,并停止释放它像游戏“蛇”。作为参考,我遵循了这个教程。
我试图调整代码中的一些内容:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;    

public class f3 extends JPanel implements ActionListener, KeyListener { 

    static JFrame frame;
    static Timer t;
    static int x, y, velx, vely, c;

    f3(){

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

        frame = new JFrame();

        frame.addKeyListener(this);
        frame.setFocusable(true);
        frame.setFocusTraversalKeysEnabled(false);
        frame.setSize(500,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);

        frame.setVisible(true);
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 50, 30);

        t.start();
    }

    public void actionPerformed(ActionEvent e) {

        x = x + velx;
        y = y + vely;
        repaint();

    }

    public void keyPressed(KeyEvent e) {
        c = e.getKeyCode();

        if(c == KeyEvent.VK_RIGHT) {
            velx = 1;
            vely = 0;
        }

        if(c == KeyEvent.VK_LEFT) {
            velx = -1;
            vely = 0;
        }

        if(c == KeyEvent.VK_UP) {
            velx = 0;
            vely = -1;
        }

        if(c == KeyEvent.VK_DOWN) {
            velx = 0;
            vely = 1;

        }
    }

    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}

    public static void main(String args[]) {
       new f3();
    }
}
2w3kk1z5

2w3kk1z51#

velx 以及 vely 指出移动的速度(例如,与一次移动一个空间的玩家相反),您还需要确保 keyReleased 释放与该轴关联的特定键时,将适当的速度返回为0。

mdfafbf1

mdfafbf12#

价值 velx 以及 vely 在触发按键事件后设置。因为你用的是 Timer 在这里,gui将不断更新,因为 actionPerformed 重复触发。
拆下 Timer ,然后将 keyPressed 你会得到一个想要的结果。

public void keyPressed(KeyEvent e){

   if(e.getKeyCode() == KeyEvent.VK_RIGHT){
      velx = 1;
      vely = 0;
      x = x + velx;
      y = y + vely;
      repaint();
   }     

}
n3h0vuf2

n3h0vuf23#

您没有keyreleased方法的处理程序,您应该将速度设置为零:

public void keyReleased(KeyEvent e) {
    velx = 0;
    vely = 0;
}

相关问题