Làm cách nào để hiển thị một chất nhầy của lan truyền hiệu ứng trên mạng trong môi trường 2D?


8

Dưới đây là một ví dụ về một chất nhầy lây lan. Chất này được lan truyền xung quanh nguồn (trong ví dụ này, nguồn sẽ là tòa nhà ngoài hành tinh chính).

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

Trò chơi là starcraft, chất màu tím được gọi là creep.

Làm thế nào loại chất lan truyền này sẽ đạt được trong môi trường 2D từ trên xuống? Tính toán lại sự tiến triển của chất và tái tạo hiệu ứng khi bay từng khung hoặc thay vì sử dụng một bộ sưu tập lớn gạch hoặc cái gì khác?


Thật khó để nói chính xác những gì bạn đang theo đuổi. Để đoán nguy hiểm, tôi sẽ thực hiện một lượt qua tất cả các ô và nếu ô trống nhưng có N gạch giáp với nhiễm trùng, thì sẽ lây nhiễm gạch hiện tại.
Jari Komppa

3
Từ khóa bạn đang tìm kiếm là "automata di động".
Marton


@ Byte56 câu trả lời tuyệt vời, khá rõ ràng. Cám ơn vì đã chia sẻ.
nathan

Câu trả lời:


7

Theo nhận xét của bạn trong các câu trả lời khác, vấn đề của bạn không phải là thuật toán phát triển creep, mà là thuật toán chọn sử dụng gạch creep nào.

Sử dụng gạch nào phụ thuộc vào việc:

  1. gạch trên có bị nhiễm hay không
  2. gạch phải bị nhiễm hay không
  3. gạch dưới có bị nhiễm hay không
  4. gạch trái có bị nhiễm hay không

Điều đó có nghĩa là bạn sẽ cần tổng cộng 16 gạch. Bạn có thể dễ dàng giải quyết chúng với một bitfield. Dưới đây là một số mã giả sẽ chọn một ô khác nhau cho mọi chòm sao leo có thể:

index = 0;
if left tile is creeped then index += 1
if lower tile is creeped then index += 2
if right tile is creeped then index += 4
if upper tile is creeped then index += 8    
creep_tile = creep_tiles[index]

Lưu ý rằng bất cứ khi nào bạn thay đổi trạng thái lây nhiễm của ô, tất cả các ô liền kề bị nhiễm cần phải được đánh giá lại, vì vùng lân cận của chúng đã thay đổi.

Làm thế nào để thiết kế đồ họa 16 gạch sao cho chúng khớp với nhau một cách độc đáo là một câu hỏi (mới) cho một nhà thiết kế đồ họa.


1
@nathan Cũng tra cứu Cellata Automata.
Kỹ sư

2

Cách đây một thời gian, tôi đã đọc một bài viết chiến lược giải thích chi tiết về cách creep lan truyền trong Starcraft 2, tôi đang vật lộn để tìm nó ngay bây giờ nhưng tôi nhớ rằng nó khá đơn giản và hoạt động hơi giống như thế này

  • Bản đồ Starcraft 2 được chia thành các ô
  • Đối với mỗi nguồn creep, mỗi "tick" chọn một ô ngẫu nhiên có thể dễ dàng cho creep lan rộng và lây lan creep lên ô đó
  • Creep có thể lan sang bất kỳ gạch nào
    • Liền kề với một ô khác có creep trên nó, hoặc liền kề với nguồn của creep
    • Trong một phạm vi nhất định của nguồn creep
    • Không phải là một vách đá

Cách dễ nhất để theo dõi creep gạch đã lan rộng có lẽ chỉ là một cờ cho mỗi ô - đừng 'tính lại nó mỗi lượt.

Thời gian giữa các "bọ ve" có thể được sử dụng để kiểm soát tốc độ lây lan của creep, thay vào đó, bạn có thể cho phép creep lan rộng ra nhiều ô cho mỗi "tick" hoặc thậm chí ngẫu nhiên thời gian giữa các tick.

Thuật toán trên có tác dụng giúp creep lan truyền nhanh hơn nếu nó bị chặn bởi các vách đá ở hai bên, tuy nhiên, thay vào đó bạn có thể chọn một ô ngẫu nhiên trong phạm vi của nguồn creep và sau đó chỉ lan creep vào ô đó nếu nó không phải là một vách đá .


Đẹp nhưng những gì về leo một gạch , thuật toán là đơn giản, tôi mặc dù với một cái gì đó tương tự. Nhưng làm thế nào để có được hiệu ứng tự nhiên , không hoàn hảo này bằng cách sử dụng gạch?
nathan

@nathan Ý bạn là sao? Bởi vì gạch leo được chọn ngẫu nhiên, sự lây lan là không hoàn hảo (trái ngược với trải rộng trong một vòng tròn hoàn hảo). Phần còn lại được thực hiện trong công cụ đồ họa bằng cách chọn họa tiết nào sẽ được hiển thị cho mỗi ô.
Justin

vâng câu hỏi của tôi là về cách chọn gạch nào sẽ sử dụng để có được hiệu ứng mạch lạc.
nathan

1
@nathan Họ rất có thể có rất nhiều sprite được prerendered mà khi đặt cạnh nhau trong sự kết hợp đúng, tạo ra hiệu ứng hình ảnh mong muốn.
Panda Pajama

1
@nathan Có lẽ nên hỏi làm thế nào để hiển thị nó, hơn là làm thế nào để sản xuất nó.
MichaelHouse
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.