Answers:
我对当前提供的两种方法的担忧是,它们都将导致“变速”闪烁,这不仅会分散玩家的注意力,而且还会使得很难准确地确定物体消失之前还有多长时间。相反,在某处你的参数(无论它们是全球性的渲染器或在每个对象的基础上)我将有四个常量:slowBlinkTime
,slowBlinkRate
,fastBlinkTime
和fastBlinkRate
。渲染时,如果对象的剩余寿命少于fastBlinkTime
,则将其闪烁为fastBlinkRate
;否则,如果小于slowBlinkTime
,则在闪烁slowBlinkRate
。如果您想更进一步,则可以使用一系列不同blinkTime
的,并且blinkRate
并逐一检查它们,但实际上这可能会过大,仅具有“警告”和“紧急”状态就足够了。代码看起来像这样:
float blinkCycle;
if ( entity.timeLeft < fastBlinkTime ) {
blinkCycle = entity.timeLeft/fastBlinkRate;
} else if ( entity.timeLeft < slowBlinkTime ) {
blinkCycle = entity.timeLeft/slowBlinkRate;
}
blinkCycle = blinkCycle - floor(blinkCycle); // find blinkCycle 'mod 1'
if ( (entity.timeLeft < slowBlinkTime) && (blinkCycle < 0.5f) ) {
renderBlinked(entity); // this should be the 'blinked' state, whether flashed or missing
} else {
renderNormal(entity); // the normal render for the entity
}
请注意,该代码假定一个半开,半关的闪烁周期(这就是0.5f
测试中所表示的),但是可以很容易地将其调整为三分之二,仅通过调整适当的常数即可减少三分之一。这也并没有使“快”和“慢”状态之间的闪烁“同步”。
这应该很容易插入,并且将具有恕我直言的实质优势,即玩家将能够看到从“慢速”到“快速”闪烁的切换,并确切知道他们还剩下多长时间。我将从5s for slowBlinkTime
和0.5s for slowBlinkRate
和2s / 0.25s for fastBlinkTime
和的参数值开始fastBlinkRate
,但这绝对取决于您的特定游戏。
如果t从T降到0,则可以使用sin((T-t)²)之类的东西,如果数字> 0,则绘制对象,如果<0,则不绘制对象
我已经亲自尝试过了,不得不修补一下。对我来说,T是100。这个方程使事物始终闪烁得非常快。因此,为了降低速度,我将方程式更改为sin(((T-t)/ 10)²)。这是在修改/ 6和/ 7之类的数字之后。
我也尝试过:sin((T-t)²* 1/100)
然后我不喜欢这滴几乎看不见的样子。我希望它几乎不可见。我通过这样做来实现:sin((T-t)²* 1/100)+ .5那+ .5将正弦“线”上移,以使其不会变得<0。
这些都没有按照我想要的方式工作。问题是闪烁将开始太早。我希望该液滴在3秒钟内可见,然后开始闪烁。为了做到这一点,我做了这样的事情:
isVisible(drop)
if drop.t > x
return true
else
sin((T - x - drop.t)² * 1/100) + .5 >= 0
那x
将是3秒。
sin(t * pow((t/T), 1.5))
也许借助另一个变量?
current_length = 4
length_decrease = 0.5
current_time = current_length
function update(delta_time)
if current_time > 0 then
draw()
end
current_time -= delta_time
if current_time < -current_length then
current_length -= length_decrease -- feel free to get creative here
if current_length < 0 then
disable_object()
end
current_time += current_length * 2
end
end
它比您自己提出的解决方案要长一些,但可以节省成本sin
和pow
操作成本,并且可以更好地控制闪烁的速度。