gpt4 book ai didi

java - 学习关键事件

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:11 25 4
gpt4 key购买 nike

我对java比较陌生,正在尝试学习如何制作一个有这个圆圈的程序,并且我可以使用箭头键移动它。在浏览了一堆例子之后,我能够将一些东西放在一起。虽然我不确定如何创建 KeyEvent。对我所缺少的任何帮助都会很棒。

这就是我到目前为止所拥有的。

    import javax.swing.WindowConstants;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.KeyEvent;

@SuppressWarnings("serial")
public class Game extends JPanel
{

int x = 0;
int y = 0;
private void moveBallUP() {
x = x + 0;
y = y + 1;
}

private void moveBallDOWN() {
x = x + 0;
y = y - 1;
}

private void moveBallLEFT() {
x = x + 1;
y = y + 0;
}

private void moveBallRIGHT() {
x = x - 1;
y = y + 0;
}

@Override
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.red);
g2d.fillOval(y, x, 50, 50);
}

public static void main(String[] args) throws InterruptedException
{
JFrame frame = new JFrame("Sample Frame");
Game game = new Game();
frame.add(game);
frame.setSize(300, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

if (event.getKeyCode() == KeyEvent.VK_UP)
{
game.moveBallUP();
game.repaint();
Thread.sleep(10);
}

if (event.getKeyCode() == KeyEvent.VK_DOWN)
{
game.moveBallDOWN();
game.repaint();
Thread.sleep(10);
}

if (event.getKeyCode() == KeyEvent.VK_LEFT)
{
game.moveBallLEFT();
game.repaint();
Thread.sleep(10);
}

if (event.getKeyCode() == KeyEvent.VK_RIGHT)
{
game.moveBallRIGHT();
game.repaint();
Thread.sleep(10);
}
}
}

最佳答案

解决这个问题有几个步骤:首先,使用KeyListener。将以下代码添加到Game类中;这将代表按下了哪些按钮:

private boolean upPressed=false;
private boolean downPressed=false;
private boolean leftPressed=false;
private boolean rightPressed=false;

然后,将其添加到 main 方法中:

frame.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.VK_UP:
game.upPressed=false;
break;
case KeyEvent.VK_DOWN:
game.downPressed=false;
break;
case KeyEvent.VK_LEFT:
game.leftPressed=false;
break;
case KeyEvent.VK_RIGHT:
game.rightPressed=false;
break;

}
}

@Override
public void keyTyped(KeyEvent event) {

}

@Override
public void keyPressed(KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.VK_UP:
game.upPressed=true;
break;
case KeyEvent.VK_DOWN:
game.downPressed=true;
break;
case KeyEvent.VK_LEFT:
game.leftPressed=true;
break;
case KeyEvent.VK_RIGHT:
game.rightPressed=true;
break;

}
}
});

基本上,您将我们创建的变量设置为 true(当按钮按下时)和 false(当按钮释放时)。最后,在 main 方法中添加一个 Timer:

Timer timer = new Timer(10,(e)->{
if (game.upPressed)
{
game.moveBallUP();
game.repaint();
}

if (game.downPressed)
{
game.moveBallDOWN();
game.repaint();
}

if (game.leftPressed)
{
game.moveBallLEFT();
game.repaint();
}

if (game.rightPressed)
{
game.moveBallRIGHT();
game.repaint();
}
});
timer.start();

这将每 10 毫秒触发一次,并在按下按钮时调用您的移动方法。

我已经对此进行了测试,并且知道它有效,但是您的移动方法将圆朝错误的方向移动。我想你可以解决这个问题。

编辑:错误在这一行:

g2d.fillOval(y, x, 50, 50);

将其更改为:

g2d.fillOval(x,y , 50, 50);

关于java - 学习关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43059651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com