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

对java键监听器非常新的问题[重复]

司徒杜吟
2023-03-14

简单的问题,基本上有人能告诉我如何使它,以便当我按下java中的“said”键时,它执行的任务与我按住它时相同。例如,一旦我点击一个键,他移动一定的距离,但他所走的距离与我持有该键的时间成正比。我需要的是,即使我按0.5秒或20秒,它走的距离是一样的。

基本上,这是我在主类中的关键事件(以记录用户输入)。

public void keyPressed(KeyEvent e) {

    switch (e.getKeyCode()) {
    case KeyEvent.VK_UP:
        System.out.println("Move up");
        break;

    case KeyEvent.VK_DOWN:
        currentSprite = characterDown;
        if (knight.isJumped() == false){
            knight.setDucked(true);
            knight.setSpeedX(0);
        }
        break;



    case KeyEvent.VK_RIGHT:
        knight.moveRight();
        knight.setMovingRight(true);
        knight.setMOVESPEED(5);
        knight.setMovingRight(false);


        break;

    case KeyEvent.VK_SPACE:
        knight.jump();
        break;

    }

}

@Override
public void keyReleased(KeyEvent e) {

    switch (e.getKeyCode()) {
    case KeyEvent.VK_UP:
        System.out.println("Stop moving up");
        break;

    case KeyEvent.VK_DOWN:
        currentSprite = character;
        knight.setDucked(false);
        break;


    case KeyEvent.VK_RIGHT:
       knight.stopRight();
       knight.setMOVESPEED(5);  

       break;

    case KeyEvent.VK_SPACE:
        break;

    }

}

这是根据我设置的movespeed背景滚动的部分。

//Scrolls Background accordingly.
    if (speedX < 0) {
        centerX += speedX;
    }
    if (speedX == 0 || speedX < 0) {
        bg1.setSpeedX(0);
        bg2.setSpeedX(0);

    }
    if (centerX <= 200 && speedX > 0) {
        centerX += speedX;
    }
    if (speedX > 0 && centerX > 200) {
        bg1.setSpeedX(-getMOVESPEED());
        bg2.setSpeedX(-getMOVESPEED());
    }

嘿,伙计们,这是整个角色班希望能有所帮助

package com.jisc.framework;

导入java.awt.Rectangle;导入java.awt.graphics;

公级骑士{

final int JUMPSPEED = -15;
private int MOVESPEED = 5;
final int GROUND = 202;
private int centerX = 350;
private int centerY = GROUND;
private boolean jumped = false;
private boolean movingLeft = false;
private boolean movingRight = false;
private boolean ducked = false;

private static Background bg1 = Main.getBg1();                 
private static Background bg2 = Main.getBg2();

private int speedX = 0;
private int speedY = 0;


public void update() {

    // Moves Character or Scrolls Background accordingly.
    if (speedX < 0) {
        centerX += speedX;
    }
    if (speedX == 0 || speedX < 0) {
        bg1.setSpeedX(0);
        bg2.setSpeedX(0);

    }
    if (centerX <= 200 && speedX > 0) {
        centerX += speedX;
    }
    if (speedX > 0 && centerX > 200) {
        bg1.setSpeedX(-getMOVESPEED());
        bg2.setSpeedX(-getMOVESPEED());
    }

    // Updates Y Position

    if (centerY + speedY >= 202) {
        centerY = 202;
    }else{                        
                    centerY += speedY;
            }

    // Handles Jumping
    if (jumped == true) {
        speedY += 1;

        if (centerY + speedY >= 202) {
            centerY = 202;
            speedY = 0;
            jumped = false;
        }

    }

    // Prevents going beyond X coordinate of 0
    if (centerX + speedX <= 60) {
        centerX = 61;
    }
}

 public void moveRight() {
        if (ducked == false) {

        speedX = MOVESPEED;

   if (MOVESPEED >= 5){
       MOVESPEED ++;

   }

   if (MOVESPEED >= 7 ){
       MOVESPEED = 0;
   }




        }
    }

    public void moveLeft() {
        if (ducked == false) {
            speedX = -getMOVESPEED();
        }
    }

    public void stopRight() {
        setMovingRight(false);
        stop();
    }

    public void stopLeft() {
        setMovingLeft(false);
        stop();
    }

    public void stop() {
        if (isMovingRight() == false && isMovingLeft() == false) {
            speedX = 0;
        }

        if (isMovingRight() == false && isMovingLeft() == true) {
            moveLeft();
        }

        if (isMovingRight() == true && isMovingLeft() == false) {
            moveRight();
        }

    }

    public void jump() {
        if (jumped == false) {
            speedY = JUMPSPEED;
            jumped = true;
        }

    }

public int getCenterX() {
    return centerX;
}

public int getCenterY() {
    return centerY;
}

public boolean isJumped() {
    return jumped;
}

public int getSpeedX() {
    return speedX;
}

public int getSpeedY() {
    return speedY;
}

public void setCenterX(int centerX) {
    this.centerX = centerX;
}

public void setCenterY(int centerY) {
    this.centerY = centerY;
}

public void setJumped(boolean jumped) {
    this.jumped = jumped;
}

public void setSpeedX(int speedX) {
    this.speedX = speedX;
}

public void setSpeedY(int speedY) {
    this.speedY = speedY;
}

public boolean isDucked() {
    return ducked;
}

public void setDucked(boolean ducked) {
    this.ducked = ducked;
}

public boolean isMovingRight() {
    return movingRight;
}

public void setMovingRight(boolean movingRight) {
    this.movingRight = movingRight;
}

public boolean isMovingLeft() {
    return movingLeft;
}

public void setMovingLeft(boolean movingLeft) {
    this.movingLeft = movingLeft;
}

public int getMOVESPEED() {
    return MOVESPEED;
}

public void setMOVESPEED(int mOVESPEED) {
    MOVESPEED = mOVESPEED;
}

}

