답변:
현재 제공되는 접근법 중 하나에 대한 나의 관심은 그것들이 '가변 속도'깜박임으로 이어질 수 있다는 것입니다. . 대신, 매개 변수 어딘가에 (렌더러에 대해 전역 또는 객체별로) slowBlinkTime
, 네 개의 상수가 있습니다 : slowBlinkRate
,, fastBlinkTime
및 fastBlinkRate
. 렌더링 할 때 객체의 남은 수명이보다 작 으면 ; fastBlinkTime
에서 깜박입니다 fastBlinkRate
. 그렇지 않으면 이보다 작 으면 slowBlinkTime
에서 깜박 slowBlinkRate
입니다. 한 걸음 더 나아가고 싶다면 독특한 blinkTime
s 배열을 가질 수 있습니다.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
테스트에서 나타내는 것)를 가정하지만, 적절한 상수를 조정하는 것만으로 3 분의 2, 3 분의 1과 같이 쉽게 조정할 수 있습니다. 이것은 또한 빠른 상태와 느린 상태 사이의 깜박임을 '동기화'하는 작업을 수행하지 않지만 비교적 간단합니다.
이것은 플러그를 꽂는 것이 간단해야하며 IMHO는 플레이어가 '느린'에서 '빠른'깜박임으로의 전환을 볼 수 있고 그들이 얼마나 오래 남았는지 알 수 있다는 실질적인 이점을 갖게됩니다. 나는에 대한 5 초와 같은 매개 변수 값으로 시작하는 것입니다 slowBlinkTime
및에 0.5 초 slowBlinkRate
에, 그리고 2 초 / 0.25s 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 That + .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
운영 비용을 절감 하고 깜박임이 더 빨리 진행되는 방법을 훨씬 더 많이 제어 할 수 있습니다.