사라지는 것에 가까워 질 때 플래시 / 깜박 거리는 것을 더 자주 만들려면 어떻게해야합니까?


10

내 게임에서 적을 죽이면 체력 팩이나 금 같은 물건을 떨어 뜨릴 수 있습니다. 시간 제한이 있기 때문에 선택하지 않으면 결국 사라집니다. 드롭이 "죽음"에 가까워 질수록 항목이 더 자주 깜박이기를 원합니다. "더 자주 깜박이는"알고리즘을 어떻게 수행합니까?

답변:


2

현재 제공되는 접근법 중 하나에 대한 나의 관심은 그것들이 '가변 속도'깜박임으로 이어질 수 있다는 것입니다. . 대신, 매개 변수 어딘가에 (렌더러에 대해 전역 또는 객체별로) slowBlinkTime, 네 개의 상수가 있습니다 : slowBlinkRate,, fastBlinkTimefastBlinkRate. 렌더링 할 때 객체의 남은 수명이보다 작 으면 ; fastBlinkTime에서 깜박입니다 fastBlinkRate. 그렇지 않으면 이보다 작 으면 slowBlinkTime에서 깜박 slowBlinkRate입니다. 한 걸음 더 나아가고 싶다면 독특한 blinkTimes 배열을 가질 수 있습니다.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, 그러나 그것은 특정 게임에 확실히 의존합니다.


이해가 안 돼요 깜박임이 더 빨라지고 빨라지면 물체가 2 개의 모드보다 얼마나 오래 남아 있는지 정확하게 측정하는 것이 좋지 않습니까?
Daniel Kaplan

1
@tieTYT 문제는, 특히 깜박임 속도가 가변적 일 때, 사용자가 (a) 얼마나 빠르게 객체가 깜박이고 있는지, (b) 얼마나 오래 살아야 하는지를 연관시키는 것이 어렵다는 것입니다. 0, 100 및 100에 위치가있는 '스위치'대 슬라이더가 0에서 100 사이에 있다고 상상해보십시오. 사람들은 슬라이더의 값을 5-10 % 내로 추측 할 수 있지만 스위치가 어떤 값인지 정확하게 알 수 있으며 위치보다 속도를 측정하는 것이 훨씬 어렵습니다.
Steven Stadnicki

투표가 제안한 내용에도 불구하고 이것이 최선의 답변이라고 생각합니다. 또한 (적어도 개념적으로) 구현하기가 더 쉽습니다. 내 답변에 더 많은 투표권이 있지만 여전히 시각적으로 만족스럽지 않습니다. 당신의 접근 방식은 만족스럽게 보일 것입니다.
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 That + .5는 사인 "라인"을 위로 올리면 자주 <0이되지 않습니다.

이 중 어느 것도 내가 원하는 방식대로 작동하지 않았습니다. 문제는 깜박임이 너무 빨리 시작된다는 것입니다. 드롭을 3 초 동안 표시 한 다음 깜박이기 시작했습니다. 이를 달성하기 위해 다음과 같은 작업을 수행했습니다.

isVisible(drop)
  if drop.t > x
    return true
  else
    sin((T - x - drop.t * 1/100) + .5 >= 0

x3 초 것입니다.

또한 이것이 깜박임이 어떻게 보일지를 시각화하기 위해 내가 사용했던 도구 라는 점도 주목할 가치가 있습니다. 나는 시각적 도구가 없다면 이것이 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

제안한 솔루션보다 약간 길지만 비용 sinpow운영 비용을 절감 하고 깜박임이 더 빨리 진행되는 방법을 훨씬 더 많이 제어 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.