Kaybolmaya yaklaştıkça flaş / göz kırpma yaptığım bir şeyi nasıl daha sık yapabilirim?


10

Oyunumda bir düşmanı öldürdüğünüzde sağlık paketi veya altın gibi bir şey düşebilirler. Bunun bir zaman sınırlaması olmasını istiyorum, böylece onu almazsanız sonunda kaybolur. Düşürme "ölüm" ne kadar yakın öğe daha sık yanıp sönmesini istiyorum. "Daha sık yanıp sönen" algoritmayı nasıl yapıyorsunuz?

Yanıtlar:


2

Şu anda sunulan yaklaşımlardan herhangi biriyle ilgili endişem, her ikisinin de 'değişken hızlı' yanıp sönmesine yol açmasıdır, bu da sadece oyuncular için rahatsız edici olmakla kalmaz, aynı zamanda bir nesnenin kaybolmadan önce ne kadar süre kaldığını da ölçmeyi zorlaştırır . Bunun yerine, parametrelerde bir yere (bir nesne başına esasına gerçekleyicisi veya küresel olsun) Dört sabitleri olurdu: slowBlinkTime, slowBlinkRate, fastBlinkTimeve fastBlinkRate. Oluştururken, nesnenizin kalan ömrü daha azsa fastBlinkTime, öğeyi yanıp söner fastBlinkRate; aksi halde küçükse slowBlinkTimeyanıp söner slowBlinkRate. Bir adım daha ileri gitmek isterseniz, farklı blinkTimes veblinkRateve bunları tek tek kontrol edin, ancak pratikte aşırıya kaçması ve sadece 'uyarı' ve 'kritik' durumlara sahip olması yeterlidir. Kod şöyle görünecektir:

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
}

Bu kodun yarı açık, yarı kapalı yanıp sönme döngüsüne sahip olduğunu ( 0.5ftestte gösterilenin bu olduğunu), ancak uygun sabiti ayarlayarak üçte iki açık, üçte bir kapalı gibi bir şey için kolayca ayarlanabileceğini unutmayın. Bu aynı zamanda hızlı ve yavaş durumlar arasında yanıp sönmeyi 'senkronize etmek' için hiçbir şey yapmaz, ancak cilalamak nispeten kolaydır.

Bu takmak kolay olmalı ve IMHO'nun oyuncuların `` yavaş '' dan 'hızlı' yanıp sönmeye geçişini görebilecekleri ve tam olarak ne kadar süre kaldıklarını bildikleri önemli bir avantaja sahip olacak. Ben 5s for slowBlinkTimeve 0.5s for slowBlinkRateve 2s / 0.25s için parametre değerleriyle başlayacağım fastBlinkTimeve fastBlinkRatebu kesinlikle sizin oyununuza bağlı.


Anlamıyorum. Yanıp sönme hızlanır ve hızlanırsa, nesnenin tam olarak ne kadar süre kaldığını 2 moddan daha iyi ölçmek olmaz mı?
Daniel Kaplan

1
@tieTYT Sorun, özellikle yanıp sönme hızı değişken olduğunda, kullanıcıların (a) bir nesnenin ne kadar hızlı yanıp söndüğünü tam olarak belirlemesi ve (b) bunu ne kadar uzun süre yaşamak zorunda olduğu ile ilişkilendirmesi zor. 0, 50 ve 100 konumlarında bir 'anahtar' ile 0 ila 100 arasında bir kaydırıcıya sahip olduğunuzu düşünün; insanlar kaydırıcının değerini% 5-10'a kadar tahmin edebilir, ancak anahtarın tam olarak hangi değerin açık olduğunu bilirler - ve bir hızı bir konumdan ölçmek çok daha zordur.
Steven Stadnicki

Oyların önerdiğine rağmen, bunun en iyi cevap olduğunu düşünüyorum. Ek olarak, uygulanması en azından daha kolaydır (en azından kavramsal olarak). Cevabım daha fazla oy aldı, ancak hala görsel olarak bundan memnun değilim. Yaklaşımınız tatmin edici bir görünüm verecektir.
Daniel Kaplan

14

T T'den 0'a düşerse, günah ((T - t) ²) gibi bir şey kullanabilirsiniz, sayı> 0 ise nesneyi çizersiniz, eğer <0 ise


Bunu kendim denedim ve onunla uğraşmak zorunda kaldım. Benim için T 100 idi. Bu denklem her zaman süper hızlı bir şekilde yanıp sönmeyi sağladı. Yavaşlatmak için denklemi günah olarak değiştirdim (((T - t) / 10) ²). Bu, / 6 ve / 7 gibi sayılarla uğraştıktan sonra oldu.

Bunu da denedim: günah ((T - t) ² * 1/100)

Ve sonra, damlanın neredeyse görülebildiği kadar görünmez görünmesinden hoşlanmadım. Nadiren görünmez olmasını istedim. Bunu yaparak başardım: sin ((T - t) ² * 1/100) + .5 Bu + .5 sinüs çizgisini yukarı kaydırır, böylece sık sık <0 olmaz.

Bunların hiçbiri tam istediğim gibi olmadı. Sorun, yanıp sönmenin çok erken başlamasıdır. Damla 3 saniye boyunca görünür olmasını ve sonra yanıp sönmeye başlamak istedim. Bunu başarmak için şöyle bir şey yaptım:

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

Bu x3 saniye olurdu.

Ayrıca, bu yanıp sönmenin nasıl görüneceğini görselleştirmek için tüm zaman boyunca kullandığım araç olduğunu belirtmek gerekir . Bunun görsel araç olmadan 5 kat daha uzun süreceğini düşünüyorum.


Harika, bu çözümü seviyorum, Başka bir hızlı yol olurdusin(t * pow((t/T), 1.5))
Gustavo Maciel

4

Belki başka bir değişkenin yardımıyla?

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

Kendinizi önerdiğiniz çözümden biraz daha uzun, ancak kendinizi maliyetten sinve powişlemlerden tasarruf edersiniz ve yanıp sönmenin nasıl daha hızlı gittiğini daha fazla kontrol edersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.