2012-03-25 27 views
5

Tôi đang thêm ánh sáng vào trò chơi dựa trên XNA 2D của mình.Chiếu sáng 2 chiều 2D

Tôi đã tìm thấy this bài viết hữu ích, nhưng cách thực hiện nó không hỗ trợ va chạm. Những gì tôi muốn là một phương pháp để làm như sau

  • đã luôn thắp sáng điểm
  • Collision (Nếu tia sáng chạm một khối, sau đó mờ khối tiếp theo bằng bất kỳ giá trị cho đến khi bóng tối của nó để mô phỏng bóng)

Tôi đã tìm kiếm trong một thời gian nhưng không may mắn (tôi đã tìm thấy hướng dẫn của Catalin, nhưng nó có vẻ hơi tiên tiến đối với tôi, và không áp dụng cho gạch cũng do vẽ lại toàn bộ trò chơi cho mỗi điểm)

Trả lời

1

Tôi sẽ chia sẻ phương pháp của mình để áp dụng hiệu ứng chiếu sáng mượt mà cho lưới ô xếp 2D. ClassicThunder answer cung cấp liên kết tốt đẹp cho bóng tối.

Trước hết, chúng tôi sẽ cần phải tính giá trị ánh sáng của mỗi ô sẽ bị mờ sau. Hãy để tôi minh họa cách hoạt động này trước khi tôi nhận được vào mã.

Lighting

Về cơ bản những gì chúng tôi làm là lặp qua tất cả các gạch, bắt đầu từ phía trên, nếu một ngói là trống, đặt biến CurrentLight để độ sáng tối đa, nếu chúng ta tìm thấy một gạch vững chắc, thiết lập nó như là CurrentLight biến và trừ số tiền "hấp thụ" từ số CurrentLight. Bằng cách này, trên lát gạch tiếp theo của chúng tôi, khi chúng tôi đặt hình xếp thành giá trị CurrentLight, giá trị này sẽ hơi nhỏ hơn. Quá trình này được lặp lại cho đến khi mảng được lặp lại.

Bây giờ sẽ có hiệu ứng ánh sáng từ trên xuống dưới tốt đẹp, nhưng nó không phải là tuyệt vời. Chúng ta phải lặp lại quá trình này 3 lần nữa, từ dưới lên trên, từ trái sang phải và từ phải sang trái. Và nó có thể được lặp đi lặp lại nhiều lần hơn cho chất lượng tốt hơn.

Về cơ bản chạy mã này trên tất cả các gạch trong vòng lặp

if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light 
    CurrentLightR = tile.Light; 
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light 
    tile.Light = CurLightR; 
if (tile.Light == CurLightR) //If it is the same, subtract absorb values 
    CurrentLight -= tile.Absorb; 

Và có bạn đi, ánh sáng ngói đẹp. Tuy nhiên, nếu bạn muốn một cái nhìn ít "pixelized", bạn có thể kiểm tra của tôi question on gamedev cho điều đó.

0

Đối với ánh sáng mỗi pixel, bạn có thể có để tìm một nơi khác, bởi vì tôi không biết về điều đó. Đối với ánh sáng mỗi ô,

trong SpriteBatch.draw, một vài phương pháp quá tải có màu. Khi bạn sử dụng Color.White, sprite mà SpriteBatch vẽ là màu bình thường.

Sử dụng màu nhân bằng cách tạo ra một màu mới (Color.yourcolor.r * float, Color.yourcolor.y * float, Color.yourcolor.z * float, 255)

Về cơ bản, để có được những phao , cố gắng tìm ra một công thức tính toán độ sáng của khối do các đèn gần đó (được lưu trữ trong một mảng hoặc danh sách, có thể). Vì không có chuẩn mực cần thiết cho trò chơi 2D, công thức này nên tương đối dễ dàng.

+0

-1 Trong 4.0 theo hành vi mặc định (Color * float) không làm thay đổi độ sáng/bóng tối nó làm thay đổi độ trong suốt. http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4-0.aspx – ClassicThunder

+0

@ClassicThunder có cách nào xung quanh nó không? nó nghe có vẻ giống như cách tốt nhất – Neomex

4

Hãy xem Catalin's excellent lighting tutorial. Tôi tin rằng nó đáp ứng tất cả các yêu cầu của bạn.

+0

"(Tôi đã tìm thấy hướng dẫn của Catalin, nhưng nó dường như abit nâng cao cho tôi)" Hmm ... Tôi đoán bệnh mất anouther nhìn vào nó – Cyral

+0

Rất tiếc về điều đó. Nhưng tôi sợ rằng ánh sáng là một chủ đề khá tiên tiến nên khó có thể tìm thấy một hướng dẫn dạy bạn cách thực hiện và dễ theo dõi. – ClassicThunder

+0

Đúng, tôi đã làm việc trên hướng dẫn và tôi đã nhận được các điểm sáng để làm việc, chỉ cần một chút nhầm lẫn về nơi để gọi DrawTiles của tôi() để có được bóng tối để làm việc. Về cơ bản tôi có một mảng [,], nhưng không thể dường như thâm nhập nó theo cách mà catalin thực hiện với một hình ảnh duy nhất – Cyral

Các vấn đề liên quan