跳动加工

jumping and moving in processing

我正在尝试让一个圆圈能够同时左右跳跃和移动,但现在它只能一次跳跃或向前移动。任何人都知道如何更改我的代码来解决这个问题?谢谢

float px,py,vx,vy,ax,ay;
boolean canJump = false;

void setup(){
  size(600, 400);
  ax = 0;
  ay = .32;
  vx = 0;
  vy = 0;
  px = 300;
  py = 200;
}

int x = 50;
int y = 520;

void draw(){
  background(0);
  ellipse(px-15, py-30, 60, 60);
  vx+=ax;
  vy+=ay;
  px+=vx;
  py+=vy;
  if( py > height ){
    py = height;
    vy = 0;
    canJump = true;
  }
  player();
}

void player(){
  fill(255);
  rect(0, 550, 1000, 50);
}

void keyPressed(){
  if(keyCode == RIGHT || key == 'd'){
    px += 10;
  }
  
  if(keyCode == LEFT || key == 'a'){
    px -= 10;
  }
  if(keyCode == UP){
    if(canJump) {
      vy = -10;
      canJump = false;
    }
  }
  
}

所以你可以让你的球同时向上和向右或向上和向左移动,方法是检查两个键是否都被按下,然后你可以增加速度而不是位置来影响球的轨迹。但是,当它撞击地面时,你必须减慢速度的 x 分量,所以我添加了一个 friction 变量。

float px, py, vx, vy, ax, ay;
boolean canJump = false;

float bounce = 0.2;
float friction = 0.2;

void setup() {
  size(600, 400);
  ax = 0;
  ay = .32;
  vx = 0;
  vy = 0;
  px = 300;
  py = 200;
}

int x = 50;
int y = 520;

void draw() {
  background(0);
  ellipse(px-15, py-30, 60, 60);
  vx+=ax;
  vy+=ay;
  px+=vx;
  py+=vy;
  if ( py > height ) {
    py = height;
    vy = -bounce*vy;
    vx = friction*vx;
    canJump = true;
  }
}

void keyPressed() {  
  if (keyCode == RIGHT && keyCode == UP) {
    if (canJump) {
      vy = -10;
      vx += 5;
      canJump = false;
    }
  } else if (keyCode == LEFT && keyCode == UP) {
    if (canJump) {
      vy = -10;
      vx += -5;
      canJump = false;
    }
  } else {
    if (keyCode == RIGHT || key == 'd') {
      vx += 5;
    }

    if (keyCode == LEFT || key == 'a') {
      vx -= 5;
    }
    if (keyCode == UP) {
      if (canJump) {
        vy = -10;
        canJump = false;
      }
    }
  }
}

您可以通过查看处理的 PVector class.

来改进程序的实施
PVector pos;
PVector vel;
PVector acc;

float friction = 0.3;
float bounce = 0.5;

float diameter = 60;

boolean canJump = false;

void setup() {
  size(600, 400);

  pos = new PVector(300, 200);
  vel = new PVector(0, 1);
  acc = new PVector(0, 0.32);
}

void draw() {
  background(0);
  circle(pos.x, pos.y, diameter);

  vel.add(acc);
  pos.add(vel);

  if (pos.y + diameter/2 > height) {
    pos.set(pos.x, height-diameter/2);
    vel.set(vel.x*friction, -vel.y*bounce);
    canJump = true;
  }
}

void keyPressed() {
  boolean right = keyCode == RIGHT || key == 'd';
  boolean left = keyCode == LEFT || key == 'a';
  boolean up = keyCode == UP || key == 'w';


  if (up && right && canJump) {
    vel.add(5, -10);
    canJump = false;
  } else if (up && left && canJump) {
    vel.add(-5, -10);
    canJump = false;
  } else {
    if (up && canJump) {
      vel.add(0, -10);
      canJump = false;
    }

    if (right) {
      vel.add(5, 0);
    }

    if (left) {
      vel.add(-5, 0);
    }
  }
}