Làm cách nào để triển khai ánh sáng bị chặn trong trò chơi 2D dựa trên khối?


11

Tôi muốn có ánh sáng 2D có thể bị chặn bởi các đối tượng trong trò chơi. Trò chơi của tôi có chế độ xem từ trên xuống và tất cả các đối tượng trò chơi được mô tả bằng hình chữ nhật.

Giả sử tôi có một thế giới 10x10 và tôi đặt một ánh sáng ở 1x1 và các bức tường xung quanh ánh sáng đó. Tôi muốn có thể nhìn thấy nguồn sáng ở 1x1, nhưng không phải nơi nào khác, vì nó bị chặn bởi các bức tường.

Tôi đã nghe nói về việc chiếu các tia sáng hoạt động, nhưng nó thực sự hoạt động như thế nào?


1
Muốn xem một số câu trả lời không biết ngôn ngữ cho câu hỏi này.
Dashto

2
@Dashto: Bạn cần một đoạn mã làm việc trong ngôn ngữ bạn sử dụng? Đó là một nơi sai lầm để yêu cầu ..
Kromster

Bạn đã thử những gì? Khi bạn nói "bất cứ nơi nào khác không có nguồn sáng", bạn có ý gì? Chỉ cần thắp sáng cho bạn 1,1 khối và đó là nó. Có lẽ tôi không nhận được câu hỏi của bạn, bạn có thể đăng một minh họa?
Laurent Couvidou

1
@Krom Stern: Thật ra tôi đang hỏi ngược lại - một câu trả lời mang tính khái niệm không phụ thuộc vào ngôn ngữ. Hai chủ đề được liên kết như là bản sao không nói về các khái niệm rất nhiều. Trong thực tế, hầu hết các câu hỏi tương tự trên trang web này chỉ đơn giản là có câu trả lời rằng "Sử dụng thư viện này!" ít hữu ích hơn cho những người muốn hiểu cách thức hoạt động của nó.
Dashto

@Dashto: Đó là phần thông tin quan trọng, bạn nên thêm nó vào câu hỏi;)
Kromster

Câu trả lời:


13

Amit Patel đã viết một bài viết rất hay về đúc tia 2D.

Điều này liên quan đến việc đúc các tia tới từng đỉnh trong phạm vi của nguồn sáng để tạo lưới ánh sáng.

nhập mô tả hình ảnh ở đây

Tất cả các ví dụ trực quan là tương tác trong bài và rất dễ hiểu.

Bạn cũng không phải giới hạn mình trong một cái hộp, chu vi bạn theo dõi có thể là bất kỳ hình dạng nào bạn thích.


1

Bạn nên sử dụng thuật toán phát sóng , có nghĩa là, bạn sẽ có thể tính toán giao điểm của tia (nửa đường thẳng) với bất kỳ đối tượng nào trong cảnh của bạn (đường thẳng, hình vuông, hình tròn, hình tam giác ....) và chọn giao điểm gần nhất. Bạn chiếu tia theo mọi hướng và sau đó "vẽ ánh sáng" cho vật thể gần nhất.

Đây là cách nó có thể trông như thế nào .


Tôi chỉ hỏi làm thế nào tôi sẽ sử dụng đúc tia. Tôi biết về nó.
LiquidFeline

0

Nếu bạn biết đúc tia là gì, thì tất cả những gì bạn cần làm thực sự là mã hóa nó. Nó không quá phức tạp miễn là bạn có tọa độ cho mỗi đỉnh.

Đầu tiên, tạo một vật phát sáng. Đặt ánh sáng của bạn tại tọa độ 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

Điều này không được đảm bảo để làm việc cho một đa giác lõm, nhưng nó chỉ hoạt động tốt cho bất kỳ đa giác lồi nào.

Điều này sẽ hoạt động nếu các vật thể che khuất của bạn (tường, nhân vật, người ăn màu tím bay) được vẽ lên màn hình sau khi áp dụng ánh sáng. Nếu không, một nửa bức tường sẽ xuất hiện sáng hơn đáng kể so với nửa còn lại. Nếu ánh sáng điểm của bạn cách đều nhau từ hai cặp đỉnh của cùng một bức tường (cao bằng một nửa chiều cao của bức tường của bạn), hãy áp dụng hình tam giác cho hai đỉnh gần nhất, thay vì hai đỉnh khác.

Tôi cũng nên đề cập rằng phương pháp này đòi hỏi một điểm đỉnh được tạo động, trong đó cạnh của bán kính ánh sáng gặp bề mặt của vật thể che khuất. Điều này tạo ra tối thiểu 3 đỉnh cho bất kỳ vật thể che khuất nào và sẽ cho phép các bức tường vượt qua bán kính ánh sáng (hoặc tắt màn hình) cũng chặn bất kỳ ánh sáng nào.

Thông tin thêm về đa giác lõm và lồi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.