共有1个答案

凤棋
2023-03-14

使用布尔标志。这将出现在keypressed方法中。

private boolean canMoveUp = true; // same for up, down, etc.
...
case KeyEvent.VK_UP:
    if (canMoveUp)
    {
        System.out.println("Move up");
        canMoveUp = false;
    }
    break;

仅此一项只能起作用一次。当钥匙被释放时,你必须让移动再次成为可能。这将出现在keyreleased方法中。

case KeyEvent.VK_UP:
    System.out.println("Stop moving up");
    canMoveUp = true;
    break;

这将确保当您按下一个键时只移动一次,并允许您按下该键任意次数。

 类似资料:
  • 问题内容: 有没有办法监听Java中的任何异常? 我的目的是创建一个侦听和收集Java中所有出现的错误的库。有什么办法吗? 问题答案: 您可以通过Thread.UncaughtExceptionHandler捕获每个未捕获的异常。如果那还不够的话,我可能会建议一些AOP /字节码编织解决方案 来对每个创建的异常进行监视。

  • 问:如何让客户端即能通过ipv4地址访问,也能通过ipv6地址访问? 答:在初始化容器的时候监听地址写[::]即可。 例如 $worker = new Worker('http://[::]:8080'); $gateway = new Gateway('websocket://[::]:8081');

  • 一个监听器里面的应用代码在运行期间可能会抛出异常。一些监听器通知发生在应用中的另一个组件调用树过程中。这方面的一个例子是一个Servlet 设置了会话属性,该会话监听器抛出未处理异常。容器必须允许未处理的异常由描述在10.9节“错误处理”的错误页面机制处理。如果没有为这些异常指定错误页面,容器必须确保返回一个状态码为500的响应。这种情况下,不再有监听器根据事件被调用。 有些异常不会发生在应用中的

  • 最后,正如你所看到的,我的游戏同时处理全屏模式和窗口模式。这两个问题都发生。

  • 问题内容: 我有一个页面,其中通过ajax引入了内容。我遇到的问题是在内容加载后添加相关的事件侦听器。有没有办法告诉浏览器再次从头开始运行所有脚本? 以下是从页面顶部开始运行的简单代码示例,显然,通过AJAX引入的与’.RRCustomizeBox .customize’匹配的任何新html元素都不会具有以下click事件。 例如: 谢谢你的提示 约翰 问题答案: 您可以将所有初始化代码放在函数中

  • GatewayWorker是常驻内存的,磁盘上的文件更改后需要reload或者restart后才能生效,这在开发功能时非常麻烦。 为解决这个问题,Workerman官方提供了一个文件监控及自动reload服务。 代码地址在:https://github.com/walkor/workerman-filemonitor 把FileMonitor目录放到你的Applications下重启即可。 注意: