如何将主代码变成 Class (Snowfall)

How To Turn Main Code Into A Class (Snowfall)

我正在尝试将我找到的这个免费源代码 (http://solemone.de/demos/snow-effect-processing/) 用于 class,我可以在更大、更复杂的 "game" 代码中使用它。这是一个非常基本的降雪代码:

int quantity = 15;
float [] xPosition = new float[quantity];
float [] yPosition = new float[quantity];
int [] flakeSize = new int[quantity];
int [] direction = new int[quantity];
int minFlakeSize = 10;
int maxFlakeSize = 20;

void setup() {

  size(800, 350);
  frameRate(30);
  noStroke();
  smooth();

  for(int i = 0; i < quantity; i++) {
    flakeSize[i] = round(random(minFlakeSize, maxFlakeSize));
    xPosition[i] = random(0, width);
    yPosition[i] = random(0, height);
    direction[i] = round(random(0, 1));
  }

}

void draw() {

  background(0);

  for(int i = 0; i < xPosition.length; i++) {

    ellipse(xPosition[i], yPosition[i], flakeSize[i], flakeSize[i]);

    if(direction[i] == 0) {
      xPosition[i] += map(flakeSize[i], minFlakeSize, maxFlakeSize, .1, .5);
    } else {
      xPosition[i] -= map(flakeSize[i], minFlakeSize, maxFlakeSize, .1, .5);
    }

    yPosition[i] += flakeSize[i] + direction[i]; 

    if(xPosition[i] > width + flakeSize[i] || xPosition[i] < -flakeSize[i] || yPosition[i] > height + flakeSize[i]) {
      xPosition[i] = random(0, width);
      yPosition[i] = -flakeSize[i];
    }

  }

}

我只是不太了解如何将 for() 循环、整数和数组分离成函数,我可以将它们放入一个单独的 class 中,我将其命名为 Snow,这样我就可以轻松地在更大的代码中移动和操作它。到目前为止,这是我的(许多)尝试之一:

Class 选项卡:

class Snow{


int quantity = 15;
float [] xPosition = new float[quantity];
float [] yPosition = new float[quantity];
int [] flakeSize = new int[quantity];
int [] direction = new int[quantity];
int minFlakeSize = 10;
int maxFlakeSize = 20;

 Snow(){
  frameRate(30);
  noStroke();
  smooth();
}

void display() {
    flakeSize = round(random(minFlakeSize, maxFlakeSize));
    xPosition = random(0, width);
    yPosition = random(0, height);
    direction = round(random(0, 1));
  }



void update() {

  for(int i = 0; i < xPosition.length; i++) {

    ellipse(xPosition[i], yPosition[i], flakeSize[i], flakeSize[i]);

    if(direction[i] == 0) {
      xPosition[i] += map(flakeSize[i], minFlakeSize, maxFlakeSize, .1, .5);
    } else {
      xPosition[i] -= map(flakeSize[i], minFlakeSize, maxFlakeSize, .1, .5);
    }

    yPosition[i] += flakeSize[i] + direction[i]; 

    if(xPosition[i] > width + flakeSize[i] || xPosition[i] < -flakeSize[i] || yPosition[i] > height + flakeSize[i]) {
      xPosition[i] = random(0, width);
      yPosition[i] = -flakeSize[i];
    }

  }

}
}

主选项卡:

//Ice
Snow [] flakes = new Snow[15];
int quantity = 15;

void setup(){
 size(600,800); 
 flakes = new Snow[15];

}

void draw(){
background(0);
for(int i = 0; i < quantity; i++){
flakes[i].display();
flakes[i].update();
}

}

我确定这是分解代码并将它们分离到适当位置的一种非常简单的方法,但我似乎无法掌握它。 如果有人能帮助我完成这个过程,我将不胜感激。

这段代码没有意义,因为 Snow class 似乎在跟踪 每个 雪花,但是你有多个实例Snow.

与其尝试将随机代码复制粘贴到您的草图中,如果您后退一步,从小处着手,尝试理解,您会 运气会更好代码做什么,然后自己写代码。

第 1 步:你能创建一个 class 来封装 单个雪花 的数据和行为吗?

还不用担心多片雪花。只要得到一些非常基本的工作。这是一个简单的例子 class:

class SnowFlake{

  float x = random(width);
  float y = random(height);
  float r = random(10);

  void draw(){
   ellipse(x, y, r, r);

   y++;

   if(y > height){
     y = 0;
     x = random(width);
   }
  }
}

第 2 步:你能在单变量中使用 class 来绘制单个雪花吗?

您可以像这样创建一个小示例草图:

SnowFlake snowFlake;

void setup(){
  size(500, 500);
  snowFlake = new SnowFlake();
}

void draw(){
  background(0);
  snowFlake.draw();
}

在继续之前让这个雪花完美运行。

第 3 步:现在您可以使用单个雪花,是否可以使用数组或 ArrayList 创建多个雪花?

如果你一步一步地工作,一次添加一个东西会很容易:

ArrayList<SnowFlake> snowFlakes = new ArrayList<SnowFlake>();

void setup() {
  size(500, 500);

  for (int i = 0; i < 100; i++) {
    snowFlakes.add(new SnowFlake());
  }
}

void draw() {
  background(0);
  for (SnowFlake snowFlake : snowFlakes) {
    snowFlake.draw();
  }
}

您不能通过尝试盲目地将代码复制粘贴到您的草图中来进行编程。您必须真正理解它在做什么,并且您通常最好只基于这种理解编写自己的代码。祝你好运!