为什么这个处理代码会产生越来越少的痕迹?

问题描述 投票:2回答:1

我正在通过Processing学习java。

代码执行以下操作。

1)调用设置并初始化大小为700,300的窗口。

2)使用设置中的for循环初始化许多点,并给出随机速度。

3)自动调用绘图功能。这是一个循环功能。它一次又一次地被召唤。它每次用黑色矩形填充空间并绘制所有圆圈并更新它们的位置。

4)由于每次调用draw()时rect()命令都会清除屏幕,因此它必须只显示一个粒子且没有轨迹。但确实如此。

我遇到了其中一个教程,代码如下

Spot[] spots; // Declare array
void setup() {
  size(700, 100);
  int numSpots = 70; // Number of objects
  int dia = width/numSpots; // Calculate diameter
  spots = new Spot[numSpots]; // Create array
  for (int i = 0; i < spots.length; i++) {
    float x = dia/2 + i*dia;
    float rate = random(0.1, 2.0);
    // Create each object
    spots[i] = new Spot(x, 50, dia, rate);
  }
  noStroke();
}
void draw() {
  fill(0, 12);
  rect(0, 0, width, height);
  fill(255);
  for (int i=0; i < spots.length; i++) {
    spots[i].move(); // Move each object
    spots[i].display(); // Display each object
  }
}
class Spot {
  float x, y;         // X-coordinate, y-coordinate
  float diameter;     // Diameter of the circle
  float speed;        // Distance moved each frame
  int direction = 1;  // Direction of motion (1 is down, -1 is up)

  // Constructor
  Spot(float xpos, float ypos, float dia, float sp) {
    x = xpos;
    y = ypos;
    diameter = dia;
    speed = sp;
  }

  void move() {
    y += (speed * direction); 
    if ((y > (height - diameter/2)) || (y < diameter/2)) { 
      direction *= -1; 
    } 
  }

  void display() {
    ellipse(x, y, diameter, diameter);
  }
}

它产生这个输出:

enter image description here

我不明白为什么它会创造那些小径,那些小径就会消失。直觉上,只有一个点应该可见,因为

for (int i=0; i < spots.length; i++) {
spots[i].move(); // Move each object
spots[i].display(); // Display each object
}

请指出使这种情况发生的代码行?我没有线索。

参考:https://processing.org/tutorials/arrays/ @ Arrays:Casey Reas和Ben Fry

java arrays oop processing blending
1个回答
2
投票

屏幕永远不会被清除,因此当在新帧中将新斑点添加到场景中时,在先前帧中绘制的斑点仍然存在。

说明

fill(0, 12);
rect(0, 0, width, height);

在整个视图上绘制一个透明的黑色矩形。因此,前一帧的斑点似乎随着时间的推移逐渐淡出。由于“老”斑点已经被透明矩形覆盖了5次,因此它们变成深灰色。 “年轻”斑点只被覆盖了几次并呈现浅灰色。由于白色填充颜色(fill(255);),立即绘制的斑点是白色的

如果你增加混合矩形的alpha值,那么斑点将“消失”得更快,它们的“尾巴”会更短。

EG

fill(0, 50);
© www.soinside.com 2019 - 2024. All rights reserved.