Ketika pemain kehilangan seluruh hidup mereka, saya ingin seluruh layar permainan menjadi abu-abu, tetapi tidak berhenti memperbarui segera. Saya juga lebih suka memudar menjadi abu-abu daripada tiba-tiba kehilangan semua warna. Semua yang saya temukan sejauh ini adalah tentang mengambil tangkapan layar dan membuatnya skala abu-abu, atau membuat skala abu-abu tekstur tertentu. Apakah ada cara untuk mengubah seluruh lapangan bermain dan semua objek di dalam menjadi skala abu-abu tanpa mengulangi semuanya?
Cara termudah untuk melakukan ini adalah membuat shader untuknya (Lihat kode di bawah). Gambar semuanya ke target render, lalu gunakan shader untuk menggambar itu ke buffer belakang Anda
Dalam catatan kode permainan Anda saat pemain meninggal, maka dalam render berikutnya, sisipkan parameter shader antara 1 (warna penuh) dan 0 (skala abu-abu penuh) sesuai dengan CurrentTime-DeadTime / FadeTime
Alasan untuk 0,3, 0,59 dan 0,11 adalah karena mata manusia tidak memperlakukan warna secara sama, nilai-nilai tersebut memberikan citra skala abu-abu yang lebih baik.
Beberapa waktu yang lalu saya mengubah rgb menjadi abu-abu tetapi tidak dapat menemukan sumber yang dapat dipercaya, jadi saya hanya menggunakan 1.0 / 3,1.0 / 3,1.0 / 3 ... Dapatkah Anda memberikan sumber untuk konstanta numerik 0.2.0.59.0.11?
Trevor Boyd Smith
Saya telah berusaha mencari dari mana saya mendapatkan kode itu, tetapi belum dapat menemukannya. Berikut adalah halaman Pengembang Katup yang menggunakan nilai yang berbeda (tetapi hampir serupa) (0,222, 0,707, 0,071).
saya dapat mengonfirmasi shader ini berfungsi untuk saya di XNA 4.0
Roboblob
0
EDIT
Setelah memikirkannya, jika Anda tidak memberi warna pada apa pun, tetapi menggunakan warna orisinal grafis yang bisa Anda miliki (seperti yang saya sebutkan di bawah) semua warna objek yang diambil diatur ke variabel Warna yang dideklarasikan diatur ke putih. (Color NoTint = Color.White;) lalu Lerp bahwa jika hidup pemain sama dengan nol. Setiap objek yang digambar dengan Warna NoTint perlahan akan berubah (sesuai dengan tingkat interpolasi Anda yang disebutkan di bawah) menjadi apa pun yang Anda inginkan.
Namun jika Anda memiliki warna yang berbeda pada objek yang berbeda, loop foreach di bawah ini mungkin berfungsi.
Akhiri Edit
Dalam pengetahuan saya yang terbatas, saya akan mencoba ini: Nyatakan warna yang Anda gunakan saat menggambar objek tertentu, mis. Color catColor = Color.Brown, lalu tambahkan semua warna gim Anda ke daftar.
publicstaticColor catColor =Color.Brown;List<Color> colorList =newList<Color>(){ catColor };// and other colorsfloat interpolation =0f;float interpolationRate =.01f;...if(playerLives ==0){
interpolation += interpolationRate;if(interpolation >=1){interpolation =1;}foreach(Color c in colorList){Color.Lerp(c,Color.Gray, interpolation);}}
Anda bahkan dapat melakukan ini untuk item yang Anda gambar tanpa warna dan Lerp the Color. Putih ke Color.Gray. (beri nama sesuatu seperti Color NoTint = Color.White, dan letakkan di semua objek yang Anda gambar)
Mungkin ada cara yang lebih baik, terlepas dari saya harap ini membantu!
-1 Ini akan memudar seluruh layar menjadi satu warna solid, bukan mengubahnya menjadi abu-abu. Skala abu-abu mengukur warna dengan kecerahannya (dengan warna yang merasakan warna berbeda memiliki kecerahan berbeda), ia bukan hanya setengah antara warna dan abu-abu (yang masih memiliki warna).
doppelgreener
Luar biasa. Saya harap orang lain belajar dari ini seperti yang saya lakukan. Terima kasih!
EDIT
Setelah memikirkannya, jika Anda tidak memberi warna pada apa pun, tetapi menggunakan warna orisinal grafis yang bisa Anda miliki (seperti yang saya sebutkan di bawah) semua warna objek yang diambil diatur ke variabel Warna yang dideklarasikan diatur ke putih. (Color NoTint = Color.White;) lalu Lerp bahwa jika hidup pemain sama dengan nol. Setiap objek yang digambar dengan Warna NoTint perlahan akan berubah (sesuai dengan tingkat interpolasi Anda yang disebutkan di bawah) menjadi apa pun yang Anda inginkan.
Namun jika Anda memiliki warna yang berbeda pada objek yang berbeda, loop foreach di bawah ini mungkin berfungsi.
Akhiri Edit
Dalam pengetahuan saya yang terbatas, saya akan mencoba ini: Nyatakan warna yang Anda gunakan saat menggambar objek tertentu, mis. Color catColor = Color.Brown, lalu tambahkan semua warna gim Anda ke daftar.
Anda bahkan dapat melakukan ini untuk item yang Anda gambar tanpa warna dan Lerp the Color. Putih ke Color.Gray. (beri nama sesuatu seperti Color NoTint = Color.White, dan letakkan di semua objek yang Anda gambar)
Mungkin ada cara yang lebih baik, terlepas dari saya harap ini membantu!
sumber