当前位置: 首页 > 知识库问答 >
问题:

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

堵昊焱
2023-03-14

我创建了一个程序,创建一个正方形并将其绘制在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();
    }
}
}

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

共有2个答案

萧奇
2023-03-14

为了获得平稳的运动,您需要创建一个处理运动的线程。

为每个键(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) {}
}

我用它来移动箭头键,所以对于isd运动,你需要改变键代码。您需要的第二件事是背景线程,如果按下键,它将移动正方形。它根据速度和经过的时间计算运动,使其完全平稳。

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

这可能不是最简单和最快的解决方案,但它绝对是最好的:)

狄望
2023-03-14

有没有办法防止对运动的犹豫。

您可以使用摇摆计时器来安排动画。查看使用键盘的运动以获取工作示例。

 类似资料:
  • 问题内容: 目前,每次按键时,精灵仅移动1个像素。按住左右键时,如何使水暖工精灵不断移动? 问题答案: 您可以使用pygame.key.get_pressed来做到这一点。 例:

  • 刚开始使用pygame,当你按住箭头键时,试图让一个简单的点在屏幕上移动。目前,它只在你按键时移动,但你必须重复按键。 此外,我很感激你对我目前的代码有任何建议,可以改进或改变,使之更有效。

  • 快速开发工具类,用最简洁的命令实现想要的功能。辅助模拟开发。 纯Java,跨平台,模拟按键、鼠标点击、找图、找色,实现简单按键精灵的功能 DEMO演示  辅助开发配套工具:ScreenCapture.jar:  将指定文字发音读出: new TTSUtil().speak("这是要读出的文字内容"); 发送一条短信     SendPhoneMsgUtil.send("13011658091", 

  • 按键绑定 你可以激活keyBindings选项来支持键盘控制。默认情况下iScroll监听方向键,上下翻页建,home/end键,但这些按键绑定完全可以自定义。 你可以通过传递一个包含按键代码列表的对象来进行按键绑定。 默认的按键值如下: keyBindings: { pageUp: 33, pageDown: 34, end: 35, home: 36,

  • 我正在用PyGame制作一个小游戏,相机聚焦在一个代表角色的精灵上,当按下箭头键时,地图会围绕它移动。问题是地图不动。我以前多次遇到过这个问题,我想我已经把它缩小到可能的范围,但是我不知道如何真正解决这个问题。 这是代码: 基于我过去的PyGame程序,我总是在移动被绘制到屏幕上的精灵集时遇到问题,比如我在这里所做的。即使是平庸简单的例子也会失败。我想知道的是这是为什么,我怎样才能简明扼要地画出大

  • 问题内容: 我一直在尝试找出如何 逐渐 加速按下键时的精灵,然后一旦释放键,就逐渐减速直至停止,就像 小行星上 的飞船一样。如果可能,我想在没有任何游戏引擎的情况下执行此操作。我搜索了所以这个时候,发现相关的问题,但他们并没有回答我的问题 恰好 在我看来。 到目前为止,我想到的是: 我只是不确定如何正确地编程,因为我只能想到以相同的值增加而在持有时不会逐渐加速的方法。 所以这是我的目标( 逐渐加快