Tạo một cấp độ 2D nhiều vòng lặp liền mạch?


15

Một cuộc thảo luận đã xuất hiện gần đây về cách tạo ra một trò chơi nhiều người chơi cuộn bên 2D có thể có thiết kế cấp độ vòng lặp (Hãy nghĩ về Starbound và cách thế giới của họ đang lặp lại).

Tôi nghĩ cách đơn giản nhất là có một bản đồ hình chữ nhật với các khu vực kích hoạt có thể dịch chuyển người chơi từ bên này sang bên khác. Tuy nhiên, vấn đề rõ ràng với cách tiếp cận này là trường hợp có nhiều người chơi ở rìa bản đồ cùng một lúc. Bạn không muốn dịch chuyển người chơi trước mặt nhau và bạn sẽ cần một cách để vận chuyển người chơi mà không khiến người chơi khác biến mất.

Để chắp thêm ý tưởng này và khắc phục vấn đề tôi đã đưa ra như sau: có một khu vực kích hoạt (hình vuông màu đỏ trong hình ảnh) nơi người chơi sẽ có thể nhìn thấy "khu vực nhân bản" (hình vuông màu xanh lá cây). Trong hình vuông màu xanh lá cây này, các đối tượng từ phía đối diện của khu vực kích hoạt sẽ được sao chép vào khu vực nhân bản tương ứng của nó (có thể được nhìn thấy với hình dạng A & B). Khi người chơi đến cạnh bắt đầu của "khu vực nhân bản", họ sẽ bị dịch chuyển sang phía bên kia của bản đồ.

hình ảnh

Trong ví dụ này, Người chơi 2 sẽ nghĩ rằng họ đang nhìn thấy Người chơi 1, tuy nhiên họ thực sự sẽ thấy bản sao của anh ta và ngược lại.

Điều này có vẻ hơi cực đoan và phức tạp cho vấn đề trong tầm tay. Câu hỏi của tôi bây giờ là để biết liệu giải pháp này là một cách tiếp cận tốt để giải quyết vấn đề, hay có cách nào đơn giản hơn để giải quyết vấn đề này?


Người chơi có được phép di chuyển ngược về khu vực trước không?
XiaoChuan Yu

vâng, qua lại để nó mang lại hiệu ứng "đi vòng quanh thế giới". Tương tự như cách một thế giới trong sao là
KenQueso

2
Bạn đã từng nghĩ chỉ làm cho thế giới trở thành một vòng tròn lớn? hoặc coi cấp độ là một vòng tròn lớn và chuyển nó sang giai đoạn 2D phẳng?
Nzall

bạn không thể luôn luôn căn chỉnh vị trí máy ảnh với người chơi được kiểm soát?
Ali1S232

Câu trả lời:


16

Hệ thống này với tất cả các kích hoạt này nghe có vẻ hơi phức tạp và dễ bị lỗi.

Bạn có thể bọc vị trí của người chơi bằng cách sử dụng modulo bằng một cái gì đó như playerPositionX = playerPositionX % mapWidth

Bằng cách này, khi nghe nhạc của bạn đạt đến playerPosition == mapWidthsự playerPositionsẽ reset về 0.

Giải pháp này có thể được mở rộng với toàn bộ hệ thống kết xuất.


1
Điều này sẽ không có vấn đề gần gũi bởi những người chơi nhìn thấy những người chơi có vị trí thiết lập lại dịch chuyển tức thời?
KenQueso

Làm thế nào bạn sẽ mở rộng điều này đến hệ thống kết xuất?
Mikael Högström

Bạn có thể có một người chơi luôn ở trung tâm của máy ảnh và có bản đồ bao quanh. Giống như một bản đồ trong nền văn minh trên chế độ trái đất. Một cách tiếp cận khác có thể là hiển thị phần hiển thị của người chơi sang cả hai mặt của bản đồ.
Exaila

