การเพิ่มเกมที่บันทึกไว้ลงในเกม

คู่มือนี้แสดงวิธีบันทึกและโหลดข้อมูลความคืบหน้าในเกมของผู้เล่นโดยใช้ บริการ "เกมที่บันทึกไว้" ในแอปพลิเคชัน C++ คุณใช้ บริการเพื่อโหลดและบันทึกความคืบหน้าของผู้เล่นในเกมที่เล่นโดยอัตโนมัติได้ทุกเมื่อ ระหว่างการเล่นเกม บริการนี้ยังช่วยให้ผู้เล่นทริกเกอร์ผู้ใช้ได้ด้วย อินเทอร์เฟซเพื่ออัปเดตหรือกู้คืนการบันทึกเกมที่มีอยู่ หรือสร้างเกมใหม่

ก่อนเริ่มต้น

ซึ่งหากคุณยังไม่ได้อ่าน อาจเป็นประโยชน์ในการตรวจสอบ แนวคิดเกมที่บันทึกไว้

ก่อนจะเริ่มเขียนโค้ดโดยใช้ saved Games API ให้ทำดังนี้

รูปแบบข้อมูลและความเข้ากันได้ข้ามแพลตฟอร์ม

ข้อมูลเกมที่บันทึกไว้ที่คุณบันทึกลงในเซิร์ฟเวอร์ของ Google จะต้องอยู่ใน std::vector<uint8_t> บริการ "เกมที่บันทึกไว้" จะดูแลการเข้ารหัส ข้อมูลเพื่อความเข้ากันได้ข้ามแพลตฟอร์ม แอปพลิเคชัน Android สามารถอ่านได้ใน ข้อมูลเดียวกันนี้เป็นไบต์อาร์เรย์โดยไม่มีปัญหาด้านความเข้ากันได้ข้ามแพลตฟอร์ม

หลีกเลี่ยงการใช้รูปแบบเฉพาะแพลตฟอร์มเมื่อเลือกรูปแบบข้อมูลสําหรับ ข้อมูลเกมที่บันทึกไว้ เราขอแนะนำอย่างยิ่งให้คุณใช้รูปแบบข้อมูล เช่น XML หรือ JSON ที่รองรับไลบรารีที่มีประสิทธิภาพบนแพลตฟอร์มต่างๆ

การเปิดใช้บริการเกมที่บันทึกไว้

ก่อนที่คุณจะสามารถใช้บริการเกมที่บันทึกไว้ คุณต้องเปิดใช้การเข้าถึง ได้ หากต้องการดำเนินการ โปรดโทรหา EnableSnapshots() เมื่อคุณสร้างบริการด้วย gpg::GameServices::Builder การดำเนินการนี้จะเปิดใช้ขอบเขตการตรวจสอบสิทธิ์เพิ่มเติม "เกมที่บันทึกไว้" ต้องใช้ในกิจกรรมการตรวจสอบสิทธิ์ครั้งถัดไป

การแสดงเกมที่บันทึกไว้

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

  SnapshotManager::ShowSelectUIOperation(...)

UI การเลือก "เกมที่บันทึกไว้" ช่วยให้ ผู้เล่นเพื่อสร้างเกมใหม่ที่บันทึกไว้ ดูรายละเอียดเกี่ยวกับเกมที่บันทึกไว้ที่มีอยู่ และโหลดเกมที่บันทึกไว้ก่อนหน้า

  SnapshotManager::SnapshotSelectUIResponse response;
  if (IsSuccess(response.status)) {
  if (response.data.Valid()) {
    LogI("Description: %s", response.data.Description().c_str());
    LogI("FileName %s", response.data.FileName().c_str());
    //Opening the snapshot data
    …
  } else {
    LogI("Creating new snapshot");
    …
  }
} else {
  LogI("ShowSelectUIOperation returns an error %d", response.status);
}

