Bir 2D oyunda bir fener efekti (bir ışık kaynağı çevresinde daha açık alan) elde edebilir miyim?


16

Kendime basit bir 2D oyun yazmayı düşünüyorum. İlk başta mükemmel grafikler veya oynanış ile parlamayacak, ancak PC oyun geliştirmedeki ilk adımımı düşünürdüm. Yani, böyle basit hareketli grafik tabanlı 2D oyunu hayal edin (Heroes IV veya Startcraft BroodWar gibi).

Oyunun gündüz / gece uygun aydınlatma değişiklikleriyle desteklenmesini istiyorum ve aynı zamanda her aydınlatma nüansı için sprite oluşturmak zorunda kalacağım. Bu yüzden, diğer nesnelerin üzerine yarı saydam bir katman eklemenin yeterli olacağına karar verdim.

Bu çözümün sorunu, oyunda ışık kaynağı bir nesnem varsa (bir meşale takan kahraman veya yanan bir bina gibi), etrafında daha hafif bir alan olmalı, değil mi? Yarı saydam katmanımı her şeyin üzerine koyduğum için, istediğim meşale görsel efektini nasıl elde etmeyi önerirsiniz? Belki de aydınlatma efektine göre 'boşluklar' veya farklı renkte alanlar ekleyerek bu katmanı yeniden çizebilir misiniz?


2
Maske gitmenin yolu olabilir
Gustavo Maciel

5
"Torchlight" başlığında Torchlight adlı oyun nedeniyle kafa karıştırıcı olabilir.
Tetrad

4
@ Tetrad Büyük harf olmadığı sürece iyi olmalıdır. Bana gelince, Torchlight yorumunuzu okuyana kadar hiç aklıma gelmedi.
famousgarkin

Yine de, başlığı daha belirgin hale getirmek için bir düzenleme önerdim.
famousgarkin

Yanıtlar:


12

Ne programladığınızı bilmiyorum, ama XNA'da şu şekilde ele aldım:

  1. Çizim çağrısında bir List<Light>nesne oluşturulur / temizlenir.
  2. Döşeme çizim döngüsü sırasında, her döşemenin kendisiyle ilişkilendirilmiş Işık olup olmadığını kontrol edilir. Varsa, Lightnesneler List<Light>.
  3. Fayanslar kendi üzerine çizilir RenderTarget2D.
  4. Döşeme döngüsünün ardından, Lights listesi yinelenir ve RenderTarget2Dşöyle yaptığım bir doku kullanarak kendi başlarına çizilir :
    Hafif Doku(Not: Burada R, G ve B değerlerini kullandım, ancak muhtemelen alfa kanalını kullanmalısınız. gerçek doku.)
  5. Özel bir gölgelendirici kullanarak, karo yüzeyini ekrana dönüştürür ve aydınlatma yüzeyinde, her pikseldeki "karanlık" değeri için örneklenen bir parametre olarak geçiririm.


Şimdi dikkat etmeniz gereken birkaç nokta var:

4. Nokta ile ilgili:

Aslında iki özel gölgelendiricim var.
4. noktada kullanılan gölgelendirici, "parlaklık" değerini eklememe izin veriyor. Bu değer, floatoluşturma hedefine eklenmeden önce dokudaki her pikselle çarpılan bir değerdir, böylece esasen ışıkları daha parlak veya daha karanlık yapabilirim.
Bu noktada, ışığın "ölçek" değerini de hesaba katarım, bu da tek bir doku kullanarak büyük veya küçük ışıklara sahip olabileceğim anlamına gelir.

Nokta 5 ile ilgili:

Aydınlatma oluşturma hedefini esasen her piksel için 0 (siyah) ile 1 (beyaz) arasında bir değere sahip olarak düşünün. Gölgelendirici, esasen son çizilen görüntüyü yapmak için bu değeri döşemenin oluşturma hedefindeki bir piksel için RGB değerleriyle çarpar.

Ayrıca burada (gölgelendiriciye) gündüz / gece kaplama rengi olarak kullanılacak bir değer geçirdiğim daha fazla kod var. Bu aynı zamanda RGB değerleriyle çarpılır ve aydınlatma render hedef hesaplarına dahil edilir.


Şimdi, bu, bloğun ışığının nesnelerin etrafında dolaşmasını ve ne yapmamasını sağlamanıza izin vermeyecek, ancak en azından amacım için basit ve iyi çalışıyor.

Burada ve burada size yardımcı olabilecek daha ayrıntılı blog yazıları yazdım . Şu anda zamanım yok, ama eğer isterseniz gamedev'de daha ayrıntılı bir şekilde ayrıntılara girebilirim.

