优雅地上下数
Posted
技术标签:
【中文标题】优雅地上下数【英文标题】:Count up and down elegantly 【发布时间】:2010-11-29 22:38:42 【问题描述】:我正在尝试制作一个闪烁的对象,即将它的 alpha 值从 0 增加到 255(逐渐),然后返回到 0,然后重复。
有没有办法在不使用布尔值的情况下做到这一点?让它增加很容易:
alpha = time.elapsed()%256;
但是在那之后让它再次倒计时的好方法是什么?
【问题讨论】:
为什么需要这个?请不要说“性能”。如果您想制作一个闪烁的对象,这意味着每秒最多更新 60 次,这意味着无论您如何执行此操作,它在性能方面的差异为零。那么让你的代码更难阅读的原因是什么? @jalf:实际上我们的目标是让它更易于阅读。使用几个 if 语句来跟踪它当前是递增还是递减会使它复杂化。如果这可以在一条线上完成,我会说这更简单。 更短,但我不会说它更简单或更易读。如果它是如此“简单”,你为什么需要问这个问题?你自己也想不通,那么是什么让你相信在 3 个月后遇到代码时你就能弄明白? @jalf:因为有时经过数小时的编程,您的大脑无法正常工作,而您会被更简单的事情所困扰。相信我,我会在 3 个月内理解它。 【参考方案1】:使用 sin 函数怎么样,这样褪色更令人愉悦,你会得到你想要的。
【讨论】:
alpha = static_cast<int>(sin((time.elapsed()%10)*(M_PI/10))*255);
?我想? 10 可以替换为您希望的任何间隔,最好将M_PI/10
替换为常数(例如const double frac = M_PI/10;
)
Hrm...你是对的,我认为这看起来确实稍微好一点。 1000ms 的周期相当不错。【参考方案2】:
也许你可以这样做:
alpha = abs((time.elapsed() % 510) - 254);
【讨论】:
+1 不得不盯着它看一秒钟才能把我的大脑包裹起来 我觉得应该是511和255吧?不应该包括 256。无论如何,知道必须有这样的把戏,我只是忘记了abs
ing。谢谢!效果很好。
这将从 abs(0 % 510 - 254) = 254 开始。这看起来很尴尬。
哦不...然后255重复两次...应该是510和255然后?
@Johan:您可以在模内添加+254
使其从 0 开始。【参考方案3】:
abs(((x + 255) % 510) - 255) 将线性地从 0 到 255,x 介于 0 和 255 之间,线性地从 255 到 0,x 介于 255 和 510 之间。然后它重复(带有句点510 当然)。
【讨论】:
我想从技术上讲这是正确的答案,因为我先说增量。 sth的答案是从递减开始,但操作较少,所以我其实更喜欢它。无论哪种方式都可以;)以上是关于优雅地上下数的主要内容,如果未能解决你的问题,请参考以下文章