Java 加工过程中的平稳运动?

Java 加工过程中的平稳运动?,java,processing,Java,Processing,我希望这段代码能够有效地提高方向间过渡的平滑度(一次只能使用一个关键点),这样我就可以使用多个关键点。问题是,每当我改变方向时,“玩家”就会停下来,然后继续朝新的方向前进。我想让“玩家”在两个方向之间平稳过渡,而不必在按下新键之前完全释放活动键 主要代码: Ball ball; Player player1; Player player2; void setup() { size(1368,768); frameRate(60); noStroke(); ball = ne

我希望这段代码能够有效地提高方向间过渡的平滑度(一次只能使用一个关键点),这样我就可以使用多个关键点。问题是,每当我改变方向时,“玩家”就会停下来,然后继续朝新的方向前进。我想让“玩家”在两个方向之间平稳过渡,而不必在按下新键之前完全释放活动键

主要代码:

Ball ball;
Player player1;
Player player2;

void setup() {

  size(1368,768);
  frameRate(60);
  noStroke();

  ball = new Ball(width/2, height/2, 30);
  player1 = new Player(0, height/2, 30, 150);
  player2 = new Player(width-30, height/2, 30, 150);

  ball.speedX = -10;
  ball.speedY = random(-5,5);

}

void draw() {

  background(0);

  ball.display();
  ball.move();
  player1.run();
  player2.run();

  //Collision
  if (ball.top() < 0) {
    ball.speedY = -ball.speedY;
  }

  if (ball.bottom() > height) {
    ball.speedY = -ball.speedY;
  }

  if (ball.left() < 0) {
    ball.speedX = 0;
    ball.speedY = 0;
  }

  if (ball.right() > width) {
    ball.speedX = 0;
    ball.speedY = 0;
  }

}

void keyPressed() {

  player1.pressed((key == 'w' || key == 'W'), (key == 's' || key == 'S'));
  player2.pressed((keyCode == UP), (keyCode == DOWN));

}

void keyReleased() {

  player1.released((key == 'w' || key == 'W'), (key == 's' || key == 'S'));
  player2.released((keyCode == UP), (keyCode == DOWN));

}

提前谢谢

如果希望平滑过渡,则必须放弃在关键点处理程序中“添加固定整数距离”,而是跟踪哪些关键点向下或不向下,然后在每次运行
draw()
时加速/减速播放器。举个简单的例子:

Box;
布尔[]活动=新布尔[256];
无效设置(){
尺寸(500500);
盒子=新盒子(宽/2,高/2);
}
作废提款(){
pushStyle();
背景(0);
更新(活动);//首先,使长方体更新其速度,
box.draw();//然后,让长方体自己绘制。
popStyle();
}
void keyPressed(){active[keyCode]=true;}
void keyreased(){active[keyCode]=false;}
使用简单的box类:

类框{
最终浮动最大速度=1,加速度=0.1,减速度=0.5;
浮动x,y;
浮动dx=0,dy=0;
框(float x,float y){x=x;y=y;}
作废提款(){
//我们首先根据当前速度更新位置,
x+=dx;
y+=dy;
//然后我们画自己。
仰泳();
填充(255);
rect(x,y,30,30);
}
无效更新(布尔[]键){
如果(键[38]){dy-=加速度;}
如果(键[40]){dy+=加速度;}
else{dy*=减速;}
如果(键[37]){dx-=加速度;}
如果(键[39]){dx+=加速度;}
else{dx*=减速;}
dx=约束(dx,-最大速度,最大速度);
dy=约束(dy,-最大速度,最大速度);
}
}
这里的重要部分是
更新
代码,它更新方框的x和y速度,以便在当前按下方向键时,我们增加该方向的速度(
dx
/
dy
)。重要的是,如果没有按下任何键,我们也会降低速度,使其返回0


最后,为了确保我们不会以无限的速度结束,我们限制了允许的最大速度。

向类
玩家添加两个属性
上移
下移
,并在中设置属性
分别按下
释放

职业玩家{
// [...]
布尔值上移=false,下移=false;
按下void(布尔值向上,布尔值向下){
如果(向上){move_up=true;}
如果(向下){move_down=true;}
}
已释放无效(布尔值向上,布尔值向下){
如果(向上){move_up=false;}
如果(向下){move_down=false;}
}
}
根据
move
中的属性进行快速更改。如果未设置
move\u up
not
move\u down
speedY=speedY*0.95;
),则持续降低速度。如果不按任何键,则播放器会平稳减速。如果按下
move_up
move_down
,则根据所需方向稍微改变速度。将速度限制在一定的间隔内(
speedY=max(-5.0,min(5.0,speedY));
):

职业玩家{
// [...]
无效移动(){
如果(!move_up&&!move_down){speedY*=0.95;}
如果(向上移动){speedY-=0.1;}
如果(向下移动){speedY+=0.1;}
速度=最大值(-5.0,最小值(5.0,速度));
y+=快速;
}
// [...]
}
播放器

职业玩家{
浮动x,y;
浮子w,h;
浮动速度=0.0;
颜色c;
布尔值上移=false,下移=false;
//建造师
玩家(浮动速度,浮动速度,浮动速度,浮动速度){
x=tempX;
y=tempY;
w=tempW;
h=tempH;
c=(255);
}
无效运行(){
显示();
move();
}
无效显示(){
填充(c);
rect(x,y-h/2,w,h);
println(y);
}
无效移动(){
如果(!move_up&&!move_down){speedY*=0.95;}
如果(向上移动){speedY-=0.1;}
如果(向下移动){speedY+=0.1;}
速度=最大值(-5.0,最小值(5.0,速度));
y+=快速;
}
按下void(布尔值向上,布尔值向下){
如果(向上){move_up=true;}
如果(向下){move_down=true;}
}
已释放无效(布尔值向上,布尔值向下){
如果(向上){move_up=false;}
如果(向下){move_down=false;}
}
}

同样为了平滑效果,可以在两个步骤之间添加相互作用的模糊效果来模拟自然运动模糊。不过,
draw
实际上是帧绘制功能,在
setup
中设置的每秒帧数值下被调用(如果没有设置任何值,则为60帧)所以你必须用双缓冲来伪装模糊,这样东西会变得非常昂贵。以60帧/秒(ish)的速度运行和低加速/减速更便宜。如果您在处理过程中运行这个答案的代码,您应该会看到它已经非常平滑了。
class Player {

  float x, y;
  int dy = 0;
  float w, h;
  float speedY = 5;
  color c;

  //Constructor
  Player(float tempX, float tempY, float tempW, float tempH){

    x = tempX;
    y = tempY;
    w = tempW;
    h = tempH;
    speedY = 0;
    c = (255);

  }

  void run() {

    display();
    move();

  }

  void display() {

    fill(c);
    rect(x, y-h/2, w, h);

  }

  void move() {

    y += dy * speedY;

  }

  void pressed(boolean up, boolean down) {

    if (up) {dy = -1;}
    if (down) {dy = 1;}

  }

  void released(boolean up, boolean down) {

    if (up) {dy = 0;}
    if (down) {dy = 0;}

  }


}