4
@ MikaelHögström Chỉ hiển thị như bình thường, nhưng những thứ ở gần cạnh phải phải được hiển thị lần thứ hai ở bên trái (tức là tại pos - map_width).
Mario

1
Bất cứ nơi nào trong mã của bạn mà bạn đang tìm kiếm 'đối tượng nào ở tọa độ này' hoặc 'tọa độ của đối tượng này là gì', bạn sẽ biến nó thành xcoord% mapWidth. Thật khó để nói nếu không có mã của bạn, nhưng điều đó có thể sẽ khiến nó hiển thị chính xác.
Tin Man

13

Giải pháp kinh điển là sử dụng cổng . Trong ví dụ của bạn, chỉ có một cấp độ, ngoại trừ có một cổng kết nối hai đầu bên trái và bên phải.

Bất cứ thứ gì di chuyển qua cổng đó sẽ được dịch sang tọa độ của đầu kia của cổng, do đó, nếu có thứ gì đó di chuyển qua cổng, nó sẽ xuất hiện ở phía bên phải của cấp độ và ngược lại.

Máy ảnh của bạn cũng cần hỗ trợ các cổng; nếu cổng thông tin nằm trong máy ảnh, thì nó phải hiển thị các phần của cấp độ ở hai bên của cổng. Nếu bạn quen thuộc với các trình chỉnh sửa hình ảnh cho đồ họa gạch liền mạch, thì đó cũng là một thỏa thuận ở đây.

Phần tẻ nhạt là mọi thứ liên quan đến khoảng cách hoặc đường dẫn cũng sẽ cần hỗ trợ các cổng. Điều này bao gồm AI, đại số tầm nhìn, suy giảm âm thanh và như vậy.

Điều tuyệt vời về cổng thông tin là nó rất mạnh mẽ. Công cụ xây dựng đã sử dụng nó để mô phỏng các cấp độ nhiều tầng, mặc dù nó không phải là một công cụ 3d "thực sự". Một số động cơ hiện đại cũng sử dụng cổng để tạo ra các không gian phi Euclide; Portal và Antichamber là những ví dụ đáng chú ý trong 3D.


2
Nếu bạn nghe bình luận của trò chơi cổng thông tin, một phần của cách thức hoạt động của cổng thông tin bằng cách nhân bản những gì có thể nhìn thấy qua lỗ hổng. (nhưng vì lý do vật lý thay vì kết xuất)
Vịt Mooing

6

Hãy nhớ rằng những gì bạn hiển thị trên màn hình và những gì trong bộ nhớ là hai thứ hoàn toàn khác nhau. Hãy tưởng tượng bạn có một cửa sổ mà bạn cần điền dữ liệu về thế giới. Bạn điền vào cửa sổ từ trái sang phải. Trong khi bạn đang phân tích dữ liệu của mình để lấp đầy thế giới, nếu bạn đến tận cùng của thế giới, chỉ cần lặp lại xung quanh để bắt đầu dữ liệu của bạn. Sử dụng một hoạt động modulo là lý tưởng. Hãy nhớ rằng bạn cần phải làm điều này cho tất cả mọi thứ . Đạn, tia, người chơi, vật lý; tất cả họ cần phải có vị trí của họ được bọc khi vượt qua giới hạn thế giới.

Mỗi người chơi chia sẻ dữ liệu, nhưng có quan điểm riêng về dữ liệu. Cửa sổ của họ được bố trí khác nhau tùy thuộc vào nơi họ đang đứng trên thế giới.

Điều này có nghĩa là không cần tạo bản sao hoặc dịch chuyển tức thời bất cứ ai. Về cơ bản, bạn đang tạo bản sao, chỉ bằng cách hiển thị các ký tự cho màn hình của nhau.


3

Ngắt kết nối kết xuất khỏi thế giới và bạn có thể thực hiện kết xuất và chỉnh sửa chính xác mà không cần dùng đến bất kỳ tạo tác nhân bản hoặc dịch chuyển tức thời nào.

