有两个泳道,每个泳道都包含一个球...当动画开始时,它是默认窗口大小时在中间穿过的球。当我更改窗口大小时,它不会在中间交叉。我试图在过去的几周内解决这个问题。
float x = 0.4*width/8;
float y = 0.4*height/8;
void setup(){
size(600,600);
background(#C8F5F2);
frameRate(10);
}
void draw(){
fill(255);
noStroke();
rectMode(CENTER);
rect(width/2, 0, width/8, height*2); //vertical lane
rect(0, height/2, 2*width, height/8); //horizontal lane
fill(255,0,0,100);
ellipse( width/2, x, 0.8*width/8, 0.8*width/8); //vertical ellipse
fill(0,255,0,100);
ellipse( y, height/2, 0.8*height/8, 0.8*height/8); //horizontal
//ellipse
if(x < height - 0.4*width/8){
x = x + width/45;
}
if(y < width - 0.4*height/8){
y = y + height/20;
}
}
我希望我的回答是“在任何窗口大小的中间越过球”
答案 0 :(得分:1)
如果球应在中间交叉,则它们必须同时通过不同的方式。
球的半径是:
float radius1 = 0.4*height/8;
float radius2 = 0.4*width/8;
第一个球的方向在x轴上,从x=radius1
到x=width-radius1
。
第二个球的方向在y轴上,从y=radius2
到y=height-radius2
。
因此,“球的下一个位置可以通过以下方式计算:
x += (width - 2.0*radius1) / steps;
y += (height - 2.0*radius2) / steps;
其中steps
是每个球从开始到结束应该执行的步数。
还要注意,x轴是从左到右,y轴是从上到下。参见示例:
float x, y;
float steps = 20.0;
void setup(){
size(800,300);
background(#C8F5F2);
frameRate(10);
x = 0.4*height/8;
y = 0.4*width/8;
}
void draw(){
float radius1 = 0.4*height/8;
float radius2 = 0.4*width/8;
fill(255);
noStroke();
rectMode(CENTER);
rect(width/2, 0, width/8, height*2); //vertical lane
rect(0, height/2, 2*width, height/8); //horizontal lane
fill(255,0,0,100);
ellipse(x, height/2, radius1*2.0, radius1*2.0); //vertical ellipse
fill(0,255,0,100);
ellipse(width/2, y, radius2*2.0, radius2*2.0); //horizontal
if(x < width - radius1){
x += (width - 2.0*radius1) / steps;
}
if(y < height - radius2){
y += (height - 2.0*radius2) / steps;
}
}
.i我还需要了解另一件事,那就是如何声明特定的键来加快和降低球速。例如“按UP键会导致速度加倍,而按DOWN键则会使速度减半。
按下键后,将执行keyPressed()
。使用keyCode
评估是按下UP还是按下DOWN,然后更改steps
:
void keyPressed() {
if (keyCode == DOWN)
steps /= 2.0;
else if (keyCode == UP)
steps *= 2.0;
}