Làm thế nào tôi có thể làm thủ tục làm cho các thanh sức khỏe có hình dạng bất thường?


35

Vấn đề của thanh sức khỏe hình chữ nhật hoặc trái tim truyền thống là một cái gì đó được hiểu rõ và dễ dàng giải quyết. Nhưng đâu là giải pháp được chấp nhận cho các thanh sức khỏe "có hình dạng sáng tạo" hơn, như mockup tôi đã thực hiện dưới đây?

Sức khỏe trống rỗng Sức khỏe toàn diện, sức khỏe một phần

Cách rõ ràng để làm điều này là có các họa tiết "ở giữa", vì vậy hình ảnh thứ ba sẽ là hình ảnh của chính nó, cùng với nhiều chuyển tiếp khác cho các mức độ sức khỏe khác nhau. Nhưng điều đó dường như thực sự không phù hợp và số lượng người đi đường cần thiết để tạo ra sự chuyển đổi suôn sẻ giữa các trạng thái sức khỏe sẽ rất lớn.

Ý tưởng khác duy nhất tôi có thể đưa ra là phủ lớp sprite "toàn bộ sức khỏe" lên trên các bộ tọa độ pixel "sức khỏe trống rỗng" và các tọa độ pixel trước khi nướng để thể hiện từng dấu tích của sức khỏe và sau đó làm cho chúng mờ đục hoặc trong suốt như sức khỏe đi lên hoặc xuống

Tôi dự định câu hỏi này là bất khả tri về ngôn ngữ và nền tảng nhưng hãy thoải mái cung cấp một mẫu cụ thể trong bất kỳ ngôn ngữ / thư viện / khung nào nếu nó giúp câu trả lời.


5
"Cỗ máy nano Shaders, con trai"
Mukesh Ingham

Tôi cảm thấy như sự chuyển đổi đó có thể được định nghĩa bằng toán học, từ đó bạn có thể có máy tính tính toán tọa độ pixel để hiển thị / ẩn thay vì đặt trước chúng
Richard Tingle

Làm thế nào là thanh sức khỏe hình trái tim "dễ dàng giải quyết"?
MooseBoys

1
@MooseBoys Tôi đã nói về sức khỏe dựa trên trái tim, không phải hình trái tim. Hãy nghĩ về các trò chơi Legend of Zelda. Xin lỗi vì đã không rõ ràng hơn.
msd7734

@RichardTingle, ý kiến ​​hay :)
Jon

Câu trả lời:


48

Có một cách rất đơn giản để đạt được điều này với các shader, bạn cần ba * kết cấu: thanh sức khỏe trống, kết cấu thanh sức khỏe và mặt nạ với độ dốc phân phối sức khỏe với một cực trị (ví dụ: giá trị alpha tối nhất không đen hoặc trong suốt nhất) ở một đầu và khác ở đầu kia. Nó được hiển thị tốt nhất trên hình ảnh, hiện tại tôi không thể vẽ gradient cong chỉ tuyến tính - nhưng tôi chắc chắn các nghệ sĩ của bạn sẽ không gặp rắc rối nào: nhập mô tả hình ảnh ở đây Bây giờ, trong mẫu shader cả họa tiết và ngưỡng giá trị mặt nạ, loại bỏ tất cả các pixel không phải là sáng hơn ngưỡng đầu vào (dựa trên đầu vào% shader sức khỏe).
Bạn có thểsử dụng công thức toán học để tạo mặt nạ thay vì kết cấu, nhưng nếu bạn đã làm điều đó, bạn sẽ vẫn rất hạn chế đối với các hình dạng mà bạn có thể (= đơn giản) để tạo với các công thức đã nói - và việc tìm kiếm không phải là chuyện nhỏ.
* xem bình luận


9
Trong rất nhiều trường hợp (bao gồm cả ví dụ của OP) sử dụng một kết cấu riêng cho màu sắc là quá mức cần thiết. Trong hầu hết các trường hợp, bạn chỉ có thể ánh xạ lại độ dốc của mặt nạ thang độ xám thành các màu được chỉ định làm đồng phục cho trình đổ bóng, trong khi vẫn loại bỏ bất kỳ giá trị mặt nạ nào dưới một ngưỡng nhất định.
bcrist

1
Bạn thực sự không cần tối nhất không phải màu đen, bạn có thể sử dụng kênh alpha để sàng lọc các pixel bạn không muốn.
Jack Aidley

1
@JackAidley chắc chắn điều đó là có thể, nhưng tôi muốn giải pháp linh hoạt nhất có thể - trong hầu hết các tựa game AAA bạn không có hp chỉ "đỏ" nhưng nó có kết cấu.
wonderra

