2009-09-20 40 views
2

我试图做一个闪烁的对象,即将它的alpha值从0增加到255(逐渐),然后回到0,然后重复。优雅地向上和向下计数

有没有一种方法可以做到这一点,而不使用一些布尔值?它前往增量很简单:

alpha = time.elapsed()%256; 

但是,什么是一个很好的方式得到它算后再次回落?

+1

为什么你需要这个?请不要说“表演”。如果你想制作一个闪烁的对象,那意味着每秒最多60次更新,这意味着无论你如何做到这一点,它在性能方面都会达到零差。那么让你的代码难以阅读的原因是什么? – jalf 2009-09-20 22:21:10

+0

@jalf:其实我们的目标是让阅读更容易。使用一对if语句来跟踪它是否正在递增或递减使其复杂化。如果这可以在一条线上完成,我会说这更简单。 – mpen 2009-09-20 22:30:23

+1

较短,但我不会称它更简单或更具可读性。如果它是如此“简单”,为什么你需要问这个问题?你无法自己弄清楚,所以当你从现在起3个月后遇到代码时,你相信什么能让你明白? – jalf 2009-09-20 23:08:13

回答

15

如何使用sin函数,这样的衰落是更愉快的,你会得到你想要的。

+0

代码示例? (a) – mpen 2009-09-20 23:17:37

+2

'alpha = static_cast (sin((time.elapsed()%10)*(M_PI/10))* 255);'?我认为? 10可以用你希望的任何间隔来代替,最好用一个常量代替'M_PI/10'(例如'const double frac = M_PI/10;') – GRB 2009-09-21 01:03:26

+0

Hrm ...你说得对,我认为这样做看起来稍微好点。 1000毫秒的时间相当不错。 – mpen 2009-09-21 02:41:37

13

也许你可以这样来做:

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

+1不得不盯着那一秒钟来围绕我的大脑 – 2009-09-20 22:08:55

+1

我认为它应该是511和255,不是吗?不应该包括256。无论如何,知道必须有这样的伎俩,我只是忘记了它。谢谢!很棒。 – mpen 2009-09-20 22:18:12

+1

这将从abs(0%510 - 254)= 254开始。这看起来很尴尬。 – Joren 2009-09-20 22:20:00

5

ABS(((X + 255)%510) - 255)将线性去从0到255 0和255之间的x和线性地从255到0之间的255到510.然后它重复(当然510期)。

+0

我想技术上这是正确的答案,因为我先说增量。某事的答案从递减开始,但是它的操作更少,所以我更喜欢它。无论哪种方式都很好;) – mpen 2009-09-20 22:27:56