Processing 处理中的干扰键2

Processing 处理中的干扰键2,processing,draw,Processing,Draw,我试图通过按不同的键来激活不同的视觉效果。例如,当我按下“z”或“z”时,特定位置上的椭圆向下流动,留下一条轨迹。如果我等待它到达画布边界,没有问题,但是当我按下“0”时,激活另一个位置上的另一个椭圆来做同样的事情,“z”/“z”的椭圆停止流动。在椭圆到达画布边界之前按同一个键时也会发生这种情况。我怎样才能解决这个问题?当我开始编写代码时,我不知道类和对象,然后我学习并试图通过创建一个对象来解决它,但更糟糕的是,省略号根本不起作用。我希望第一个椭圆继续,直到边界,即使我按下另一个键,而它的方式

我试图通过按不同的键来激活不同的视觉效果。例如,当我按下“z”或“z”时,特定位置上的椭圆向下流动,留下一条轨迹。如果我等待它到达画布边界,没有问题,但是当我按下“0”时,激活另一个位置上的另一个椭圆来做同样的事情,“z”/“z”的椭圆停止流动。在椭圆到达画布边界之前按同一个键时也会发生这种情况。我怎样才能解决这个问题?当我开始编写代码时,我不知道类和对象,然后我学习并试图通过创建一个对象来解决它,但更糟糕的是,省略号根本不起作用。我希望第一个椭圆继续,直到边界,即使我按下另一个键,而它的方式

另一件事是我想让它们在短时间后淡出,所以我在画布上画了半透明的矩形,这对我来说非常原始。你能建议另一种方式吗?这不太重要,但最好让它们随着时间的推移完全消失,而不是留下一丝痕迹

这是我的代码,我清理了不相关的部分,使它看起来更容易理解:

void setup() {
  size(640, 500);
  background(bgRenk);
  frameRate(60);
  colorMode(HSB);
  noStroke();
}

int bgRenk = #e7e7e7;
int C3Yer;
int C3Y;
int Fd6Yer;
int Fd6Y;

void draw() {

  // This part probably sucks because it's a primitive solution to make ellipses fade out by putting semi-transparent rectangles on the canvas.

  fill(bgRenk, 10);
  rect(0, 0, 640, 500);

  // I basically map x and y positions to hue and opacity.

  float C3Renk= map(C3Yer, 0, width, 0, 255);
  float C3Opak = map(C3Y, height, 0, 0, 200);

  // When z/Z is pressed, an ellipse appears and goes down, leaving trace behind.   
  if (key == 'z' || key == 'Z') {
    C3Yer = 10;
    fill(C3Renk, 255, 255, C3Opak);
    ellipse(C3Yer, C3Y, 20, 20);
    C3Y += 20;
  }


  if (key == '0') {

    // Same mapping and ellipse thing.

    float Fd6Renk= map(Fd6Yer, 0, width, 0, 255);
    float Fd6Opak = map(Fd6Y, height, 0, 0, 200);
    Fd6Yer = 630;
    fill(Fd6Renk, 255, 255, Fd6Opak);
    ellipse(Fd6Yer, Fd6Y, 20, 20);
    Fd6Y += 20;
  }
}

void keyPressed() {


  if (key == 'z' || key == 'Z') {

    // When z/Z is pressed, y position of those ellipses are reset.


    C3Y = 10;
  }


  if (key == '0') {

    // Same reset thing.      

    Fd6Y = 10;
  }
}

感谢您的时间。

在其他椭圆仍在流动时创建新椭圆的问题在于变量
key
始终包含最近使用的键的值(详细信息)。因此,当您在“z”之后按任意键时,椭圆将停止绘制。 您可以使用指示应绘制哪些椭圆的全局变量来避免这种情况

但我建议使用创建具有定义状态(位置、颜色、不透明度)并存储在数组或列表中的对象。它也会帮助你适应衰退,所以找个时间阅读更多关于课程和学习的内容。在处理网站上,你们可以找到像这样的好东西

但是,因为您感到难过,您已经尝试创建对象,而我不工作,所以我将为您提供一些技巧和此类类的基本示例:

班级舞会{
浮动x,y;//球的位置
color col=10;//球的颜色
int opac=255;//球的不透明度
球(浮球x,浮球y){
x=x;
y=_y;
}
无效移动(){
y+=20;
opac-=10;
}
void display(){
填充(col、255、255、opac);
椭圆(x,y,20,20);
}
}
然后,您可以创建新的
ball
对象:

void mousePressed(){
//这将在鼠标位置上创建新球
添加(新球(mouseX,mouseY));
}
并将它们存储到
ArrayList
中,如下所示:

ArrayList balls=new ArrayList();
您需要做的最后一件事是
显示
移动
方法中的所有球

for(Ball b:balls)//列表中的每个球
{
b、 display();//第一个显示球
b、 move();//移动并更改不透明度
}

这是一个非常基本的示例,应该加以改进,但我希望它能帮助您理解课程。

非常感谢。我的类与你的类非常相似,但我没有“void move()”部分,这可能是问题所在,我尝试用一种不同且不成功的方法来移动它。另外,我使用的是“Ball.display()”东西,而不是void键pressed()下的“balls.add(newball(mouseX,mouseY))”。我会尽快尝试这个,再次谢谢你。