Những bước nào sẽ được tham gia vào việc xây dựng một cảnh quan 2D có thể phá hủy, như trong Worms? Lý tưởng nhất, một số cách mà quá trình này có thể được thực hiện hiệu quả nhất có thể là gì?
Những bước nào sẽ được tham gia vào việc xây dựng một cảnh quan 2D có thể phá hủy, như trong Worms? Lý tưởng nhất, một số cách mà quá trình này có thể được thực hiện hiệu quả nhất có thể là gì?
Câu trả lời:
Tôi không biết làm thế nào cảnh quan trong sâu được thực hiện chính xác, nhưng tôi khá chắc chắn rằng họ đã sử dụng một bitmap cho phong cảnh (ít nhất là trong các trò chơi cũ của loạt game).
Một cách tiếp cận rất cơ bản sẽ là hình ảnh bitmap (B / W) trong đó pixel đen đại diện cho không khí và pixel trắng đại diện cho mặt đất . Việc phá hủy cảnh quan có thể được thực hiện dễ dàng bằng các thao tác pixel. Vì vậy, nếu một tên lửa chạm đất, hãy vẽ một vòng tròn màu đen với radius = blastRadius
điểm va chạm.
Sau đó, bạn có thể kết xuất thế giới của mình (hoặc chỉ một phần của nó) bằng cách sử dụng bitmap đó. Để có hiệu suất tốt hơn, tôi khuyên bạn nên triển khai nó theo cách, rằng bạn có thể cập nhật / kết xuất chỉ là một phần của "thế giới". Ví dụ. nếu một số phần của cảnh quan bị phá hủy bởi một tên lửa, chỉ cần kết xuất lại các khu vực bị ảnh hưởng, chứ không phải toàn bộ thế giới.
Thay vì hình ảnh B / W là "bản đồ va chạm" của bạn, bạn cũng có thể sử dụng hình ảnh 24 bit trong đó bạn sử dụng hai kênh để lưu trữ bề mặt bình thường (x, y) trên mỗi pixel và một kênh để lưu trữ "va chạm thực tế" bản đồ". Có bề mặt bình thường trong tay sẽ giúp bạn tính toán lựu đạn nảy, hoặc để xác định xem một nhân vật có thể di chuyển theo một hướng nhất định hay không.
Một khả năng ngoài đỉnh đầu của tôi:
Sử dụng biểu diễn đường dẫn đồ họa vector để lưu trữ đường viền của "vùng đất" có thể phá hủy. Khi một sự kiện hủy diệt xảy ra (ví dụ, một quả lựu đạn sẽ tắt), khu vực vụ nổ, được biểu thị dưới dạng một vòng tròn, sẽ bị xóa khỏi đường dẫn đất thông qua thao tác trừ boolean. Đường dẫn kết quả đại diện cho "vùng đất" mới để phát hiện va chạm mặt đất và cũng có thể là mặt nạ để vẽ đất.
Tôi đã viết một bằng chứng về khái niệm sử dụng hình học rắn xây dựng để xử lý địa hình có thể phá hủy. Tôi đã sử dụng GLU Tessellator để thực hiện các thao tác boolean. Các tài liệu giải thích như thế nào, tìm kiếm cho "CSG Sử dụng cho Winding Rules" .
Tôi đã đưa đầu ra tam giác của tessellator dưới dạng đa giác tĩnh vào Box2D. PoC hoạt động khá tốt. Tôi đã có thể tự ý trừ và thêm địa hình trong thời gian thực và địa hình tiếp tục hành xử phù hợp với Box2D. Nấc cụt thực sự duy nhất là tessellator GLU có thể tạo ra các hình tam giác thoái hóa mà Box2D không thích, vì vậy tôi phải lọc chúng ra bằng tay.
Bước tiếp theo trong PoC (mà tôi chưa bao giờ có được) là sử dụng thuật toán SCC từ thư viện đồ thị boost để phát hiện khi một phần địa hình bị cắt đứt (cắt đỉnh núi). Địa hình bị cắt đứt vẫn có thể bị phá hủy nhưng giờ được thể hiện bằng thân Box2D động (không tĩnh) với các hình tam giác được gắn dưới dạng hình. Tôi đã thiết kế xong nhưng mất hứng thú khi tôi bắt đầu đào sâu vào tài liệu tăng cường. Tôi "lên kế hoạch" để xem lại ý tưởng khi tôi thực hiện một trò chơi thiêu đốt đất / giun một ngày nào đó.
Tất cả các câu trả lời ở trên nói về việc thực hiện trường hợp đơn giản nhất, như trong sâu. Đó là, khi khu vực tác động bị phá hủy và mọi thứ khác không bị ảnh hưởng. Bạn đã xem xét, rằng cảnh quan của bạn cuối cùng có thể được chia làm hai? Giả sử, có một ngọn núi và người chơi đã cắt đáy của nó bằng một bệ phóng tên lửa. Bây giờ, không nên rơi núi? Ngoài ra, nó sẽ là tự nhiên cho một cảnh quan là một chút đàn hồi. Vào thời của Worms (ít nhất là khi tôi nhớ chúng, tôi đã không chơi Worms trong nhiều năm), máy tính không đủ mạnh để làm điều đó đúng. Nhưng họ bây giờ.
Tất nhiên, nó hoàn toàn phụ thuộc vào tham vọng của dự án của bạn. Nhưng nếu bạn muốn nó thực sự tuyệt vời, có lẽ bạn nên thử Box2D như một công cụ vật lý. Có rất nhiều thứ bạn có thể làm với nó.
Như bummzack đã nói Bitmap. Mặc dù bạn có thể sử dụng trong suốt 1 bit hoặc nếu bạn không có hỗ trợ đó, hãy sử dụng màu hồng khủng khiếp mà bạn sẽ không sử dụng trong trò chơi của mình.
Điểm tác động có thể được tính toán chỉ là kiểm tra màu pixel. và khi một tác động xảy ra, thay đổi màu sắc (hoặc xóa nó) của bitmap.
Đối với bán kính vụ nổ, điểm dừng đầu tiên của tôi sẽ là thuật toán vòng tròn của Bresenham , rất nhanh và hiệu quả. Mặc dù trước tiên tôi nên xóa một thứ gì đó giống như hình vuông và đặt vòng tròn quanh nó để lấy các cạnh.