Изменение цвета сферы со временем (обработка) - PullRequest
2 голосов
/ 01 мая 2020

Я новый программист по обработке, поэтому, пожалуйста, будьте осторожны. Обычно мой код более длинный и сложный, но я написал для вас простой код, который я могу адаптировать к своему коду:

int speed = 1;
int x, z = 50;

void setup() {
  size(400, 400, P3D);
}

void draw() {
  background(0);
  noStroke();
  lights();
  translate(x, height/2, z);
  fill(255,0,0);
  sphere(25);

  if (x > width -50)
    noLoop();

  x += speed;
}

Итак, как вы видите, сфера начинается с красного цвета и достигает конца окна. Я хочу изменить его цвет с красного на белый, и это должно занять 30 se c. достичь конца окна. Однако я не знаю как. Если ты поможешь мне, я буду счастлив. Примечание: я попробовал функцию lerpColor, но мне не помогло.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Математика это секрет. Часто это так.

Есть пара вещей, которые вам необходимо отслеживать, чтобы выполнить sh это: время, необходимое для пересечения экрана (вы сказали 30 секунд), скорость сферы скорость изменения цвета.

Прежде чем мы начнем, я предлагаю вам использовать float для ваших переменных, которые являются позициями и скоростями. Целые числа сделают эту работу, но в какой-то момент, когда вам нужна точность, вы можете сожалеть, что не используете float или подобный тип.

Есть 2 способа справиться с изменениями во времени: вы можете рассчитать время и нарисовать то, что нужно быть нарисованным там, где он должен быть, или рассчитать, сколько кадров будет нарисовано за определенное время, и соответственно изменить положение. Преимущество первого метода заключается в возможности рисовать вещи там, где они должны быть, даже если система запаздывает (обработка снизит частоту кадров, если она не сможет ее соблюдать), тогда как со вторым часто легче работать. Мы воспользуемся go техникой частоты кадров, поскольку это не должно быть сложным, и поскольку большинству программ не потребуется столько ресурсов, что это снизит частоту кадров.

Частота кадров в обработке, также скорость, с которой работает основной l oop (draw() l oop). Поэтому мы выберем частоту кадров, которая позволит нам вычислить скорость сферы и скорость, с которой изменяется цвет. Остальные просто смотрят, как он движется.

Вот ваш пример, но модифицированный, поэтому он работает примерно так, как вы сказали:

float speed;
float x, z = 50;
float greenBlueStrength = 0;
float colorFadeRate = 1;
int fadeTimeInFrames;

void setup() {
  size(400, 400, P3D);
  frameRate(60); // 60 is the default framerate per second
  // so 30 seconds == (30*60) == 1800 frames
  // so you must have the speed to match
  fadeTimeInFrames = 60 * 30;
  speed = (width - 50) / (float)fadeTimeInFrames;
  colorFadeRate = 255 / (float)fadeTimeInFrames;
  println(colorFadeRate);
}

void draw() {
  background(0);
  textSize(30);
  text((millis()/1000) + " s. // color: " + (int)greenBlueStrength, 20, 50);
  // this is just to keep track of changes while they happen

  noStroke();
  lights();
  translate(x, height/2, z);
  fill(255, greenBlueStrength, greenBlueStrength);
  sphere(25);

  if (x > width -50) {
    noLoop();
  } // no actual change, but use brackets anyway, it's easier to read

  // updating what needs to be updated
  x += speed;
  greenBlueStrength += colorFadeRate;
}

Я буду торчать, поэтому не стесняйтесь, если у вас есть вопросы.

Веселись!

0 голосов
/ 01 мая 2020

Я думаю, что-то подобное будет работать:

int r=255,b=255,g=255;

...

void draw(){
...

  int percent=x/width*100;
  fill(r,b*percent,g*percent)
  sphere(25)

...
}

, поэтому сфера будет красной только слева от экрана и белой справа

...