Математика это секрет. Часто это так.
Есть пара вещей, которые вам необходимо отслеживать, чтобы выполнить 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;
}
Я буду торчать, поэтому не стесняйтесь, если у вас есть вопросы.
Веселись!