Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在按下键绑定时不断移动精灵_Java_Swing_Jpanel_Sprite_Key Bindings - Fatal编程技术网

Java在按下键绑定时不断移动精灵

Java在按下键绑定时不断移动精灵,java,swing,jpanel,sprite,key-bindings,Java,Swing,Jpanel,Sprite,Key Bindings,我创建了一个程序,可以创建一个正方形并在JPanel上绘制它。还有一些键绑定控制正方形的移动w是向上s是向下a是左d是右。我的问题是,当我按下键时,它移动一个实例,犹豫,然后继续移动。有没有办法防止运动的迟疑 import javax.swing.JFrame; public class MovingBox extends JFrame{ Panel panel; public static void main(String args[]){ MovingBox mb = ne

我创建了一个程序,可以创建一个正方形并在JPanel上绘制它。还有一些键绑定控制正方形的移动w是向上s是向下a是左d是右。我的问题是,当我按下键时,它移动一个实例,犹豫,然后继续移动。有没有办法防止运动的迟疑

import javax.swing.JFrame;


public class MovingBox extends JFrame{

Panel panel;

public static void main(String args[]){

    MovingBox mb = new MovingBox();
}

public MovingBox(){

    super("Moving Box");
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    panel = new Panel();
    add(panel);

    setVisible(true);
}
}
这是我的小组课

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;


public class Panel extends JPanel{

Rectangle box;

public Panel(){

    box = new Rectangle(100, 100, 50, 50);

    getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
            KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "move left");
    getActionMap().put("move left", new MoveAction(3, 3));

    getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
            KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "move right");
    getActionMap().put("move right", new MoveAction(1, 3));

    getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
            KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "move up");
    getActionMap().put("move up", new MoveAction(0, 3));

    getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
            KeyStroke.getKeyStroke(KeyEvent.VK_S, 0), "move down");
    getActionMap().put("move down", new MoveAction(2, 3));
}

public void paintComponent(Graphics window){

    super.paintComponent(window);

    window.fillRect((int)box.getX(), (int)box.getY(), (int)box.getWidth(), (int)box.getHeight());
}

private class MoveAction extends AbstractAction{

    int direction;
    int speed;

    public MoveAction(int direction, int speed){

        this.direction = direction;
        this.speed = speed; 
    }

    public void actionPerformed(ActionEvent e){

        if(direction == 0){

            box.setLocation((int)box.getX(), (int)box.getY() - speed);

        }else if(direction == 1){

            box.setLocation((int)box.getX() - speed, (int)box.getY());

        }else if(direction == 2){

            box.setLocation((int)box.getX(), (int)box.getY() + speed);

        }else if(direction == 3){

            box.setLocation((int)box.getX() + speed, (int)box.getY());
        }

        repaint();
    }
}
}

任何帮助都将不胜感激。谢谢。

要获得平滑的移动,您需要创建一个线程来处理移动

import javax.swing.JFrame;


public class MovingBox extends JFrame{

Panel panel;

public static void main(String args[]){

    MovingBox mb = new MovingBox();
}

public MovingBox(){

    super("Moving Box");
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    panel = new Panel();
    add(panel);

    setVisible(true);
}
}
为每个键w、a、s、d创建一个布尔变量,并在按下该键时将其设置为true,释放该键时将其设置为false。只是一个简单的键侦听器。 别忘了将侦听器添加到jframe,并检查jframe是否具有焦点

private class InputListener implements KeyListener{
    @Override
    public void keyPressed(KeyEvent pressed) {

        //arrow keys
        if(pressed.getKeyCode() == 37){
            arrowLeft = true;
        }else if(pressed.getKeyCode() == 38){
            arrowUp = true;
        }else if(pressed.getKeyCode() == 39){
            arrowRight = true;
        }else if(pressed.getKeyCode() == 40){
            arrowDown = true;
        }

        //System.out.println(pressed.getKeyCode());
    }
    @Override
    public void keyReleased(KeyEvent released) {
        if(released.getKeyCode() == 37){
            arrowLeft = false;
        }
        if(released.getKeyCode() == 38){
            arrowUp = false;
        }
        if(released.getKeyCode() == 39){
            arrowRight = false;
        }
        if(released.getKeyCode() == 40){
            arrowDown = false;
        }
    }
    @Override
    public void keyTyped(KeyEvent arg0) {}
}
我用它来移动箭头键,所以对于wasd移动,您需要更改键代码。第二件事你需要的是背景线程移动方块,如果一个键被按下。它根据经过的速度和时间来计算移动,使其完全平滑

long currTime = 0;
long lastTime = 0;

new Thread() {
    @Override
      public void run() {
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        while (true) {
           currTime = System.currentTimeMillis();
           long time = currTime - lastTime;

           int movePixel = (int) (speed * time);

           if (movePixel < 1 ) {
                            currPlayerTime -= time;
           }else{
               if(arrowLeft){
                     //move left by movePixel pixel
               }else if(arrowRight){
                     //move right by movePixel pixel
               }
               if(arrowUp){

               }else if(arrowDown){

               }     
             }

            lastTime = currTime;
        }
    }
}.start();
这可能不是最简单、最快的解决方案,但肯定是最好的:

有没有办法防止运动的迟疑

import javax.swing.JFrame;


public class MovingBox extends JFrame{

Panel panel;

public static void main(String args[]){

    MovingBox mb = new MovingBox();
}

public MovingBox(){

    super("Moving Box");
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    panel = new Panel();
    add(panel);

    setVisible(true);
}
}
可以使用摆动计时器来安排动画。查看一个工作示例。

基本上,您应该有第二个侦听器来检测密钥何时释放。但它肯定是最好的—不要使用幻数。也不要使用KeyListeners。请点击我提供的链接了解更多信息。