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

คู่มือนี้จะแสดงวิธีบันทึกและโหลดข้อมูลความคืบหน้าในเกมของผู้เล่นโดยใช้บริการเกมที่บันทึกไว้ในแอปพลิเคชัน 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());
    

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

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