Bagaimana saya membuat sesuatu yang saya flash / berkedip lebih sering saat semakin dekat dengan menghilang?


10

Dalam permainan saya ketika Anda membunuh musuh, mereka mungkin menjatuhkan sesuatu seperti paket kesehatan atau emas. Saya ingin ini memiliki batas waktu sehingga akhirnya menghilang jika Anda tidak mengambilnya. Saya ingin item lebih sering berkedip semakin dekat drop sampai "mati". Bagaimana Anda melakukan algoritma "lebih sering flashing"?

Jawaban:


2

Kekhawatiran saya dengan salah satu pendekatan yang saat ini ditawarkan adalah bahwa keduanya akan menyebabkan berkedip 'kecepatan variabel', yang tidak hanya mengganggu bagi para pemain tetapi juga membuat sulit untuk mengukur dengan tepat berapa lama suatu benda telah tersisa sebelum hilang. . Sebaliknya, di suatu tempat di parameter Anda (apakah mereka menjadi global untuk penyaji atau pada basis per-objek) saya akan memiliki empat konstanta: slowBlinkTime, slowBlinkRate, fastBlinkTimedan fastBlinkRate. Saat merender, jika sisa umur objek Anda kurang dari fastBlinkTime, maka kedipkan di fastBlinkRate; jika tidak, jika kurang dari slowBlinkTime, maka blink di slowBlinkRate. Jika Anda ingin melangkah lebih jauh maka Anda dapat memiliki berbagai blinkTimes danblinkRatedan memeriksanya satu per satu, tetapi dalam praktiknya itu mungkin berlebihan dan hanya memiliki status 'peringatan' dan 'kritis' sudah cukup. Kode akan terlihat seperti ini:

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
}

Perhatikan bahwa kode ini mengandaikan siklus blink setengah aktif dan setengah mati (itulah yang 0.5fdiwakili dalam tes), tetapi dapat dengan mudah diubah untuk sekitar dua pertiga aktif, sepertiga off hanya dengan mengubah konstanta yang sesuai. Ini juga tidak melakukan apa pun untuk 'menyinkronkan' berkedip antara keadaan cepat dan lambat, tapi itu relatif mudah untuk dipoles.

Ini harus mudah untuk dihubungkan, dan itu akan memiliki keuntungan substansial IMHO bahwa pemain akan dapat melihat beralih dari 'lambat' ke 'cepat' berkedip dan tahu persis berapa lama mereka telah pergi. Saya akan mulai dengan nilai parameter seperti 5s untuk slowBlinkTimedan 0.5s untuk slowBlinkRate, dan 2s / 0.25s untuk fastBlinkTimedan fastBlinkRate, tapi itu pasti tergantung pada permainan khusus Anda.


Saya tidak mengerti. Jika kedipan menjadi lebih cepat dan lebih cepat, bukankah itu menjadi pengukur yang lebih baik untuk berapa lama objek yang tersisa dari hanya 2 mode?
Daniel Kaplan

1
@tieTYT Masalahnya adalah, terutama ketika laju berkedip adalah variabel, sulit bagi pengguna untuk (a) menentukan dengan tepat seberapa cepat suatu objek berkedip, dan (b) mengaitkannya dengan berapa lama harus hidup. Bayangkan memiliki slider dari 0 hingga 100 vs 'switch' dengan posisi 0, 50, dan 100; orang mungkin bisa menebak nilai slider dalam 5-10%, tetapi mereka akan tahu persis nilai apa yang dihidupkan saklar - dan itu jauh lebih sulit untuk mengukur tingkat daripada posisi.
Steven Stadnicki

Terlepas dari apa yang disarankan oleh suara, saya pikir ini adalah jawaban terbaik. Selain itu, cara ini lebih mudah untuk diterapkan (setidaknya secara konseptual). Jawaban saya mendapat lebih banyak suara, tetapi saya masih tidak puas dengan itu secara visual. Pendekatan Anda akan memberikan tampilan yang memuaskan.
Daniel Kaplan

14

Jika t turun dari T ke 0, Anda bisa menggunakan sesuatu seperti sin ((T - t) ²) maka jika angkanya> 0 Anda menggambar objek, jika <0 Anda tidak


Saya sudah mencoba ini sendiri dan saya harus mengotak-atiknya. Bagi saya T adalah 100. Persamaan ini membuat semuanya berkedip sangat cepat sepanjang waktu. Jadi untuk memperlambatnya, saya mengubah persamaan menjadi sin (((T - t) / 10) ²). Ini setelah bermain-main dengan angka-angka seperti / 6 dan / 7.

Saya juga mencoba ini: sin ((T - t) ² * 1/100)

Dan kemudian aku tidak suka bagaimana tetesan itu nampak tak terlihat sebanyak yang terlihat. Saya ingin itu jarang terlihat. Saya menyelesaikannya dengan melakukan ini: sin ((T - t) ² * 1/100) + .5 Itu + .5 menggeser "garis" sinus ke atas sehingga tidak menjadi <0 lebih sering.

Tak satu pun dari ini bekerja persis seperti yang saya inginkan. Masalahnya adalah bahwa kedipan akan mulai terlalu cepat. Saya ingin agar drop terlihat selama 3 detik dan kemudian mulai berkedip. Untuk mencapai itu, saya melakukan sesuatu seperti ini:

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

Itu xakan menjadi 3 detik.

Juga perlu dicatat adalah bahwa ini adalah alat yang saya gunakan sepanjang waktu untuk memvisualisasikan bagaimana tampilan yang berkedip. Saya pikir ini akan memakan waktu 5x lebih lama tanpa alat visual.


Luar biasa, saya suka solusi ini, Cara cepat lainnya adalahsin(t * pow((t/T), 1.5))
Gustavo Maciel

4

Mungkin dengan bantuan variabel lain?

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

Ini sedikit lebih lama daripada solusi yang Anda usulkan pada diri sendiri, tetapi Anda menghemat sendiri biaya sindan powpengoperasian, dan Anda memiliki kendali lebih besar atas bagaimana kedipan mata berjalan lebih cepat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.