คู่มือนี้แสดงวิธีบันทึกและโหลดข้อมูลความคืบหน้าในเกมของผู้เล่นโดยใช้ บริการ "เกมที่บันทึกไว้" ในแอปพลิเคชัน C++ คุณใช้ บริการเพื่อโหลดและบันทึกความคืบหน้าของผู้เล่นในเกมที่เล่นโดยอัตโนมัติได้ทุกเมื่อ ระหว่างการเล่นเกม บริการนี้ยังช่วยให้ผู้เล่นทริกเกอร์ผู้ใช้ได้ด้วย อินเทอร์เฟซเพื่ออัปเดตหรือกู้คืนการบันทึกเกมที่มีอยู่ หรือสร้างเกมใหม่
ก่อนเริ่มต้น
ซึ่งหากคุณยังไม่ได้อ่าน อาจเป็นประโยชน์ในการตรวจสอบ แนวคิดเกมที่บันทึกไว้
ก่อนจะเริ่มเขียนโค้ดโดยใช้ saved Games API ให้ทำดังนี้
- ติดตั้ง Play Games SDK สำหรับ C++
- ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ C++
- ดาวน์โหลดและตรวจสอบตัวอย่างโค้ด C++
- เปิดใช้บริการ "เกมที่บันทึกไว้" ใน Google Play Console
รูปแบบข้อมูลและความเข้ากันได้ข้ามแพลตฟอร์ม
ข้อมูลเกมที่บันทึกไว้ที่คุณบันทึกลงในเซิร์ฟเวอร์ของ 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()
วิธีในการคอมมิตที่บันทึกไว้
การเปลี่ยนแปลงในเกม
ตัวอย่างต่อไปนี้แสดงวิธีที่คุณจะทำการเปลี่ยนแปลงและ เกมที่บันทึกไว้
ก่อนอื่น ให้เปิดสแนปชอตที่คุณต้องการแก้ไข และตรวจสอบว่าข้อขัดแย้งทั้งหมด โดยเลือกฐาน
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 } });
ถัดไป ให้สร้างการเปลี่ยนแปลงเกมที่บันทึกไว้ ซึ่งรวมถึงข้อมูลรูปภาพที่ใช้สำหรับ ภาพหน้าปก:
gpg::SnapshotMetadataChange::Builder builder; gpg::SnapshotMetadataChange metadata_change = builder.SetDescription("CollectAllTheStar savedata") .SetCoverImageFromPngData(pngData).Create();
ขั้นตอนสุดท้าย ทำการเปลี่ยนแปลงเกมที่บันทึกไว้
gpg::SnapshotManager::CommitResponse commitResponse = service_->Snapshots().CommitBlocking(metadata, metadata_change, SetupSnapshotData());
พารามิเตอร์ข้อมูลจะมีข้อมูลเกมที่บันทึกไว้ทั้งหมดซึ่งคุณจัดเก็บไว้ การเปลี่ยนแปลงยังมีข้อมูลเมตาของเกมที่บันทึกไว้เพิ่มเติม เช่น เวลา และอธิบายเกมที่บันทึกไว้
หากการดำเนินการคอมมิตเสร็จสมบูรณ์ ผู้เล่นจะเห็น เกมที่บันทึกไว้ใน UI การเลือก "เกมที่บันทึกไว้"