Вы создаете один экземпляр Snowflake
.Вам нужно создать больше, а затем обновить каждый.
В вашем случае вы должны сначала инициализировать массив из Snowflake
объектов (вверху, где вы объявляете свои переменные).Вот пример выделения массива из 99 Snowflake
объектов:
int numSnowflakes = 99;
Snowflake[] snowflakes = new Snowflake[numSnowflakes];
Затем в setup()
вы можете инициализировать каждый элемент массива как новый Snowflake
экземпляр:
for(int i = 0 ; i < numSnowflakes; i++){
snowflakes[i] = new Snowflake(25, 25);
}
Наконец, в draw()
вы можете циклически проходить через каждый объект, чтобы он мог descend()
и update()
:
for(int i = 0 ; i < numSnowflakes; i++){
snowflakes[i].descend();
snowflakes[i].update();
}
Если вы еще не знакомы с массивами в обработке, я могу порекомендовать следующие ресурсы:
- Учебное пособие по обработке массивов
- Пример обработки объектов ArrayObjects
- Кодировка массива объектов Даниэля Шиффмана Учебное пособие по обучению видео вместе с Массивами и циклами
После того, как вы это поняли, вам следует также изучить ArrayList .
Обновление Чтобы ответить на ваш комментарий, вы можете использовать матричные вызовы push / pop для дальнейшей изоляции систем координат и поворота изображения вокруг его центра:
x = amp * sin((frameCount/period) * TWO_PI);
// enter local coordinate system #1
pushMatrix();
// move to flake position
translate(firstXPos,this.pos.y);
// enter local coordinate system #2
pushMatrix();
// move to updated (oscillated) x position
translate(x, this.pos.y);
// rotated from translated position (imageMode(CENTER) helps rotate around centre)
rotate(frameCount * 0.1);
// render the image at it's final transformation
image(snowflakeImg,0,0, imgWidth, imgHeight);
popMatrix();
popMatrix();
Для получения дополнительной информации посмотрите Учебное пособие по обработке систем координат .
Для rВ качестве примера приведу тестовый скетч, который я использовал с каждой пластинкой на произвольной ширине:
PImage snowflakeImg;
Snowflake snowFlake;
int numSnowflakes = 99;
Snowflake[] snowflakes = new Snowflake[numSnowflakes];
void setup() {
imageMode(CENTER);
//snowflakeImg = loadImage("snowflake.png", "png");
PGraphics snowflakeG = createGraphics(25,25);
snowflakeG.beginDraw();
snowflakeG.rectMode(CENTER);
snowflakeG.rect(0,0,25,25);
snowflakeG.endDraw();
snowflakeImg = snowflakeG;
for(int i = 0 ; i < numSnowflakes; i++){
snowflakes[i] = new Snowflake(25, 25);
}
size(800,600);
}
void draw(){
background(0);
for(int i = 0 ; i < numSnowflakes; i++){
snowflakes[i].descend();
snowflakes[i].update();
}
}
class Snowflake{
float imgWidth;
float imgHeight;
PVector pos;
PVector vel;
final float firstXPos;
float a = 0.0;
float angularVel = 0.01;
float x;
float amp;
float period;
Snowflake(float xWidth, float yHeight){
imgWidth = xWidth;
imgHeight = yHeight;
pos = new PVector(random(width), 0);
vel = new PVector(0,1);
firstXPos = this.pos.x;
}
void descend(){
amp = 75;
period = 200;
x = amp * sin((frameCount/period) * TWO_PI);
// enter local coordinate system #1
pushMatrix();
// move to flake position
translate(firstXPos,this.pos.y);
// enter local coordinate system #2
pushMatrix();
// move to updated (oscillated) x position
translate(x, this.pos.y);
// rotated from translated position (imageMode(CENTER) helps rotate around centre)
rotate(frameCount * 0.1);
// render the image at it's final transformation
image(snowflakeImg,0,0, imgWidth, imgHeight);
popMatrix();
popMatrix();
//creating a line for oscillation reference
//translate(firstXPos, this.pos.y);
//stroke(255);
//line(0,0,x,y);
}
void update(){
pos.add(vel);
a += angularVel;
}
}
Вы также должны проверить Задача Дэниела Шиффмана по кодированию Snowfall .Несмотря на то, что это p5.js, ту же логику можно легко применить в обработке.