Tıkalı aydınlatmayı blok tabanlı bir 2D oyuna nasıl uygularım?


11

Oyun içi nesneler tarafından engellenebilen 2D aydınlatmaya sahip olmak istiyorum. Oyunumun yukarıdan aşağıya bir görünümü var ve tüm oyun nesneleri dikdörtgenlerle açıklanıyor.

Diyelim ki 10x10 dünyam var ve 1x1'e bir ışık ve o ışığın etrafına duvarlar yerleştiriyorum. Işık kaynağını 1x1'de görmek istiyorum, ancak başka hiçbir yerde göremiyorum, çünkü duvarlar tarafından engellendi.

Işık ışınlarının dökülmesinin işe yaradığını duydum, ama bu gerçekten nasıl çalışıyor?


1
Bu soruya dile özgü bazı agnostik cevaplar görmek istiyorum.
Dashto

2
@Dashto: Kullandığınız dilde çalışan bir kod parçasına mı ihtiyacınız var? Bu istemek için yanlış bir yer ..
Kromster

Ne denedin? "Işık kaynağı olmayan başka bir yer" derken ne demek istiyorsun? Sadece 1,1 blok yaktým ve hepsi bu. Belki sorunuzu anlamadım, bir illüstrasyon gönderebilir misiniz?
Laurent Couvidou

1
@Krom Stern: Tam tersini istiyorum, aslında - dile bağlı olmayan kavramsal bir cevap. Yinelenen olarak bağlanan iki iş parçacığı kavramlar hakkında çok fazla konuşmaz. Aslında bu sitedeki benzer soruların çoğunda "Bu kütüphaneyi kullan!" nasıl çalıştığını anlamak isteyen biri için daha az yardımcı olur.
Dashto

@Dashto: Bu önemli bir bilgi parçası, bunu soruya eklemelisiniz;)
Kromster

Yanıtlar:


13

Amit Patel, 2D ışın dökümü hakkında çok güzel bir makale yazdı .

Bu, bir ışık ağı oluşturmak için ışık kaynağı aralığı içindeki köşelerin her birine ışın demetleri içerir.

resim açıklamasını buraya girin

Tüm görsel örnekler yazıya interaktiftir ve anlaşılması çok kolaydır.

Kendinizi bir kutu ile sınırlamak zorunda değilsiniz, izlediğiniz çevre istediğiniz herhangi bir şekil olabilir.


1

Yeniden tarama algoritması kullanmalısınız , yani ışının (yarım çizgi) sahnenizdeki herhangi bir nesneyle (çizgiler, kareler, daireler, üçgenler ....) kesişimini hesaplayabilmeli ve en yakın kavşağı seçebilmelisiniz. Işını her yöne atıyorsunuz ve sonra sadece ışığı en yakın nesneye çekiyorsunuz.

İşte böyle görünebilir .


Sadece ışın dökümü nasıl kullanacağımı sordum. Bunu biliyorum.
LiquidFeline

0

Ray dökümün ne olduğunu biliyorsanız, yapmanız gereken tek şey zor koddur. Her köşe için koordinatlarınız olduğu sürece aşırı derecede karmaşık değildir.

İlk olarak, ışık yayan bir nesne oluşturun. Işığınızı x, y koordinatlarına yerleştirin.

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

Bunun içbükey bir çokgen için çalışacağı garanti edilmez, ancak herhangi bir dışbükey çokgen için gayet iyi çalışmalıdır.

Bu, okşayan nesneleriniz (duvarlar, karakter, uçan mor insanlar yiyen) aydınlatma uygulandıktan sonra ekrana boyanırsa işe yarayacaktır. Aksi takdirde, bir duvarın yarısı diğer yarısından önemli ölçüde daha parlak görünecektir. Nokta ışığınız aynı duvarın iki çift köşesinden eşit uzaklıktaysa (duvarınızın yüksekliğinin tam yarısı kadar yüksekse), üçgeni daha uzaktaki iki yerine en yakın iki köşeye uygulayın.

Bu yöntemin , ışığın yarıçapının kenarının, tıkanan nesnenin yüzeyiyle buluştuğu, dinamik olarak oluşturulmuş bir tepe noktası gerektirdiğini de belirtmeliyim . Bu, herhangi bir tıkanık nesne için en az 3 köşe oluşturur ve ışığın yarıçapını aşan (veya ekranın dışındaki) duvarların da herhangi bir ışığı engellemesine izin verir.

Konkav ve dışbükey çokgenler hakkında daha fazla bilgi

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.