在 Processing 3.5.3 中制作基本跳跃(如涂鸦跳跃),但我无法让玩家在跳跃中移动?

Making a Basic Jumper (like Doodle Jump) in Processing 3.5.3, but I can't get the player to move mid-jump?

下面是我的代码,据我了解,玩家应该在空中同时移动和跳跃,因为在 draw() 函数中,它是两个 if 语句,而不是 if-else。我假设 keyPressed() 会不断检查键盘输入,因为按住一个键会使方块不断移动。但是,在跳跃之后,如果在立方体跳跃中开始按住该键,则角色根本不会移动。请帮忙!

这段代码实际上就是整个项目;我计划在未来添加平台,然后我会从那里开始。

boolean newletter;
boolean direction;
boolean jump;
float velocity;
float velocityconst;
Player player;

class Player {
    color c;
    float xpos;
    float ypos;
    float xspeed;

    Player(color clr, float xPos, float yPos, float xSpeed) {
        c = clr;
        xpos = xPos;
        ypos = yPos;
        xspeed = xSpeed;
    }

    void display() {
        rectMode(CENTER);
        noStroke();
        fill(c);
        rect(xpos,ypos,20,20);
    }

    void drive(boolean dir) {
        if ((xpos + xspeed) > width && (dir)) {
            float remainder = float(width) - xpos;
            xpos = 0 + (xspeed - remainder);
        } else if ((xpos - xspeed) < 0 && !(dir)) {
            float remainder = xpos - 0;
            xpos = width - (xspeed - remainder);
        } else {
            if (dir) xpos += xspeed;
            else xpos -= xspeed;
        }
    }

    void jump() {
        velocity = velocity + 0.5;
        if(ypos + velocity > (height/2)) {
            ypos = height/2;
            jump = false;
            velocity = velocityconst;
        } else {
            ypos += velocity;
        }
    }
}

void setup() {
    size(1000,1000);
    player = new Player(color(255,0,0),0,height/2,10);
    velocityconst = -8.0;
    velocity = velocityconst;
}

void draw() {
    background(255);
    if(newletter == true) {
        player.drive(direction);
    }
    if(jump == true) {
        player.jump();
    }
    player.display();
    newletter = false;
}

void keyPressed()
{
    if((key == 'A') || (key == 'a')) {
        direction = false;
        newletter = true;

    } else if ((key == 'D') || (key == 'd')) {
        direction = true;
        newletter = true;

    } else {
        newletter = false;
    }

    if ((key == 'W') || (key == 'w')) {
        jump = true;
    } 
}

阻止的原因有 2 个,即玩家同时移动和跳跃。

  1. 指示移动的状态(newletter)在每一帧中被重置:
void draw() {

   // [...]

   newletter = false;
}
  1. 当按下的键不是ad时,则运动停止:
void keyPressed()
{
   if((key == 'A') || (key == 'a')) {
       // [...]
   } else if ((key == 'D') || (key == 'd')) {
       // [...]
   } else {
       newletter = false;
   }

   // [...]
}

不要在draw()停止移动:

void draw() {
    background(255);

    println(newletter, " ", jump);
    if(newletter == true) {
      player.drive(direction);
    }
    if(jump == true) {
        player.jump();
    }

    player.display();
}

并且在按下 w(或其他键)时不要停止它:

void keyPressed()
{
    if(key == 'A' || key == 'a') {
        direction = false;
        newletter = true; 
    } else if (key == 'D' || key == 'd') {
        direction = true;
        newletter = true;
    }

    if (key == 'W' || key == 'w') {
        jump = true;
    } 
}

但是添加一个keyReleased()回调,停止运动,当ad被释放时:

void keyReleased()
{
    if (key == 'A' || key == 'a' || key == 'D' || key == 'd') {
        newletter = false;
    }
}