Меня беспокоит любой из предлагаемых в настоящее время подходов: они оба приведут к миганию с переменной скоростью, что не только отвлекает игроков, но и затрудняет точную оценку того, как долго объект оставался до исчезновения. , Вместо этого, где - то в ваших параметрах (будь то глобальное для визуализатора или на основе каждого объекта) я бы четыре константы: slowBlinkTime
, slowBlinkRate
, fastBlinkTime
и fastBlinkRate
. При рендеринге, если оставшаяся жизнь вашего объекта меньше, чем fastBlinkTime
, мигайте fastBlinkRate
; в противном случае, если оно меньше slowBlinkTime
, тогда моргните slowBlinkRate
. Если вы хотите , чтобы дальше идти на шаг , то вы могли бы иметь множество различных blinkTime
с иblinkRate
s и проверяйте их один за другим, но на практике это может быть излишним, и достаточно просто иметь «предупреждение» и «критические» состояния. Код будет выглядеть примерно так:
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
в тесте), но его можно легко настроить, например, на две трети, на одну треть, просто изменив соответствующую константу. Это также ничего не делает для «синхронизации» мигания между быстрым и медленным состояниями, но это относительно просто для полировки.
Это должно быть просто для подключения, и это будет иметь ИМХО существенное преимущество в том, что игроки смогут увидеть переход от «медленного» к «быстрому» миганию и точно знать, сколько времени у них осталось. Я бы начал со значений параметров, таких как 5 с 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.
Я также попробовал это: грех ((T - T) ² * 1/100)
И тогда мне не понравилось, как капля казалась невидимой почти так же, как она была видна. Я хотел, чтобы это редко было невидимым. Я сделал это, выполнив это: sin ((T - t) ² * 1/100) + .5 что + .5 сдвигает синусоидальную линию так, чтобы она не становилась <0 как часто.
Ничто из этого не получилось так, как я хотел. Проблема в том, что мигание начнется слишком рано. Я хотел, чтобы капля была видна в течение 3 секунд, а затем начал мигать. Для этого я сделал что-то вроде этого:
Это
x
было бы 3 секунды.Также стоит отметить, что это инструмент, который я использовал все время, чтобы визуализировать, как будет выглядеть мигание. Я думаю, что без визуального инструмента это заняло бы в 5 раз больше времени.
источник
sin(t * pow((t/T), 1.5))
Может быть, с помощью другой переменной?
Это немного больше , чем решение вы предложили себя, но вы сэкономите себе дорогостоящие
sin
иpow
операции, и вы гораздо больше контроля над тем, как мигание идет быстрее.источник