2010-10-22 33 views
6

Tôi có trò chơi dựa trên lưới (platformer), nơi tôi đã dựa trên mọi thứ trên các ô xếp. Tôi có gạch cứng và lỏng. Tôi đang cố gắng tìm một cách tốt để làm cho gạch nước mô phỏng nước một cách thô ráp.Mô hình nước/lưới lỏng 2D (nền tảng gạch nền tảng)

Hiện tại tôi có hệ thống hiện tại: Khi gạch nước được thêm vào trên một ô nước khác, nó sẽ thêm 1 vào ô nước bên dưới. Con số chỉ ra áp lực.

Sau đây là cách nó trông giống như tại thời điểm này:

[0] <- This water tile has 0 in pressure. 
[1] <- This water tile has 1 in pressure. 

nếu tôi thêm một gạch nước bên cạnh đáy một, nó tìm kiếm từ trái, phải và trên nếu có bất kỳ gạch nước và inheritates lớn nhất áp lực xung quanh nó.

Ví dụ:

[0] 
[1][1] 

Và đây là một ví dụ lớn hơn sau khi thêm vài gạch nước:

[0][0] 
[1][1][1][1] 
[2][2][2][2][2] 

Sau đó, tôi làm cho mỗi ngói nước có áp lực đó là bằng hoặc lớn hơn 1 cố gắng để di chuyển trái/phải nếu có không gian trống, sau đó đặt áp lực về 0 và kiểm tra xem nó có thể thừa hưởng áp lực xung quanh bản thân từ gạch nước láng giềng không nếu có.

Hệ thống này hoạt động rất tốt, ngoại trừ trường hợp gạch nước được lấy ra từ trên cùng.

Nếu tôi loại bỏ các gạch nước đầu từ ví dụ cuối cùng:

[1][1][1][1] 
[2][2][2][2][2] 

Sau đó, chúng tôi có hàng hàng đầu với áp lực 1, cần có 0 hiện nay và hàng dưới cùng nên có 1.

Có một số hệ thống thông minh hơn mà tôi có thể triển khai để thực hiện điều này đúng hơn không?

Dưới đây là các hạn chế:

Mỗi ô chỉ có thể kiểm tra các ô lân cận. Ngói có thể có bất kỳ chức năng nào được xác định. Ngói có thể có bất kỳ biến nào để lưu trữ dữ liệu.

Các bạn có thể tìm ra một hệ thống tốt hơn hoạt động tốt hơn hệ thống của tôi không?

Các trường hợp kiểm tra thường lệ tôi làm là:

[] 
[] should become [][] 

[] 
[] 
[] should become [][][] 

    [] 
[][][] should become [][][][] 

Giả sử các trò chơi chạy một thời gian.

Mọi đề xuất sẽ được hoan nghênh hơn!

Trả lời

0

Có lẽ bạn có thể quên đi áp lực (vì bạn không thực sự sử dụng chúng như áp lực) và chỉ cần sử dụng một bool tryMove hoặc một cái gì đó như thế.

Mỗi bước mô phỏng nên được chia thành hai substeps:

vòng lặp đầu tiên trong gạch:

  1. Nếu không gian dưới đây là miễn phí, thiết tryMove true, kết thúc ngói này.
  2. Nếu có ô ở trên, hãy đặt tryMove thành true khác đặt tryMove thành false.
  3. Nếu bất kỳ người hàng xóm nào cố di chuyển, hãy đặt tryMove thành true.

vòng lặp thứ hai trong gạch:

  1. Nếu cố gắng để di chuyển và không gian bên dưới là miễn phí, ngói di chuyển xuống, thiết lập tryMove false, ngói kết thúc.
  2. Nếu cố gắng di chuyển và có thể di chuyển sang một bên (không gian trống sang trái hoặc bên phải) đặt hàng xóm tryMove là false, di chuyển nó, đặt tryMove này là false, hoàn thành ô xếp.

Tôi nghĩ điều này sẽ khắc phục được sự cố của bạn.

0

Nếu bạn có tài nguyên để hỗ trợ, tôi khuyên bạn nên sử dụng chức năng đệ quy cố gắng đẩy ô vuông sang trái và phải từ trên cao. Nếu hàm tìm thấy một ô khác bên dưới, nó có thể thử di chuyển ô đó sang hai bên. Phương pháp tốt nhất là bắt đầu bước sang trái và phải, mỗi lần một lát. Nếu nó tiếp tục tìm gạch nước, thì nó cứ tiếp diễn. Cuối cùng nó sẽ chạy ra khỏi gạch để kiểm tra (kết thúc tại một bức tường) hoặc sẽ tìm thấy một gạch nước với không gian trống để di chuyển qua. Sau nhiều lần lặp lại, nước nên đẩy ra ngoài và nhường chỗ cho nước cao hơn rơi xuống.

Hãy để tôi khai báo lại bản chất trái của bản đệ quy. Về cơ bản, một khi chức năng làm cho nó đến mức cơ bản của nước, nó sẽ bắt đầu lựa chọn gạch nước, xen kẽ trái và phải. Vì vậy, trước tiên nó sẽ kiểm tra gạch trực tiếp trái, sau đó trực tiếp bên phải, sau đó hai bên trái, sau đó hai bên phải, vv Nếu nó tìm thấy một gạch không khí, nó nên làm một chuyển của gạch nước gần nhất. Nếu nó tìm thấy một cái gì đó khác (thường là một bức tường) nó nên bỏ về phía đó. Một khi nó được đưa ra trên cả hai mặt, bạn nên xem xét các hành vi khác thay vào đó, chẳng hạn như các nước trên cùng một cách ngẫu nhiên đi du lịch xung quanh trên bề mặt.

Nếu bạn thực sự muốn hành vi có vẻ tự nhiên, tôi khuyên bạn nên chọn biến ngẫu nhiên để quyết định xem nó có kiểm tra trái hoặc phải trước không. Nếu không, bạn có thể sẽ kết thúc với các mẫu kỳ lạ định kỳ.

Các vấn đề liên quan