Làm thế nào tôi có thể thực hiện trạng thái liên tục cho các đối tượng được xác định ở cấp độ?


17

Tôi đang phát triển một Metroidvania 2D bao gồm một loạt các cấp độ liên kết có thể được xem xét lại.

Mỗi cấp độ được biểu thị bằng tệp TMX Tiled trong đó tôi đã chỉ định nơi các đối tượng khác nhau của các lớp sprite khác nhau sinh ra (ví dụ: kẻ thù, kẻ nhặt đồ, đòn bẩy, v.v.). Khi bắt đầu một trò chơi mới, tải một trò chơi đã lưu hoặc thay đổi một cấp độ, vòng lặp trò chơi của tôi chạy qua tệp TMX thích hợp và tạo ra tất cả các đối tượng ở cấp độ đó.

Tôi xử lý các thay đổi cấp độ theo cách sau: Nếu Playerđối tượng giao nhau với một Portalđối tượng, một change_map()phương thức được gọi là tải một bản đồ mới (một liên kết với cổng thông tin giao nhau) và đặt người chơi ở vị trí thích hợp trên bản đồ mới.

Một số đối tượng của tôi có trạng thái mà tôi muốn kiên trì thông qua thay đổi cấp độ và lưu và thoát khỏi trò chơi. Ví dụ: nếu người chơi mở khóa cửa và thuộc tính trạng thái của cửa được đặt thành "mở", tôi muốn cửa mở khi người chơi quay lại. Tôi muốn một cái gì đó tương tự cho các đòn bẩy, có thể được đặt sang trái hoặc phải và nhiều đối tượng khác. Hơn nữa, đôi khi người chơi sẽ thu thập các vật phẩm mà tôi không muốn hồi sinh khi người chơi ghé thăm lại khu vực đó.

Câu hỏi của tôi là làm thế nào tôi có thể xử lý loại kiên trì này?

Tôi đang làm việc trong Python, mặc dù tôi nghĩ bạn có thể trừu tượng ra khỏi đó.

Câu trả lời:


27

Tôi nghĩ rằng không xem xét quá mức vấn đề này sẽ mang lại kết quả tốt nhất vì vậy tôi sẽ chỉ triển khai một hệ thống lưu giá trị khóa đơn giản vào trò chơi của bạn mà bạn lưu trữ dọc theo dữ liệu lưu khác của bạn và sau đó tải theo yêu cầu khi bạn cần truy cập trạng thái trước đó.

Dòng chảy có thể trông giống như thế này:

  1. Tải mức từ tệp
  2. Trước khi đặt một ô / đối tượng kiểm tra xem nó có thuộc tính "liên tục" không.
    1. Nếu có: Kiểm tra cặp khóa-giá trị đã lưu cho khóa khớp với thuộc tính và tìm nạp giá trị phê duyệt.
    2. Nếu không: Đặt đối tượng như bình thường
  3. Khi người chơi thoát khỏi cấp / lưu vòng lặp trò chơi thông qua tất cả các đối tượng có thuộc tính "liên tục" và lưu chúng dưới dạng cặp khóa-giá trị.

Đây là một ví dụ mã giả dựa trên những gì tôi sử dụng cho trò chơi 2D đơn giản của mình:

def load_map(map):
    for y in range(0, height):
        for x in range(0, width):
            tile = map[x, y]

            for property in tile.properties:
                if is_persistent(property.name):
                    // Name prefixed with "persistent" means that it's persistent
                    // so we load the value from out persistent storage
                    property.value = persistent_values[property.name]

def save_map(map):
    ... everything in load_map ...
    if (property.name.matches("persistent_*")):
        // Name prefixed with "persistent" means that it's persistent
        // so we save the value to persistent storage
        persistent_values[property.name] = property.value

def is_persistent(name):
    return name.matches("persistent_*") and persistent_values.contains(name)

Sau đó, tôi chỉ có thể kiểm tra trạng thái bằng cách sử dụng tài sản này:

def draw():
    if properties["persistent_is_pressed"].value:
        draw_sprite(button_pressed)
    else:
        draw_sprite(button_unpressed)

def on_pressed():
    properties["persistent_is_pressed"].value = not properties["persistent_is_pressed"].value

Nếu bạn đang sử dụng trình chỉnh sửa bản đồ được lát gạch như Tiled thêm các thuộc tính như thế này thì rất dễ:

thêm tài sản

Hy vọng rằng điều này sẽ cung cấp cho bạn một ý tưởng về cách thực hiện trạng thái liên tục đơn giản nhất có thể!


Điều này rất hữu ích, mặc dù tôi đang cố gắng để xem chính xác làm thế nào để áp dụng nó vào tình huống của tôi. Tôi sẽ suy nghĩ về nó nhiều hơn nữa.
GoldenGremlin

Tôi nghĩ rằng tôi đang gặp khó khăn khi xem làm thế nào tôi có thể tiết kiệm các giá trị để làm việc. Khi tôi đang lưu, tôi sẽ không lặp lại các ô trong dữ liệu TMX. Thay vào đó, tôi sẽ lặp lại các đối tượng sprite trong nhóm all_sprites của mình. Khi tôi tải bản đồ, tôi sử dụng các thuộc tính TMX của các đối tượng TMX làm tham số khi khởi tạo các đối tượng sprite của mình, nhưng sau đó tôi không chạm vào các thuộc tính đó, vì vậy chúng không theo dõi các thay đổi trong các đối tượng sprite.
GoldenGremlin

1
@dietestus Có lẽ bạn chỉ nên cung cấp cho các đối tượng sprite của mình một propertiestrường mà bạn sửa đổi thay vào đó và chỉ sử dụng các ô propertiesnhư một dấu hiệu của thuộc tính nào cần sửa đổi (nhưng tất cả dữ liệu được lưu trữ trong sprite của bạn). Bạn cũng có thể chuyển gạch cho sprite của mình để bạn có thể sửa đổi lát từ sprite :) nếu không rõ ý tôi là gì tôi có thể giả lập thêm một mã giả
Charanor

3
@dietestus Ngay khi bạn tương tác với một thực thể liên tục (cửa, đòn bẩy), bạn lưu trạng thái mới vào bản đồ khóa-giá trị. Bạn không cần phải lặp lại trên bản đồ khi bạn lưu, bạn đã có mọi thứ trong bản đồ của mình.
Herr Derb

1
@dietestus Có bạn là :) nó là một từ điển đơn giản trong đó các khóa là tên thuộc tính và các giá trị là (cũng ... giá trị). Có nhiều đối tượng trên cùng một ô sẽ không thay đổi bất cứ điều gì miễn là bạn có các khóa duy nhất.
Charanor
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.