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