আপনার গেমে সংরক্ষিত গেম যোগ করা হচ্ছে

এই নির্দেশিকা আপনাকে দেখায় কিভাবে একটি C++ অ্যাপ্লিকেশনে সংরক্ষিত গেম পরিষেবা ব্যবহার করে একজন খেলোয়াড়ের গেমের অগ্রগতি ডেটা সংরক্ষণ এবং লোড করতে হয়। আপনি গেমপ্লে চলাকালীন যেকোনো সময়ে প্লেয়ার গেমের অগ্রগতি স্বয়ংক্রিয়ভাবে লোড এবং সংরক্ষণ করতে এই পরিষেবাটি ব্যবহার করতে পারেন। এই পরিষেবাটি খেলোয়াড়দেরকে একটি ব্যবহারকারীর ইন্টারফেস ট্রিগার করতে সক্ষম করতে পারে একটি বিদ্যমান সংরক্ষণ গেম আপডেট বা পুনরুদ্ধার করতে, বা একটি নতুন তৈরি করতে।

তুমি শুরু করার আগে

আপনি যদি ইতিমধ্যে এটি না করে থাকেন, তাহলে সংরক্ষিত গেমস গেমের ধারণাগুলি পর্যালোচনা করা আপনার সহায়ক বলে মনে হতে পারে৷

সংরক্ষিত গেম API ব্যবহার করে কোড করা শুরু করার আগে:

ডেটা ফরম্যাট এবং ক্রস-প্ল্যাটফর্ম সামঞ্জস্য

সংরক্ষিত গেমের ডেটা যা আপনি Google-এর সার্ভারে সংরক্ষণ করেন তা অবশ্যই std::vector<uint8_t> ফর্ম্যাটে হতে হবে। সংরক্ষিত গেমস পরিষেবা ক্রস-প্ল্যাটফর্ম সামঞ্জস্যের জন্য আপনার ডেটা এনকোডিংয়ের যত্ন নেয়; অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি কোনও ক্রস-প্ল্যাটফর্ম সামঞ্জস্যের সমস্যা ছাড়াই বাইট অ্যারে হিসাবে একই ডেটা পড়তে পারে।

আপনার সংরক্ষিত গেম ডেটার জন্য একটি ডেটা বিন্যাস নির্বাচন করার সময় প্ল্যাটফর্ম-নির্দিষ্ট বিন্যাসগুলি ব্যবহার করা এড়িয়ে চলুন। আমরা আপনাকে XML বা JSON-এর মতো ডেটা ফর্ম্যাট ব্যবহার করার জন্য দৃঢ়ভাবে উৎসাহিত করি, যাতে একাধিক প্ল্যাটফর্মে শক্তিশালী লাইব্রেরি সমর্থন রয়েছে।

সংরক্ষিত গেম পরিষেবা সক্রিয় করা হচ্ছে৷

আপনি সংরক্ষিত গেম পরিষেবা ব্যবহার করার আগে, আপনাকে প্রথমে এটিতে অ্যাক্সেস সক্ষম করতে হবে৷ এটি করার জন্য, যখন আপনি gpg::GameServices::Builder দিয়ে পরিষেবা তৈরি করবেন তখন EnableSnapshots() কল করুন। এটি পরবর্তী প্রমাণীকরণ ইভেন্টে সংরক্ষিত গেমগুলির জন্য প্রয়োজনীয় অতিরিক্ত প্রমাণীকরণের সুযোগগুলিকে সক্ষম করবে৷

সংরক্ষিত গেমগুলি প্রদর্শন করা হচ্ছে

আপনার গেমে, আপনি একটি বিকল্প সরবরাহ করতে পারেন যা খেলোয়াড়রা সংরক্ষিত গেমগুলি সংরক্ষণ বা পুনরুদ্ধার করতে ট্রিগার করতে পারে। খেলোয়াড়রা যখন এই বিকল্পটি নির্বাচন করে, তখন আপনার গেমটি এমন একটি স্ক্রীন আনতে হবে যা বিদ্যমান সেভ স্লটগুলি প্রদর্শন করে এবং খেলোয়াড়দের হয় এই স্লটগুলির একটিতে সংরক্ষণ বা লোড করার অনুমতি দেয়, অথবা একটি নতুন সংরক্ষিত গেম তৈরি করতে দেয়৷ এটি করতে নিম্নলিখিত পদ্ধতি ব্যবহার করুন:

  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 (সংরক্ষিত গেমের চূড়ান্ত সংস্করণটি করার সময় আপনি এই মানটি ব্যবহার করবেন);
  • সংরক্ষিত গেমের বিরোধপূর্ণ ভিত্তি সংস্করণ; এবং,
  • সংরক্ষিত গেমের বিরোধপূর্ণ দূরবর্তী সংস্করণ।

আপনার গেমটিকে অবশ্যই সিদ্ধান্ত নিতে হবে কোন ডেটা সংরক্ষণ করতে হবে, তারপরে Google এর সার্ভারে চূড়ান্ত সংস্করণের প্রতিশ্রুতি/সমাধান করতে SnapshotManager::ResolveConflictBlocking() পদ্ধতিতে কল করুন৷

    //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 এ সংরক্ষিত গেমটি দেখতে পাবে।