1
@bcrist điểm tốt, tôi coi đề xuất đó là một tối ưu hóa. Nhưng tôi không thể vẽ nó đúng cách nên tôi quyết định giữ nó đơn giản nhất có thể và để tối ưu hóa để thực hiện.
wonderra

@wondra Đối với nhiều trường hợp bao gồm giao diện ví dụ trong OP, bạn có thể sử dụng gradient thủ tục hoặc tra cứu màu một chiều (với mức độ mặt nạ làm đầu vào), thay vì kết cấu.
Random832

34

Được thực hiện một cách toán học, như một pixel shader:

Trên CPU, tính toán HealthDirection và sản phẩm chấm của nó với V2 nhập mô tả hình ảnh ở đây

Trên GPU, tính toán hướng chuẩn hóa cách xa điểm trung tâm cho mỗi pixel. So sánh từng sản phẩm chấm với HealthDirections 'để chọn màu "nền" hoặc màu. nhập mô tả hình ảnh ở đây

Nếu bạn "đảo ngược" thuật toán này và làm việc từ hướng khác, thay vào đó, bạn có thể "bỏ trượt" từng hướng của pixel thành tỷ lệ phần trăm và so sánh chúng với HealthPercent. Với tỷ lệ phần trăm của mỗi pixel được tính toán, việc làm mờ dần dần từ màu đỏ sang màu xanh lục trên GPU trở nên tầm thường.

Vẽ thanh đầu tiên áp dụng thuật toán cho một quad; màu sắc đầu ra giữa RangeMin và RangeMax (có thể được nướng) và clip () hoặc đầu ra trong suốt ở mọi nơi khác. Tiếp theo, vẽ sprite (đã sửa đổi) trên nó, sử dụng alpha. Tôi truy tìm thanh của bạn bằng CAD, lấp đầy nó, rồi "ma thuật lang thang" hình dạng màu rắn trong Paint để xóa nó. Của tôi trông giống như tào lao do trộn AutoCAD và Paint, bằng tay; giả sử bạn pha trộn các cạnh bên trong để trong suốt, bạn sẽ trông thật hoàn hảo .

Đường viền màu trắng là giới hạn của quad. Nó và X màu đỏ chỉ mang tính tham khảo:

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

"Sprite có lỗ" không cần phải được hiển thị cùng lúc với thanh sức khỏe. Họ nên nhận được bản năng và rút ra tất cả cùng một lúc, sau khi tất cả các thanh sức khỏe đã hoàn thành. Vì thuật toán được bao gồm trong trình đổ bóng, bạn cũng có thể thêm phần khởi động vào nó và sau đó, rút ​​ra tất cả các thanh sức khỏe bằng một lệnh gọi rút gọn. Vẽ mọi thanh sức khỏe trên màn hình sẽ thực hiện 2 cuộc gọi DrawInstified (...) và "điên nhanh".


1
Nếu bạn sẽ che giấu theo kiểu vòng tròn như thế này, bạn có thể thực hiện nó hiệu quả hơn bằng cách thay đổi các hình tam giác mà bạn vẽ cho hình mờ dần.
Jack Aidley

@JackAidley, vui lòng cụ thể hơn, vì tôi không xem xét việc che giấu này; thanh tiến trình được hiển thị đầy đủ, tại chỗ, chỉ trên hai hình tam giác, không có mẫu, sau lần vượt qua đầu tiên. Sprite chỉ tình cờ có một lỗ hổng trong đó và "pretties" toàn bộ điều cuối cùng. (Đây là một mặt nạ của các loại, nhưng không phải là một phần không thể thiếu của thuật toán?) Cảm ơn
Jon

Những gì bạn đang làm tương đương với việc vẽ một phiên bản đeo mặt nạ được tô màu của thanh màu trên một hình nền đã có màu xám. Bởi vì phương thức của bạn yêu cầu một trình đổ bóng tùy chỉnh và ghi vào mọi pixel mà bạn kết thúc bằng một phương thức chậm hơn là chỉ vẽ phần mong muốn của hình.
Jack Aidley

@JackAidley, nhưng không có sprite nền? Cầu vồng được vẽ chỉ bằng bốn vị trí trên thế giới float3; không có tia cực tím, không có "nền sprite". Ngoài ra, bạn lo ngại rằng trình tạo bóng pixel sẽ bị sa lầy khi làm việc trên một số quads nhỏ? Ngoài ra, clip RangeMin và RangeMax () hầu hết các đoạn đó, ngay lập tức.
Jon

Bạn sẽ yêu cầu một sprite nền để có được các đường viền như trong hình ảnh gốc; nếu bạn đang bỏ qua những cái này thì có, các phương thức sẽ khác nhau.
Jack Aidley
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.