【问题标题】:jumping and moving in processing加工中的跳跃和移动
【发布时间】:2021-05-25 00:48:13
【问题描述】:

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

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

【问题讨论】:

  • 请澄清:你想要一个特定的键同时进行跳跃和前进吗?
  • 如果您同时向左和向右移动,那么它们会相互抵消,因为它们移动的距离完全相同。究竟是什么问题?

标签: java processing


【解决方案1】:

因此,您可以通过检查两个键是否都被按下来让您的球向上和向右或向上和向左移动,然后您可以添加速度而不是位置来影响球的轨迹。但是,当它落地时,你必须减慢速度的 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 类来改进程序的实现。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多