Saya berpikir untuk menulis sendiri game 2D sederhana. Itu tidak akan bersinar dengan grafis atau gameplay yang sempurna pada awalnya, tapi saya akan menganggapnya sebagai langkah pertama saya dalam pengembangan game PC. Jadi, bayangkan game 2D sederhana berbasis sprite (seperti Heroes IV atau Startcraft BroodWar).
Saya ingin gameplay mendukung hari / malam dengan perubahan pencahayaan yang sesuai dan pada saat yang sama akan gila harus membuat sprite untuk setiap nuansa pencahayaan. Jadi, saya memutuskan menambahkan lapisan semi-transparan di atas objek lain sudah cukup.
Masalah dengan solusi ini adalah jika saya memiliki objek sumber cahaya dalam permainan (seperti pahlawan mengenakan obor, atau gedung yang terbakar), pasti ada area yang lebih terang di sekitarnya, kan? Karena saya meletakkan lapisan semi-transparan saya di atas segalanya, bagaimana Anda menyarankan untuk mencapai efek visual torchligt yang saya inginkan? Mungkin menggambar ulang layer itu dengan menambahkan 'celah' atau area berwarna berbeda berdasarkan efek pencahayaan?
Jawaban:
Saya tidak tahu apa yang Anda pemrograman, tapi ini adalah bagaimana saya menanganinya di XNA:
List<Light>
objek dibuat / dihapus.Light
objek akan ditambahkan keList<Light>
.RenderTarget2D
.Light
s iterasi dan digambar sendiriRenderTarget2D
menggunakan tekstur yang saya buat yang terlihat seperti ini:(Catatan: Saya menggunakan nilai R, G dan B di sini, tetapi Anda mungkin harus menggunakan saluran alpha di tekstur aktual.)
Sekarang, ada beberapa hal yang perlu diperhatikan:
Mengenai Poin 4:
Saya sebenarnya memiliki dua custom shader, satu untuk menggambar lampu ke target render pencahayaan (langkah 4) dan yang lain untuk menggambar target render ubin ke layar menggunakan target render pencahayaan (langkah 5).
Shader yang digunakan pada titik 4 memungkinkan saya untuk menambahkan (apa yang saya sebut) nilai "luminositas". Nilai ini adalah
float
yang dikalikan dengan setiap piksel dalam tekstur sebelum ditambahkan ke target render sehingga saya pada dasarnya dapat membuat lampu lebih terang atau lebih gelap.Pada titik ini, saya juga memperhitungkan nilai "skala" cahaya yang berarti saya dapat memiliki lampu besar atau kecil hanya dengan menggunakan satu tekstur.
Mengenai Poin 5:
Pikirkan target render pencahayaan karena pada dasarnya memiliki nilai untuk setiap piksel dari 0 (hitam) hingga 1 (putih). Shader pada dasarnya mengalikan nilai tersebut dengan nilai RGB untuk piksel dalam target render ubin untuk membuat gambar akhir yang digambar.
Saya juga memiliki beberapa kode di sini di mana saya memberikan (ke shader) nilai untuk digunakan sebagai warna overlay siang / malam. Ini juga dikalikan dengan nilai RGB dan termasuk dalam perhitungan target render pencahayaan.
Sekarang, ini tidak akan memungkinkan Anda untuk melakukan hal-hal seperti memblokir cahaya dari berkeliling benda dan yang lainnya, tetapi setidaknya untuk tujuan saya, itu sederhana dan bekerja dengan baik.
Saya telah menulis posting blog yang lebih rinci di sini dan di sini yang dapat membantu Anda. Saya tidak punya waktu sekarang, tetapi jika Anda mau, saya bisa masuk ke detail lebih lanjut di gamedev.
Oh, dan ini dia lihat di editor peta saya:
sumber
Draw
Metode ubin adalah tempat Anda mengetahui apakah ubin memiliki lampu atau tidak. Saya tidak mengulangi semua ubin yang digambar dalamUpdate
metode ini sehingga saya akan menambahkan overhead tambahan untuk itu. Juga, XNA mencoba untuk menjamin bahwaUpdate
akan dipanggil 60 kali per detik sehingga dapat mengorbankanDraw
panggilan untuk ini, yang berarti bahwa kode ini sebenarnya akan dipanggil lebih jarang.Biasanya, pencahayaan dalam game 2D dilakukan dengan memiliki Peta Normal untuk semua sprite Anda, lalu hitung efek pencahayaan 3D pada sprite 2D Anda. Ini dikenal longgar sebagai "2.5D". Namun saya tidak mau merekomendasikan melakukan hal ini di pertandingan pertama Anda seperti itu kompleks.
Berikut adalah video luar biasa dari seseorang yang telah melakukan ini di XNA: http://www.youtube.com/watch?v=-Q6ISVaM5Ww
Yang mengatakan, mungkin ada cara untuk menipu dan mendapatkan sistem pencahayaan semu yang bisa bekerja dengan berbagai asumsi.
sumber
Sulit untuk menyarankan pendekatan jika Anda tidak sepenuhnya spesifik tentang efek yang ingin Anda capai. Detail seperti jika lampu harus terhalang oleh lingkungan atau tidak, apa sudut pandang game Anda, sejauh mana cahaya berinteraksi dengan lingkungan, dll.
Saya akan menjatuhkan dua sen saya. Lihat apakah tutorial ini oleh Catalin Zima berjudul Dynamic 2D Shadows sesuai dengan tagihan Anda. Seperti yang Anda lihat, cahayanya memiliki jari-jari dan tidak melewati rintangan. Anda bisa menghidupkan jari-jari dan warnanya sedikit agar terlihat lebih dekat dengan cahaya obor nyata.
Dalam hal ini, cahaya bertindak sebagai semacam overlay di atas adegan Anda, tetapi tidak berinteraksi dengannya sampai pada tingkat yang sama seperti dalam contoh John, meskipun ia mempertimbangkan halangan.
Edit
Catalin tautan ke artikel lain yang dia gunakan sebagai referensi, tetapi tautan tersebut rusak. Inilah tautan yang diperbarui .
sumber