Oh, ve işte harita düzenleyicime bir göz atın:resim açıklamasını buraya girin


Her karenin çok maliyetli olmayabileceği bir liste oluşturup temizleyin?
Gustavo Maciel

@Gtoknu Oyunumda gözle görülür bir fark yaratmıyor. Liste sadece hafızada zaten var olan nesnelere referanslar tutuyor, bu yüzden her ışığın yeniden yaratılması ya da herhangi bir şey, sadece bir liste gibi değil.
Richard Marskell - Drackir

haklı olabilirsin, tamamen değil, ama öylesin. Tabii ki, tam nesneler oluşturmuyorsunuz, ancak referanslara işaretçiler ekliyorsunuz, yine de düşük bir kullanım, ancak yine de tüketiyorsunuz. İyi bir şekilde yapıyorsunuz, ancak listeyi draw yönteminin dışına koyarsanız daha iyi olabileceğini düşünüyorum, çünkü güncellemedeki mantık
çekilenden

@Gtoknu Elbette, listeyi istediğiniz yerde ilan edebilirsiniz, ancak asıl nokta ışıkların karolarla ilişkili olmasıdır. Döşeme Drawyöntemi, döşemenin ışıkları olup olmadığını bulacağınız yerdir. Ben Updateyöntemde çizilmiş tüm fayans döngü yok, bu yüzden bunun için ekstra ek yük olurdu. Ayrıca, XNA Updatebunun saniyede 60 kez çağrılacağını garanti etmeye çalışır, böylece bu Drawçağrıları feda edebilir , bu da bu kodun daha az sıklıkta çağrılacağı anlamına gelir.
Richard Marskell - Drackir

Bütün bunlar, tartışmalı bir nokta çünkü sonunda uzaysal bölümlemeye dayalı olarak ışıkları kendi listelerine taşıdım ve tüm ışıkları ekranla kesişen bölümlere çizdim. Zamanımdan dolayı yazımda bunun hakkında konuşmadım, ancak bağlantı verdiğim ikinci blog yazısında bahsedildi.
Richard Marskell - Drackir

9

Normalde, 2D oyunlarda aydınlatma, tüm spritelarınız için Normal Haritaya sahip olarak yapılır , ardından 2D sprite'larınızdaki 3D aydınlatma efektlerini hesaplar. Bu gevşekçe "2.5D" olarak bilinir. Ben ancak ediyorum değil karmaşık olduğu gibi ilk oyunda bunu tavsiye ederiz.

İşte bunu XNA'da yapan birinin harika bir videosu: http://www.youtube.com/watch?v=-Q6ISVaM5Ww

Bununla birlikte, muhtemelen çeşitli varsayımlarla çalışabilecek bir sahte aydınlatma sistemi aldatmanın ve almanın yolları vardır.


Zaten bu videoyu daha önce görmüştüm, böyle inanılmaz bir teknikten bahsettiği için +1.
Gustavo Maciel

Tavsiye ve video bağlantısı için teşekkür ederiz. Aslında bir harita bir çözüm gibi görünüyor. Kendim bir 'boşluk' oluşturmak veya altta yatan nesneler üzerindeki etkisini değiştirmek için haritayı üst katmanım üzerinde kullanmaya çalışacağım.
Ivaylo Slavov

5

Elde etmeye çalıştığınız etki hakkında tam olarak spesifik değilseniz bir yaklaşım önermek zor. Işıkların çevre tarafından engellenip engellenmeyeceği, oyununuzun bakış açısı nedir, ışığın çevre ile ne ölçüde etkileşime girmesi gerektiği vb.

Yine de iki sentimi bırakacağım. Catalin Zima'nın Dinamik 2D Gölgeler başlıklı bu öğreticinin faturanıza uyup uymadığına bakın . Gördüğünüz gibi, ışığın yarıçapı vardır ve engellerden geçmez. Gerçek bir meşale ışığına daha yakın görünmesi için yarıçapı ve rengi biraz canlandırabilirsiniz.

resim açıklamasını buraya girin

Bu durumda, ışık, sahnenizin üstünde bir tür kaplama görevi görür, ancak John'un örneğindeki ile aynı derecede etkileşime girmez, ancak engelleri dikkate alır.

Düzenle

Catalin referans olarak kullandığı başka bir makaleye bağlantı veriyor, ancak bağlantı koptu. İşte güncellenmiş bir bağlantı .


Teşekkürler, bunun peşimde olduğum etki olmadığını düşünüyorum, ama yine de paylaştığınız için teşekkürler :)
Ivaylo Slavov
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.