何かが消えるのに近づくにつれて、フラッシュ/点滅をより頻繁にする方法を教えてください。


10

私のゲームでは、敵を倒すと、ヘルスパックやゴールドなどをドロップすることがあります。これには時間制限を設けて、手に取らなければ最終的には消えるようにしたい。ドロップが「死」に近づくほど、アイテムをより頻繁に点滅させたいです。「より頻繁に点滅する」アルゴリズムをどのように実行しますか?

回答:


2

現在提供されているアプローチのどちらかに関する私の懸念は、どちらも「可変速」点滅につながることです。これは、プレイヤーの注意をそらすだけでなく、オブジェクトが消えるまでにどれくらいの時間が残っているかを正確に測定することも困難にします。代わりに、あなたのパラメータのどこかに(彼らはレンダラまたはオブジェクトごとにグローバルにするかどうか)私は4つの定数を持っているでしょう:slowBlinkTimeslowBlinkRatefastBlinkTimefastBlinkRate。レンダリング時に、オブジェクトの残りの寿命が未満の場合fastBlinkTimeは、で点滅させfastBlinkRateます。それ以外の場合はslowBlinkTime、で点滅しslowBlinkRateます。さらにステップを進めたい場合は、一連の個別blinkTimeのとblinkRatesを1つずつチェックしますが、実際にはやり過ぎである可能性が高く、「警告」状態と「クリティカル」状態だけで十分です。コードは次のようになります。

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は、テストでが表すものです)が、適切な定数を微調整するだけで、3分の2をオン、3分の1をオフにするように簡単に調整できます。これはまた、高速状態と低速状態の間で点滅を「同期」するために何もしませんが、それは磨くことは比較的簡単です。

これはプラグインするのが簡単で、プレーヤーが「遅い」から「速い」点滅に切り替わるのを見て、どれだけ長く残っているかを正確に知ることができるという実質的な利点があります。私はのための5Sのようなパラメータ値で開始するslowBlinkTimeためと0.5秒slowBlinkRate、および2秒/ 0.25秒のためにfastBlinkTimefastBlinkRate、それは間違いなくあなたの特定のゲームに依存します。


わかりません。点滅がどんどん速くなれば、それはオブジェクトがちょうど2つのモードよりどれだけ長く残っているかについてのより良いゲージではないでしょうか?
Daniel Kaplan 2013

1
@tieTYT問題は、特に点滅の速度が可変である場合、ユーザーが(a)オブジェクトが点滅している速さを正確に判断し、(b)それをどれだけ長く生きなければならないかと関連付けることが難しいことです。0から100までのスライダーと、0、50、100の位置にある「スイッチ」を想像してください。スライダーの値を5〜10%の範囲で推測できるかもしれませんが、スイッチがオンになっている値を正確に把握できます。また、位置よりもレートを測定するのがはるかに困難です。
Steven Stadnicki 2013

投票が示唆することにもかかわらず、私はこれが最良の答えだと思います。さらに、(少なくとも概念的には)実装がはるかに簡単です。私の回答はより多くの票を獲得しましたが、視覚的にはまだ満足していません。あなたのアプローチは満足のいく見た目を与えます。
Daniel Kaplan

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))
グスタボ・マシエル

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

自分で提案したソリューションより少し長くなりますがsin、コストとpow操作を節約でき、点滅の速度をより細かく制御できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.