在加工过程中跳跃和移动

问题描述

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

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;
      }
    }
  }
}

您可以通过查看 processing 的 PVector 类来改进程序的实现。

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