当我的事物逐渐消失时,如何使其更频繁地闪烁/闪烁?


10

在我的游戏中,当您杀死敌人时,他们可能会掉落医疗包或金币之类的东西。我希望它有一个时间限制,以便如果您不接听,它最终会消失。我希望该项目越频繁地闪烁,以使液滴接近“死亡”。您如何执行“更频繁地闪烁”算法?

Answers:


2

我对当前提供的两种方法的担忧是,它们都将导致“变速”闪烁,这不仅会分散玩家的注意力,而且还会使得很难准确地确定物体消失之前还有多长时间。相反,在某处你的参数(无论它们是全球性的渲染器或在每个对象的基础上)我将有四个常量:slowBlinkTimeslowBlinkRatefastBlinkTimefastBlinkRate。渲染时,如果对象的剩余寿命少于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,但这绝对取决于您的特定游戏。


我不明白 如果闪烁的速度越来越快,那岂不是比2种模式更准确地衡量物体离开的时间了吗?
丹尼尔·卡普兰

1
@tieTYT问题在于,尤其是当闪烁的速率是可变的时,用户很难(a)准确确定物体的闪烁速度,并且(b)将该物体与存活时间关联起来。想象一下,有一个滑块从0到100相对于“开关”,其位置分别为0、50和100;人们可能会猜到滑块的值在5%到10%之内,但是他们会确切知道该开关处于什么值-而且比位置更难衡量一个比率。
Steven Stadnicki

尽管有投票建议,但我认为这是最佳答案。另外,它更容易实现(至少在概念上)。我的答案获得了更多的选票,但我仍然对它不满意。您的方法将使您满意。
丹尼尔·卡普兰

14

如果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秒。

另外值得注意的是,这是我一直使用的工具,用于可视化闪烁的外观。我认为如果没有可视工具,这将花费5倍的时间。


太棒了,我喜欢这个解决方案,另一种快速的方法是做sin(t * pow((t/T), 1.5))
Gustavo Maciel

4

也许借助另一个变量?

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

它比您自己提出的解决方案要长一些,但可以节省成本sinpow操作成本,并且可以更好地控制闪烁的速度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.