คู่มือนี้จะแสดงวิธีบันทึกและโหลดข้อมูลความคืบหน้าของเกมของผู้เล่นโดยใช้บริการเกมที่บันทึกไว้ในแอปพลิเคชัน C++ คุณสามารถใช้บริการนี้เพื่อโหลดและบันทึกความคืบหน้าของเกมของผู้เล่นโดยอัตโนมัติได้ระหว่างการเล่นเกม บริการนี้ยังทําให้ผู้เล่นทริกเกอร์อินเทอร์เฟซผู้ใช้เพื่ออัปเดตหรือกู้คืนเกมบันทึกที่มีอยู่ หรือสร้างใหม่ก็ได้
ข้อควรทราบก่อนที่จะเริ่มต้น
เราขอแนะนําให้อ่านแนวคิดเกมของเกมที่บันทึกไว้หากยังไม่ได้อ่าน
ก่อนที่จะเริ่มเขียนโค้ดโดยใช้ API เกมที่บันทึกไว้
- ติดตั้ง C++ Play Games SDK
- ตั้งค่าสภาพแวดล้อมการพัฒนา 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 การเลือกเกมที่บันทึกไว้