Khi sử dụng tính kết nối từ , bạn sẽ sử dụng công cụ phù hợp nhất để xác định giải pháp: lý thuyết đồ thị.
Kết nối là một thuộc tính của đồ thị. Các biểu đồ có thể được kết nối hoặc ngắt kết nối (như bạn đang gặp phải, AKA là một hình đa sắc). Bất kỳ cấp độ trò chơi nào, ở bất kỳ số lượng kích thước nào, đều có thể được biểu diễn dưới dạng biểu đồ và theo logic, đây thường là cách tốt nhất để thao tác chúng. Thế giới trò chơi của bạn là một biểu đồ về sự phụ thuộc giữa các khối xây dựng riêng lẻ trong thế giới của bạn; và cũng ở mức độ kết nối giữa các lĩnh vực khác nhau của bạn. Bạn có thể sử dụng cái trước để lấy cái sau.
Có một điểm rất quan trọng để xem xét khi làm việc với các mức (2D) dưới dạng biểu đồ, và đó là tính phẳng . Tùy thuộc vào yêu cầu của bạn, tính đồng nhất có thể hoặc không phải là mối quan tâm. Với việc bạn sử dụng tiếng ồn, tôi mong đợi điều sau, tuy nhiên tôi phác thảo các tùy chọn ở đây để bạn biết chúng là gì.
Đồ thị phẳng - ví dụ đơn giản nhất là một mê cung. Một mê cung khác với một mê cung ở chỗ nó không chứa các nhánh - nó là một con kỳ lân . Nếu bạn định lấy một khối cây bụi (!) Vững chắc và tạo ra một mê cung xuyên qua nó, thì không có lúc nào có thể rẽ vào mê cung, chạy vào một con đường hiện có. Nó thực sự giống như một trò chơi của Snake, thực sự - nếu con đường là cơ thể của con rắn, nó không thể được phép cắn / giao nhau. Hơn nữa , bạn có thể có một mê cung phẳng; điều này sẽ phân nhánh, nhưng không có lúc nào các nhánh có thể được phép giao nhau các phần hiện có của mê cung đã được tạo ra, giống như với một mê cung.
Biểu đồ không phẳng - Ví dụ đơn giản nhất là bản đồ đường phố thành phố. Một thành phố về cơ bản là một mê cung. Tuy nhiên, nó là một mê cung được kết nối cao ở chỗ có nhiều tuyến đường riêng lẻ để đi từ nơi này đến nơi khác. Hơn nữa, việc nhúng đồ thị không phẳng cho phép giao cắt, đó chính xác là giao điểm. Và như chúng ta đã biết, một thành phố không phải là một thành phố không có giao lộ. Chúng là không thể thiếu cho lưu lượng giao thông. Trong các trò chơi, điều này có thể tốt hoặc xấu, tùy thuộc vào mục tiêu của bạn. Dòng chảy tốt cho phép AI hành động dễ dàng hơn và khám phá được tự do hơn; mặt khác, nó cũng cho phép người chơi đi từ điểm bắt đầu đến mục tiêu một cách nhanh chóng - có khả năng quá nhanh.
Điều này đưa chúng tôi đến phương pháp của bạn, đó là sử dụng tiếng ồn. Tùy thuộc vào đầu ra nhiễu Perlin được diễn giải, nó có thể có một số mức độ kết nối như thang đo vĩ mô, nhưng nó không được thiết kế cho kết nối 1 (một biểu đồ duy nhất). Điều này để lại cho bạn một vài lựa chọn.
Bỏ việc sử dụng tiếng ồn Perlin và thay vào đó tạo ra một biểu đồ được kết nối ngẫu nhiên, không chéo (không giao nhau). Điều này cung cấp kiểm soát lưu lượng tối đa. Tuy nhiên, cách tiếp cận này không tầm thường, bởi vì tính phẳng của đồ thị đòi hỏi phải xác định và loại bỏ các sơ đồ con Kuratowski K3,3 và K5; cũng như sản xuất một mặt phẳng nhúng tiếp theo; cả hai đều là vấn đề NP-đầy đủ. Đây chắc chắn là cách tiếp cận khó nhất, nhưng nó phải được đề cập trước tiên để biết bạn đang đứng ở đâu. Tất cả các phương pháp khác là một lối tắt của một số loại, xung quanh phương pháp này, đó là toán học cơ bản đằng sau việc tạo mê cung.
Bỏ việc sử dụng tiếng ồn Perlin và thay vào đó tạo ra một đồ thị phi phẳng ngẫu nhiên được nhúng trong bề mặt phẳng (AKA một mặt phẳng nhúng) - đây là cách các trò chơi như Diablo và roguelike có thể hoạt động dễ dàng, vì cả hai đều sử dụng lưới cấu trúc để chia nhỏ một không gian phẳng (trên thực tế, phần lớn các cấp độ trong roguelike DO cho phép giao cắt, hiển nhiên trong số lượng giao lộ bốn chiều). Các thuật toán tạo ra sự kết nối giữa các ô hoặc phòng mẫu thường được gọi là "thợ khắc" hoặc "người điều chỉnh", bởi vì chúng tăng không gian trống ra khỏi một khối đá rắn, tăng dần.
Làm như tùy chọn (2), nhưng tránh giao nhau. Do đó, cả hai nhúng (hình học mức) là phẳng, và cấu trúc liên kết (dòng chảy cấp) cũng là phẳng. Bạn sẽ phải cẩn thận để không tự biến mình vào ngõ cụt, nếu bạn muốn tránh giao cắt.
Tạo bản đồ của bạn bằng cách sử dụng tiếng ồn. Sau đó, bằng cách sử dụng thuật toán lấp đầy trên mọi ô ở cấp độ không được kết nối của bạn (là biểu đồ, mặc dù đa bội và dựa trên lưới), bạn có thể suy ra tất cả các sơ đồ con không liên kết, rời rạc trong đa lớp lớn hơn đó. Tiếp theo, hãy xem xét cách bạn muốn kết nối từng sơ đồ con riêng lẻ. Nếu bạn muốn tránh giao cắt, tôi đề nghị một kết nối tuần tự của những điều này. Nếu không, bạn có thể kết nối chúng theo bất kỳ cách nào bạn muốn. Để thực hiện việc này một cách hữu cơ, thay vì tạo ra các đoạn cứng, thẳng, tôi sẽ sử dụng một số loại hàm kết hợp để trộn các điểm gần nhất của mỗi cặp đồ thị con (nếu liên kết tuần tự). Điều này sẽ làm cho phép nối trở nên "lỏng" hơn, phù hợp với đầu ra Perlin điển hình. Một cách khác mà bạn có thể tham gia các khu vực sẽ là đẩy họ lại gần nhau hơn,
Tạo một bản đồ quá lớn sử dụng tiếng ồn. Cô lập tất cả các sơ đồ con như được mô tả trong tùy chọn 3. Xác định cái nào là thú vị nhất, theo các tiêu chí nhất định (có thể là kích thước, hoặc một cái gì đó khác, nhưng kích thước sẽ dễ nhất). Chọn ra và chỉ sử dụng sơ đồ con đó, nó đã hoàn toàn tự kết nối. Khó khăn với cách tiếp cận này là bạn có thể khó kiểm soát kích thước của đồ thị kết quả của mình, trừ khi bạn vũ phu tạo ra một bản đồ thực sự lớn, hoặc nhiều bản đồ nhỏ hơn, để chọn sơ đồ con hoàn hảo của bạn. Điều này là do kích thước của các sơ đồ con thực sự phụ thuộc vào các tham số Perlin được sử dụng và cách bạn diễn giải kết quả.
Ngoài hai phần cuối, một điều tôi chắc chắn bạn đã làm, nhưng chỉ trong trường hợp không: Tạo trường hợp kiểm tra tiếng ồn Perlin tối thiểu trong Flash. Chơi xung quanh với các tham số cho đến khi bạn có được mức độ kết nối cao hơn giữa các khu vực "đảo" của bạn. Tôi không nghĩ rằng điều này có thể giải quyết vấn đề của bạn 100% qua tất cả các thế hệ, vì tiếng ồn Perlin không có sự đảm bảo vốn có của sự kết nối. Nhưng nó có thể cải thiện kết nối.
Bất cứ điều gì bạn không hiểu, hãy hỏi và tôi sẽ làm rõ.