Đầu tiên, trong thế giới của bạn, bạn có một thế giới kích thước cố định, từ 0đếnWidth . Bất cứ khi nào một đối tượng xuống dưới 0, bạn sẽ bọc nó đến cuối và bất cứ khi nào một đối tượng Widthkết thúc nó sẽ bắt đầu. Điều này có nghĩa là tất cả các đối tượng logic trong thế giới của bạn luôn nằm trong phạm vi 0...Width.

Thứ hai, để kết xuất bạn sẽ làm modulo trên vị trí. Vì vậy, phía bên trái của màn hình là "Base" và bên phải là "Base + Size". Vì vậy, bạn nhìn qua thế giới của bạn cho bất cứ điều gì trong phạm vi đó. Bạn thực sự sẽ tìm kiếm phạm vi modulo, ánh xạ nó trở lại0...Width .

Thủ thuật trong khi tìm kiếm là trả về vị trí của đối tượng so với Base bên trái. Điều này chuyển đổi sang tọa độ cục bộ của màn hình để bản thân trình kết xuất không phải lo lắng về modulo, chỉ có việc tra cứu mới thực hiện được.

Bạn không cần sao chép bất cứ thứ gì vì mỗi trình kết xuất chỉ giao dịch với đối tượng ở một vị trí.

Nếu thế giới của bạn được sản xuất theo phân khúc hoặc sử dụng cấu trúc 3D, bạn sẽ phải phân đoạn thế giới đó. Do đó, nó không phải là một khối đồng thuận, nhưng có thể được di chuyển để chứa kết xuất này. Bạn không cần nhiều khối, tối thiểu là 2 khối.


1

Tôi nghĩ rằng cách tiếp cận hợp lý duy nhất sẽ là triển khai thế giới bao bọc của bạn trong một cấu trúc dữ liệu cơ bản hoàn toàn minh bạch đối với trò chơi và người dùng. Vì vậy, trên một số Cấp độ thấp, bạn có một hàm mapCoordine () bao bọc tọa độ thực tế của bạn với tài nguyên bản đồ cơ bản của bạn ...

Vì vậy, nếu Thế giới thực của bạn chỉ rộng 10 phút, người chơi và trò chơi sẽ không biết điều đó. Đối với người chơi, thế giới là vô hạn - và nếu trò chơi hỏi điều gì ở vị trí 15 - chức năng cơ bản sẽ dịch yêu cầu này, modulo10 và sẽ cung cấp gói vật phẩm ở vị trí 5.

Vì vậy, đối với toàn bộ logic trò chơi và mọi thứ khác, giống như bạn có một thế giới rộng lớn vô tận, nơi chỉ có những bản sao của mọi thứ.


1

Nó không hoàn toàn giống nhau, nhưng tôi đã thực hiện một cái gì đó tương tự tại một trò chơi kẹt. Trò chơi có người chơi di chuyển trên một cấp độ tròn nhỏ, bao quanh khi người chơi đạt đến vị trí 'x' của pi. Kết xuất rất dễ dàng vì chúng tôi chỉ hiển thị mọi thứ và sau đó xoay một camera bù để theo dõi những gì đang diễn ra. Bạn có thể thực hiện một cái gì đó tương tự, như đã được đề xuất ở trên:

  • Khi vẽ, kiểm tra vị trí camera và xác định những gì cần vẽ, có tính đến vị trí camera và tầm nhìn của nó.
  • Trong trường hợp máy ảnh nhìn qua 'cạnh' của bản đồ, hãy chọn một lượng nội dung phù hợp từ phía bên kia của thế giới để vẽ lên cạnh đó, thường chỉ bằng cách thêm hoặc trừ độ rộng của cấp độ vào vị trí của chúng.
  • Logic trò chơi cần phải nhận thức được đường may này và điều chỉnh cho nó như được đề cập trong các câu trả lời khác. Các trường hợp đặc biệt cần lưu ý là va chạm trong đó một đối tượng ở một bên, nhưng đang va chạm với một đối tượng ở phía bên kia.
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.