ฉันจะใช้สถานะถาวรสำหรับวัตถุที่กำหนดในระดับได้อย่างไร


17

ฉันกำลังพัฒนา Metroidvania 2D ซึ่งประกอบด้วยชุดของระดับที่เชื่อมต่อระหว่างกันที่สามารถมาได้อีกครั้ง

แต่ละระดับจะแสดงด้วยไฟล์ Tiled TMXซึ่งฉันได้ระบุตำแหน่งที่วัตถุต่าง ๆ ของคลาสสไปรต์ที่แตกต่างกันวางไข่ (ตัวอย่างเช่นศัตรูรถปิคอัพคันโยก ฯลฯ ) เมื่อเริ่มเกมใหม่โหลดเกมที่บันทึกไว้หรือเปลี่ยนระดับลูปเกมของฉันจะทำงานผ่านไฟล์ TMX ที่เหมาะสมและสร้างวัตถุทั้งหมดในระดับนั้น

ฉันจัดการกับการเปลี่ยนแปลงระดับด้วยวิธีต่อไปนี้: หากPlayerวัตถุตัดกันPortalวัตถุchange_map()วิธีการหนึ่งถูกเรียกใช้ซึ่งโหลดแผนที่ใหม่ (อันที่เกี่ยวข้องกับพอร์ทัลที่ตัดกัน) และวางตำแหน่งผู้เล่นในตำแหน่งที่เหมาะสมบนแผนที่ใหม่

วัตถุบางอย่างของฉันมีสถานะซึ่งฉันต้องการที่จะคงอยู่ผ่านการเปลี่ยนแปลงระดับและบันทึกและเลิกเล่นเกม ตัวอย่างเช่นหากผู้เล่นปลดล็อคประตูและคุณลักษณะสถานะของประตูถูกตั้งค่าเป็น "เปิด" ฉันต้องการให้ประตูเปิดเมื่อผู้เล่นกลับมา ฉันต้องการสิ่งที่คล้ายกับคันโยกซึ่งสามารถตั้งค่าเป็นซ้ายหรือขวาและวัตถุอื่น ๆ นอกจากนี้ผู้เล่นบางครั้งจะมีรายการที่ฉันไม่ต้องการที่จะเกิดใหม่เมื่อผู้เล่นกลับมาที่พื้นที่

คำถามของฉันคือฉันจะจัดการกับความเพียรแบบนี้ได้อย่างไร

ฉันทำงานใน Python แม้ว่าฉันคิดว่าคุณสามารถหลีกเลี่ยงได้

คำตอบ:


27

ฉันคิดว่าการไม่คิดมากเรื่องนี้จะให้ผลลัพธ์ที่ดีที่สุดดังนั้นฉันจะใช้ระบบการบันทึกค่าคีย์แบบง่ายๆในเกมของคุณที่คุณเก็บไว้ตามข้อมูลบันทึกอื่น ๆ ของคุณจากนั้นโหลดตามความต้องการเมื่อคุณต้องการเข้าถึงสถานะก่อนหน้า

การไหลอาจมีลักษณะเช่นนี้:

  1. โหลดระดับจากไฟล์
  2. ก่อนทำการตรวจสอบไทล์ / วัตถุหากมีคุณสมบัติ "ถาวร"
    1. ถ้าใช่: ตรวจสอบคู่คีย์ - ค่าที่บันทึกไว้สำหรับคีย์ที่ตรงกับคุณสมบัติและดึงค่าที่อนุมัติ
    2. ถ้าไม่: วางวัตถุตามปกติ
  3. เมื่อผู้เล่นออกจากระดับ / บันทึกลูปเกมผ่านวัตถุทั้งหมดที่มีคุณสมบัติ "ถาวร" และบันทึกไว้เป็นคู่ค่าคีย์

ต่อไปนี้เป็นตัวอย่างรหัสหลอกตามสิ่งที่ฉันใช้สำหรับเกม 2D ที่เรียบง่ายของฉัน:

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)

จากนั้นฉันสามารถตรวจสอบสถานะโดยใช้คุณสมบัตินี้:

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

หากคุณใช้โปรแกรมแก้ไขแผนที่แบบเรียงต่อกันเช่นเพิ่มคุณสมบัติแบบเรียงต่อกันแบบนี้ง่ายมาก:

เพิ่มคุณสมบัติ

หวังว่านี่จะทำให้คุณมีความคิดเกี่ยวกับวิธีการใช้สถานะถาวรให้ง่ายที่สุด!


สิ่งนี้มีประโยชน์มากแม้ว่าฉันจะพยายามดูว่าจะนำไปใช้กับสถานการณ์ของฉันได้อย่างไร ฉันจะคิดถึงมันเพิ่มอีก
GoldenGremlin

ฉันคิดว่าฉันมีปัญหาในการมองเห็นว่าฉันจะประหยัดค่าการทำงานได้อย่างไร เมื่อฉันบันทึกฉันจะไม่วนซ้ำไพ่ในข้อมูล TMX แต่ฉันจะวนซ้ำวัตถุสไปรท์ในกลุ่ม all_sprite ของฉัน เมื่อฉันโหลดแผนที่ฉันใช้คุณสมบัติ TMX ของวัตถุ TMX เป็นพารามิเตอร์เมื่อทำให้วัตถุสไปรต์ของฉันเป็นอินสแตนซ์ แต่หลังจากนั้นฉันไม่ได้สัมผัสคุณสมบัติเหล่านั้นดังนั้นพวกเขาจึงไม่ได้ติดตามการเปลี่ยนแปลงในวัตถุสไปรท์
GoldenGremlin

1
@dietestus คุณน่าจะให้propertiesฟิลด์วัตถุที่คุณแก้ไขแทนและใช้ไพ่propertiesเป็นตัวบ่งชี้ว่าคุณสมบัติใดที่จะแก้ไข (แต่ข้อมูลทั้งหมดจะถูกเก็บไว้ในสไปรต์ของคุณ) คุณยังสามารถเพียงแค่ผ่านกระเบื้องเพื่อเทพดาของคุณเพื่อให้คุณสามารถปรับเปลี่ยนกระเบื้องจากผีสาง :) ถ้ามันไม่ชัดเจนว่าผมหมายถึงฉันจะเยาะเย้ยขึ้นบาง pseudocode มากขึ้น
Charanor

3
@dietestus ทันทีที่คุณโต้ตอบกับเอนทิตีแบบถาวร (ประตู, คันโยก) คุณจะบันทึกสถานะใหม่ลงในแผนที่คีย์ - ค่า คุณไม่จำเป็นต้องวนซ้ำแผนที่เมื่อคุณบันทึกคุณมีทุกอย่างในแผนที่แล้ว
Herr Derb

1
@dietestus ใช่คุณเป็น :) มันเป็นพจนานุกรมง่ายๆที่คีย์เป็นชื่อคุณสมบัติและค่าคือ (ดี ... ค่า) การมีหลายวัตถุบนไทล์เดียวกันจะไม่เปลี่ยนแปลงอะไรเลยตราบใดที่คุณมีคีย์เฉพาะ
Charanor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.