gpt4 book ai didi

java - 缓冲键盘输入

转载 作者:行者123 更新时间:2023-12-01 14:36:21 25 4
gpt4 key购买 nike

我正在尝试编写一个 2d 图形游戏。在这个游戏中,我通过键盘输入在黑色平面上移动方 block 。我为了确保平滑的按键 Action 我想使用缓冲按键输入。为了做到这一点,我使用一个 boolean 数组来保存击键。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;

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


public class Main extends JFrame{

/**
* @param args
*/
class Entity
{
int x = 150,y = 150;
int Speed = 5;

}

Entity user = new Entity();
boolean[] keys = new boolean[KeyEvent.KEY_TYPED];

public Main()
{
setSize(800,600);
setLocationRelativeTo(null);

final JPanel display = new JPanel()
{
protected void paintComponent(Graphics g)
{

g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.RED);
g.fillRect(user.x, user.y, 30, 30);
}
};


addKeyListener(new KeyAdapter()
{

public void keyPressed(KeyEvent arg0)
{

keys[arg0.getKeyCode()] = true;

if(keys[KeyEvent.VK_UP])
{
user.y -= user.Speed;

}
if(keys[KeyEvent.VK_DOWN])
{
user.y += user.Speed;
}
if(keys[KeyEvent.VK_LEFT])
{
user.x -= user.Speed;
}
if(keys[KeyEvent.VK_RIGHT])
{
user.x += user.Speed;

}

setFocusable(true);
repaint();

}
});


//add a action listener
//remember to set the focusable


add(display);
}
public static void main(String[] args) {
// TODO Auto-generated method stub


Thread t = new Thread();
try {
t.sleep(100);
Main m = new Main();
m.setVisible(true);
m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

在此输入中, block 沿正确的方向移动,但仅移动两次,然后它以不同的运动移动,甚至停止移动。

我已经搜索了我所有的 Java 书籍,但没有多大帮助。我怎样才能修复这个错误?

最佳答案

boolean[]keys设为局部变量,这样它就不会包含之前按下的按键,否则会影响x,y坐标。

public void keyPressed(KeyEvent arg0)
{
boolean[] keys = new boolean[KeyEvent.KEY_TYPED];
keys[arg0.getKeyCode()] = true;

if(keys[KeyEvent.VK_UP])
{
user.y -= user.Speed;
}
else if(keys[KeyEvent.VK_DOWN])
{
user.y += user.Speed;
}
else if(keys[KeyEvent.VK_LEFT])
{
user.x -= user.Speed;
}
else if(keys[KeyEvent.VK_RIGHT])
{
user.x += user.Speed;

}

setFocusable(true);
repaint();
}

如果您只想清除按键

public void keyPressed(KeyEvent arg0)
{
keys = new boolean[KeyEvent.KEY_TYPED];
keys[arg0.getKeyCode()] = true;
/* Rest of code */

关于java - 缓冲键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16457841/

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