2009-09-20 2 views
2

Я пытаюсь сделать мигающий объект, т. Е. Увеличивать его значение альфа от 0 до 255 (постепенно), а затем вернуться к 0 и повторить.Элегантно подсчитывать вверх и вниз

Есть ли способ, которым я могу это сделать, не используя некоторые логические? Получить его приращение легко:

alpha = time.elapsed()%256; 

Но какой хороший способ вернуть его обратно после этого?

+1

Зачем вам это нужно? Пожалуйста, не говорите «производительность». если вы хотите создать проблесковый объект, это означает не более 60 обновлений в секунду, а это означает, что независимо от того, как вы это делаете, он делает нулевую разницу по производительности. Итак, в чем причина, по которой ваш код становится более трудным для чтения? – jalf

+0

@jalf: На самом деле целью было упростить чтение. Использование пары if для отслеживания того, увеличивает или уменьшает ее значение, усложняет ее. Если это можно сделать на одной линии, я бы сказал, что это проще. – mpen

+1

Короче, но я бы не назвал его более простым или читаемым. если это было так просто, зачем вам задавать этот вопрос? Вы не могли понять это сами, так что заставляет вас поверить, что вы сможете понять это, когда вы столкнетесь с кодом через 3 месяца? – jalf

ответ

15

Как насчет использования функции sin, таким образом выцветание более приятное, и вы получите то, что хотите.

+0

Пример кода? (a) – mpen

+2

'alpha = static_cast (sin ((time.elapsed()% 10) * (M_PI/10)) * 255);'? Я думаю? 10 можно заменить любым интервалом, который вы пожелаете, и оптимально замените M_PI/10 на константу (например, 'const double frac = M_PI/10;') – GRB

+0

Hrm ... вы правы, я думаю, что это делает выглядите так немного лучше. Период в 1000 мс довольно приличный. – mpen

13

Может быть, вы могли бы сделать это следующим образом:

alpha = abs((time.elapsed() % 510) - 254); 
+0

+1 мне пришлось смотреть на это секунду, чтобы обернуть вокруг меня мозг. –

+1

Я думаю, что это должно быть 511 и 255, нет? 256 не следует включать. Во всяком случае, знал, что должен быть такой трюк, я просто забыл об этом. Благодаря! Прекрасно работает. – mpen

+1

Это начнется с abs (0% 510 - 254) = 254. Это кажется довольно неудобным. – Joren

5

абс (((х + 255)% 510) - 255) будет идти линейно от 0 до 255 х от 0 до 255, и линейно от 255 до 0 для х между 255 и 510. Затем он повторяется (с периодом 510, конечно).

+0

Я догадываюсь, что это правильный ответ, так как я сказал приращение в первую очередь. Ответ sth начинается с декрементирования, но меньше операций, поэтому я действительно предпочитаю его. В любом случае это нормально;) – mpen

Смежные вопросы