【问题标题】:Buffered Keyboard Input缓冲键盘输入
【发布时间】:2013-05-09 08:47:48
【问题描述】:

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

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();
    }   
}

}

在这个输入中,方块向正确的方向移动,但只是两次,然后它以不同的动作移动,甚至停止移动。

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

【问题讨论】:

  • java什么时候变成'低级'了?还是躺着写?

标签: java swing keylistener paintcomponent event-dispatch-thread


【解决方案1】:

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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多