Bagaimana cara menerapkan pencahayaan yang tersumbat dalam game 2D berbasis blok?


11

Saya ingin memiliki pencahayaan 2D yang dapat diblokir oleh objek dalam game. Gim saya memiliki tampilan atas-bawah dan semua objek gim dijelaskan oleh segi empat.

Katakanlah saya memiliki dunia 10x10 dan saya menempatkan cahaya pada 1x1 dan dinding di sekeliling cahaya itu. Saya ingin dapat melihat sumber cahaya pada 1x1, tetapi tidak di tempat lain, karena terhalang oleh dinding.

Saya pernah mendengar tentang casting cahaya bekerja, tetapi bagaimana cara kerjanya?


1
Ingin melihat beberapa jawaban agnostik bahasa untuk pertanyaan ini.
Dashto

2
@Dashto: Anda memerlukan kode yang berfungsi dalam bahasa yang Anda gunakan? Itu adalah tempat yang salah untuk meminta ..
Kromster

Apa yang sudah kamu coba? Ketika Anda mengatakan "tempat lain yang tidak memiliki sumber cahaya", apa maksud Anda? Hanya menerangi Anda 1,1 blok dan hanya itu. Mungkin saya tidak mendapatkan pertanyaan Anda, bisakah Anda memposting ilustrasi?
Laurent Couvidou

1
@Rom Stern: Saya meminta yang sebaliknya, sebenarnya - jawaban konseptual yang tidak bergantung pada bahasa. Dua utas yang ditautkan sebagai duplikat tidak terlalu banyak berbicara tentang konsep. Sebenarnya sebagian besar pertanyaan serupa di situs ini hanya memiliki jawaban yang mengatakan "Gunakan perpustakaan ini!" yang kurang bermanfaat bagi seseorang yang ingin memahami cara kerjanya.
Dashto

@Dashto: Itu adalah bagian penting dari info, Anda harus menambahkan itu ke pertanyaan;)
Kromster

Jawaban:


13

Amit Patel telah menulis artikel yang sangat bagus tentang casting sinar 2D.

Ini melibatkan pengecoran sinar ke masing-masing simpul di dalam kisaran sumber cahaya untuk membangun jaring cahaya.

masukkan deskripsi gambar di sini

Semua contoh visual bersifat interaktif di pos dan sangat mudah dimengerti.

Anda tidak harus membatasi diri pada sebuah kotak, batas yang Anda lacak dapat berupa bentuk apa pun yang Anda suka.


1

Anda harus menggunakan algoritma raycasting , yang berarti, Anda harus dapat menghitung persimpangan sinar (setengah-garis) dengan objek apa pun dalam adegan Anda (garis, bujur sangkar, lingkaran, segitiga ....) dan pilih persimpangan terdekat. Anda melemparkan sinar ke segala arah lalu "menarik cahaya" hanya ke objek terdekat.

Berikut ini tampilannya .


Saya hanya bertanya bagaimana saya akan menggunakan ray casting. Aku tahu tentang itu.
LiquidFeline

0

Jika Anda tahu apa itu ray casting, maka yang perlu Anda lakukan hanyalah hard-code-nya. Ini tidak terlalu rumit selama Anda memiliki koordinat untuk setiap titik.

Pertama, buat objek yang memancarkan cahaya. Tempatkan cahaya Anda di koordinat x, y.

#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

Ini tidak dijamin berfungsi untuk poligon cekung, tetapi harus berfungsi dengan baik untuk setiap poligon cembung.

Ini akan berfungsi jika benda yang tersumbat (dinding, karakter, pemakan orang terbang ungu) dilukis ke layar setelah menerapkan pencahayaan. Kalau tidak, separuh dinding akan tampak lebih terang secara signifikan daripada separuh lainnya. Jika titik cahaya Anda sama dari dua pasang simpul pada dinding yang sama (tepat setengah dari ketinggian dinding Anda), terapkan segitiga ke dua simpul terdekat, daripada dua yang lebih jauh.

Saya juga harus menyebutkan bahwa metode ini membutuhkan titik simpul yang dibuat secara dinamis di mana ujung jari-jari cahaya bertemu dengan permukaan objek yang tersumbat. Ini menciptakan minimal 3 simpul untuk objek yang macet dan akan memungkinkan dinding yang melampaui jari-jari cahaya (atau dari layar) juga menghalangi cahaya.

Informasi lebih lanjut tentang polong cekung dan cembung

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.