更改窗口大小时,动画球不会在中间交叉

时间:2019-08-31 02:39:40

标签: java processing

有两个泳道,每个泳道都包含一个球...当动画开始时,它是默认窗口大小时在中间穿过的球。当我更改窗口大小时,它不会在中间交叉。我试图在过去的几周内解决这个问题。

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

我希望我的回答是“在任何窗口大小的中间越过球”

1 个答案:

答案 0 :(得分:1)

如果球应在中间交叉,则它们必须同时通过不同的方式。

球的半径是:

float radius1 = 0.4*height/8; 
float radius2 = 0.4*width/8;

第一个球的方向在x轴上,从x=radius1x=width-radius1。 第二个球的方向在y轴上,从y=radius2y=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;
}