回答:
現在提供されているアプローチのどちらかに関する私の懸念は、どちらも「可変速」点滅につながることです。これは、プレイヤーの注意をそらすだけでなく、オブジェクトが消えるまでにどれくらいの時間が残っているかを正確に測定することも困難にします。代わりに、あなたのパラメータのどこかに(彼らはレンダラまたはオブジェクトごとにグローバルにするかどうか)私は4つの定数を持っているでしょう:slowBlinkTime
、slowBlinkRate
、fastBlinkTime
とfastBlinkRate
。レンダリング時に、オブジェクトの残りの寿命が未満の場合fastBlinkTime
は、で点滅させfastBlinkRate
ます。それ以外の場合はslowBlinkTime
、で点滅しslowBlinkRate
ます。さらにステップを進めたい場合は、一連の個別blinkTime
のとblinkRate
sを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秒のために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秒です。
また注目に値するのは、これが私がずっと点滅している様子を視覚化するためにずっと使っていたツールであることです。ビジュアルツールがなければ、これは5倍長くかかったと思います。
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
操作を節約でき、点滅の速度をより細かく制御できます。