Triển khai cảnh quan có thể phá hủy 2D (như Worms)


76

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ì?


7
Câu hỏi tuyệt vời. Giun có hai thách thức: khả năng phá hủy và chuyển động trên các góc lạ.
tro999

tôi nghĩ rằng điều này đã được hỏi ở đây một số lần
Vishnu

2
Vish, các liên kết liên quan dường như không gợi ý điều đó.
Vịt Cộng sản

3
Bạn có thể kiểm tra xem nó được thực hiện như thế nào trong Hedgewars - đó là bản sao Worms mã nguồn mở.
GvS

Không đủ cho một câu trả lời, nhưng bạn cũng có thể muốn kiểm tra Clonk . Đây là một trò chơi 2D cũ hơn của một nhà phát triển người Đức cũng có cảnh quan có thể phá hủy, xuống các pixel cụ thể. Nó không còn được phát triển nữa, nhưng mã nguồn có sẵn theo liên kết ở trên. Ngoài ra còn có người kế thừa mã nguồn mở OpenClonk, nhưng từ các video dường như đã tránh xa sự hủy diệt hoàn hảo của pixel và chuyển sang hướng Terraria-esque với các loại khối có thể bị phá hủy.
Christian

Câu trả lời:


47

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.


3
Lưu trữ thêm thông tin là va chạm - bản đồ là một ý tưởng hay.
deft_code

6

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.


2
Tôi nghĩ đó là cách Hedgewars làm điều đó. @Bill, bạn có thể xem nó, vì là nguồn mở.
Gastón

2
@ Gastón Các bản đồ trong Hedgewars đều là hình ảnh (PNG). Tôi nghi ngờ họ đang được chuyển đổi sang đồ họa vector. Ngoài ra: sử dụng đồ họa vector (splines, bezier, v.v.) nặng hơn nhiều CPU cho những thứ như phát hiện va chạm hoặc trừ hình dạng. Nhìn vào nguồn là một ý tưởng tốt mặc dù (mặc dù phong cách mã hóa khá tệ :))
bummzack

4
Hình học tính toán như thế này có thể nhận được RẤT phức tạp, RẤT nhanh!
Adam Harte

Googling "địa hình phá hủy box2d" hiện cung cấp một vài bản demo vector có thể chạy được.
Ciro Santilli 新疆 心 心

6

Sử dụng hình học rắn xây dựng

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 đó.


5

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ó.


3
Trong giun, bạn có thể đào một cái lỗ xuyên qua cảnh quan bằng một ngọn đuốc. Sẽ không buồn cười lắm nếu đường hầm đó sẽ sụp đổ trên con sâu cầm đuốc tội nghiệp của bạn. Cũng có thể có những mảnh phong cảnh "lơ lửng" trong không trung. Đề xuất của bạn nghe có vẻ là một ý tưởng thú vị, không giống như một trò chơi Worms.
bummzack

Đó là toàn bộ vấn đề, tôi đã suy nghĩ về các biến thể trong lối chơi đó. Ngoài ra, một số phần của cảnh quan có thể không thể phá hủy và / hoặc lơ lửng vĩnh viễn trong không khí, điều này sẽ cho phép bạn tạo các khối "nổi". Ngoài ra, một số có thể có lực liên tục tác dụng lên chúng, kéo chúng lên hoặc nghiêng sang một bên, giống như những quả bóng không khí đã làm trong Thế giới của Goo.
Septagram

Thật buồn cười vì tôi đã thực sự xem xét việc tạo ra một trò chơi như thế này, nó sẽ là một bước ngoặt thú vị đối với thợ máy Worms. Ý tưởng về các cơ thể cứng nhắc bitmap chắc chắn sẽ là một chủ đề thú vị trong chính nó, sự phức tạp là một chút trên đầu của tôi mặc dù.
William Casarin

Chà, trong trường hợp này, các vật thể cứng bitmap sẽ không hoạt động, thay vào đó, tôi sẽ tạo một cảnh quan dưới dạng một lưới ba đỉnh của các đỉnh, được kết nối đàn hồi. Bạn đã chơi thế giới của goo? Nếu không, hãy xem ảnh chụp màn hình: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/sc Greensshots / world-of-goo_1_big.jpg . Không, không, không, không, nếu bạn không chơi nó, bạn hoàn toàn phải :) Bây giờ hãy tưởng tượng rằng thay vì bóng goo, mỗi tam giác hiển thị một phần kết cấu phong cảnh của bạn, và chúng nhỏ hơn nhiều. Đi loanh quanh với các hằng số và phong cảnh của bạn sẽ khá cứng hoặc mềm như thạch
Septagram

2
hãy nhìn vào động cơ vật lý . Toàn bộ động cơ dựa trên ý tưởng rằng tất cả mọi thứ là một mạng biến dạng / phá hủy (giống như một tháp của goo).
deft_code

3

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.

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.