ตัวอย่างต่อไปนี้แสดงวิธีเรียก UI เริ่มต้นของ "เกมที่บันทึกไว้" ขึ้นมา และจัดการการเลือก UI ของโปรแกรมเล่น ดังนี้

  service_->Snapshots().ShowSelectUIOperation(
  ALLOW_CREATE_SNAPSHOT,
  ALLOW_DELETE_SNAPSHOT,
  MAX_SNAPSHOTS,
  SNAPSHOT_UI_TITLE,
  [this](gpg::SnapshotManager::SnapshotSelectUIResponse const & response) {
  …
      }

หากในตัวอย่างด้านบน ALLOW_CREATE_SNAPSHOT คือ true และ MAX_SNAPSHOTS มากกว่าจำนวนจริงของสแนปชอตที่ผู้ใช้มีในขณะนี้ UI ของสแนปชอตเริ่มต้นมีปุ่มให้ผู้เล่นสร้าง แทนการเลือกเกมที่มีอยู่ (เมื่อแสดงปุ่ม อยู่ที่ด้านล่างของ UI) เมื่อผู้เล่นคลิกปุ่มนี้ การตอบกลับ SnapshotSelectUIResponse ถูกต้องแต่ไม่มีข้อมูล

การเปิดและอ่านเกมที่บันทึกไว้

หากต้องการเข้าถึงเกมที่บันทึกไว้และอ่านหรือแก้ไขเนื้อหา ให้เปิดเกมนั้นก่อน ออบเจ็กต์ SnapshotMetadata ที่แสดงเกมที่บันทึกไว้ ต่อไป ให้เรียกฟังก์ชัน SnapshotManager::Read*() วิธี

ตัวอย่างต่อไปนี้แสดงวิธีเปิดเกมที่บันทึกไว้

  LogI("Opening file");
  service_->Snapshots()
  .Open(current_snapshot_.FileName(),
               gpg::SnapshotConflictPolicy::BASE_WINS,
        [this](gpg::SnapshotManager::OpenResponse const & response) {
           LogI("Reading file");
           gpg::SnapshotManager::ReadResponse responseRead =
           service_->Snapshots().ReadBlocking(response.data);
          …
        }

การตรวจหาและการแก้ไขความขัดแย้งของข้อมูล

เมื่อคุณเปิดออบเจ็กต์ SnapshotMetadata บริการเกมที่บันทึกไว้จะตรวจหา ว่ามีเกมที่บันทึกไว้ที่ขัดแย้งกันหรือไม่ ความขัดแย้งของข้อมูลอาจเกิดขึ้นเมื่อ เกมที่จัดเก็บไว้ในอุปกรณ์ภายในของผู้เล่นไม่ซิงค์กับเวอร์ชันระยะไกล ที่จัดเก็บไว้ในเซิร์ฟเวอร์ของ Google

นโยบายความขัดแย้งที่คุณระบุเมื่อเปิดเกมที่บันทึกไว้จะบอกตัวเลือก "บันทึกแล้ว" บริการเกมวิธีแก้ไขความขัดแย้งของข้อมูลโดยอัตโนมัติ โดยอาจเป็นนโยบายอย่างใดอย่างหนึ่งต่อไปนี้

นโยบายความขัดแย้ง คำอธิบาย
SnapshotConflictPolicy::MANUAL ระบุว่าบริการ "เกมที่บันทึกไว้" ไม่ควรทำงาน แก้ปัญหากัน แต่เกมของคุณจะประมวลผล การรวมที่กำหนดเอง
SnapshotConflictPolicy::LONGEST_PLAYTIME ระบุว่าบริการ "เกมที่บันทึกไว้" ควรเลือก เกมที่บันทึกไว้ที่มีค่าเวลาการเล่นสูงสุด
SnapshotConflictPolicy::BASE_WINS ระบุว่าบริการ "เกมที่บันทึกไว้" ควรเลือกพื้นฐาน เกมที่บันทึกไว้
SnapshotConflictPolicy::REMOTE_WINS ระบุว่าบริการ "เกมที่บันทึกไว้" ควรเลือกรีโมต เกมที่บันทึกไว้ เวอร์ชันระยะไกลคือเวอร์ชันที่บันทึกไว้ ที่ตรวจพบในอุปกรณ์ของผู้เล่นและมีเวอร์ชันที่เป็นปัจจุบันมากกว่า การประทับเวลามากกว่าเวอร์ชันพื้นฐาน

หากคุณระบุนโยบายความขัดแย้งที่ไม่ใช่ GPGSnapshotConflictPolicyManual บริการ "เกมที่บันทึกไว้" จะรวมเกมที่บันทึกไว้และแสดงผลเวอร์ชันที่อัปเดตแล้ว ผ่านค่า SnapshotManager::OpenResponse ที่ได้ เกมของคุณสามารถเปิดได้ เกมที่บันทึกไว้ เขียนลงไป แล้วเรียก SnapshotManager::Commit(...) ในการส่งเกมที่บันทึกไว้ไปยังเซิร์ฟเวอร์ของ Google

การดำเนินการผสานที่กำหนดเอง

หากคุณระบุ SnapshotConflictPolicy::MANUAL เป็นนโยบายความขัดแย้ง เกมของคุณต้องแก้ไขความขัดแย้งของข้อมูลที่ตรวจพบก่อนที่จะดำเนินการต่อ การดำเนินการอ่านหรือเขียนในเกมที่บันทึกไว้

ในกรณีนี้ เมื่อตรวจพบความขัดแย้งของข้อมูล บริการจะแสดงผล พารามิเตอร์ต่อไปนี้ผ่าน SnapshotManager::OpenResponse:

  • conflict_id เพื่อระบุความขัดแย้งนี้โดยไม่ซ้ำกัน (คุณจะใช้ค่านี้ เมื่อทำการยืนยันเวอร์ชันสุดท้ายของเกมที่บันทึกไว้)
  • เวอร์ชันพื้นฐานที่ขัดแย้งกันของเกมที่บันทึกไว้ และ
  • เวอร์ชันระยะไกลที่ขัดแย้งกันของเกมที่บันทึกไว้

เกมของคุณต้องเลือกว่าจะบันทึกข้อมูลอะไร จากนั้นจึงเรียกใช้ SnapshotManager::ResolveConflictBlocking() วิธีในการคอมมิต/แก้ปัญหาขั้นสุดท้าย ไปยังเซิร์ฟเวอร์ของ Google

    //Resolve conflict
    gpg::SnapshotManager::OpenResponse resolveResponse =
        manager.ResolveConflictBlocking(openResponse.conflict_base, metadata_change,
                                  openResponse.conflict_id);

การเขียนเกมที่บันทึกไว้

หากต้องการเขียนเกมที่บันทึกไว้ ก่อนอื่นให้เปิดออบเจ็กต์ SnapshotMetadata ที่แสดง เกมที่บันทึกไว้ แก้ไขความขัดแย้งของข้อมูลที่ตรวจพบ จากนั้นเรียกใช้ SnapshotManager::Commit() วิธีในการคอมมิตที่บันทึกไว้ การเปลี่ยนแปลงในเกม

ตัวอย่างต่อไปนี้แสดงวิธีที่คุณจะทำการเปลี่ยนแปลงและ เกมที่บันทึกไว้

  1. ก่อนอื่น ให้เปิดสแนปชอตที่คุณต้องการแก้ไข และตรวจสอบว่าข้อขัดแย้งทั้งหมด โดยเลือกฐาน

    service_->Snapshots().Open(
          file_name,
          gpg::SnapshotConflictPolicy::BASE_WINS,
          [this](gpg::SnapshotManager::OpenResponse const &response) {
            if (IsSuccess(response.status)) {
              // metadata : gpg::SnapshotMetadata
              metadata = response.data;
            } else {
              // Handle snapshot open error here
            }
          });
    
  2. ถัดไป ให้สร้างการเปลี่ยนแปลงเกมที่บันทึกไว้ ซึ่งรวมถึงข้อมูลรูปภาพที่ใช้สำหรับ ภาพหน้าปก:

    gpg::SnapshotMetadataChange::Builder builder;
    gpg::SnapshotMetadataChange metadata_change =
        builder.SetDescription("CollectAllTheStar savedata")
                 .SetCoverImageFromPngData(pngData).Create();
    
  3. ขั้นตอนสุดท้าย ทำการเปลี่ยนแปลงเกมที่บันทึกไว้

    gpg::SnapshotManager::CommitResponse commitResponse =
        service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
    

    พารามิเตอร์ข้อมูลจะมีข้อมูลเกมที่บันทึกไว้ทั้งหมดซึ่งคุณจัดเก็บไว้ การเปลี่ยนแปลงยังมีข้อมูลเมตาของเกมที่บันทึกไว้เพิ่มเติม เช่น เวลา และอธิบายเกมที่บันทึกไว้

หากการดำเนินการคอมมิตเสร็จสมบูรณ์ ผู้เล่นจะเห็น เกมที่บันทึกไว้ใน UI การเลือก "เกมที่บันทึกไว้"