অবজেক্টিভ-সি দিয়ে আইফোনে প্রস্থান করার সময় গেমের স্টেট সংরক্ষণ করা


10

অবজেক্টিভ-সি-তে লেখা একটি আইফোন গেমের জন্য আপনি কীভাবে আপনার গেমের অবস্থাটি সঞ্চয় করবেন?

উত্তর:


7

আমি আমার গেমগুলিতে যে পদ্ধতিটি ব্যবহার করেছি তা এখানে।

প্রথমত, প্রতিটি বস্তু যা স্থির রাখতে হবে তাদের অবশ্যই এনএসকোডিং প্রোটোকলটি প্রয়োগ করতে হবে। আপনি কেবলমাত্র আপনার মডেল ডেটা এবং বর্তমান প্রক্রিয়ার সাথে সুনির্দিষ্ট কিছু সঞ্চয় করতে চান। এর অর্থ হল যে আপনি পয়েন্টার বা কোনও সংস্থান আইডি চালিয়ে যেতে পারবেন না যা ওএস আপনাকে রানটাইম সময় দেয়। পয়েন্টারগুলির জন্য আপনি কেবল পয়েন্টারগুলির পরিবর্তে তারা যে বস্তুগুলিকে নির্দেশ করেছেন সেগুলি এনকোড করে তা নিশ্চিত করেই আপনি সহজেই এটি ঠিক করতে পারেন। অন্যান্য সংস্থানগুলির জন্য, রানটাইমের সময় আপনার নতুন সামগ্রীতে আপনার অবজেক্টটি হুক করার একটি উপায় প্রয়োজন।

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

যখন আপনি বিজ্ঞপ্তি পেয়েছেন যে আপনার অ্যাপ্লিকেশনটি পটভূমিতে চলে যাচ্ছে (অ্যাপ্লিকেশনডিন্টারব্যাকগ্রাউন্ড), আপনাকে একটি ফাইলের মধ্যে পুরো রাষ্ট্রটি সংরক্ষণ করতে এনএসকিডআরচিভার ব্যবহার করতে হবে। এই ফাইলটি আপনার আবেদনের জন্য দস্তাবেজ ডিরেক্টরিতে থাকা উচিত। কীভাবে তা সম্পন্ন হয় তা দেখানোর জন্য এখানে কোডের একটি বিট দেওয়া হল:

NSArray *docDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [docDirectories objectAtIndex:0];
NSString *saveFile = [docsPath stringByAppendingPathComponent:SAVE_STATE_FILENAME];
[NSKeyedArchiver archiveRootObject:gameState toFile:saveFile;

যখন আপনি সনাক্ত করেন যে আপনি ফোরগ্রাউন্ডে ফিরে গেছেন, পরের বার আপনার অ্যাপ্লিকেশন চালু হওয়ার পরে কোনও বিভ্রান্তি রোধ করতে আপনার সংরক্ষণ ফাইলটি সরিয়ে ফেলা উচিত।

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

NSArray *docDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [docDirectories objectAtIndex:0];
NSString *saveFile = [docsPath stringByAppendingPathComponent:SAVE_STATE_FILENAME];
[gameState release];
gameState = [[NSKeyedArchiver unarchiveObjectWithFile:saveFile] retain];

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

এই মুহুর্তে, আপনি কোন ধরণের গেম তৈরি করছেন তার উপর নির্ভর করে আপনি আপনার গেমটি বিরতি অবস্থায় রাখতে চান into

আশা করি এটি আইফোনটিতে গেম সেভিং বাস্তবায়নের চেষ্টা করছে এমন অন্য কাউকে সাহায্য করবে।


2

কীভাবে গেমের স্টেট সংরক্ষণ করবেন তা একটি জটিল প্রশ্ন যা আপনি নিজের গেমটি কীভাবে সেট আপ করেন তার উপর নির্ভর করে।

বিশেষভাবে iPhone এ, আপনি শুধু মধ্যে হুক করতে হবে -(void)applicationWillTerminate:আপনার UIApplicationDelegateধরতে যখন আবেদন থেকে প্রস্থান করা হবে, ব্যবহারকারী কর্ম থেকে অথবা অন্যথায়। যদিও ওএস আপনার প্রক্রিয়াটি মেরে ফেলবে তার আগে আপনার কাজ করার জন্য অল্প পরিমাণ সময় রয়েছে।


2
অ্যাপ্লিকেশনওয়ালটার্মিনেট কেবলমাত্র এমন অ্যাপ্লিকেশনের জন্য কাজ করে যা মাল্টিটাস্কিং সমর্থন করে না বা পূর্ব-পূর্বের এসডিকে। অ্যাপ্লিকেশনডিন্টারব্যাকগ্রাউন্ড -২০-এর পরে কোড ব্যবহার করা ভাল।
ডেনিস মুন্সি

1

এটি আপনার খেলার কোড কীভাবে করা হয়েছিল তার উপর নির্ভর করে। আপনি কি কয়েকটি আইভর বা আরও উল্লেখযোগ্য কিছু ট্র্যাক করছেন?

যদি এটি মাত্র কয়েকটি আইভর হয় তবে আমি সম্ভবত সেগুলি পটভূমির একটি লেখকের কাছে লিখতাম এবং এটি শুরু করার পরে লোড করতাম।

যদি আরও আইভর থাকে তবে আপনি সম্ভবত কোরিডাটা (এবং / অথবা তাদের মানগুলি নিকটে উইন্ডোতে সবকিছু ফিট করার চেষ্টা করার পরিবর্তে পরিবর্তিত হওয়ার সাথে সাথে) সংরক্ষণ করা ভাল better


ওএস আপনাকে শট ডাউন করার সময় দিয়ে আসলে আপনি অনেক কিছু করতে পারেন। আমি আমার উত্তরটিতে সেই সময়টিতে যে পদ্ধতিটি বর্ণনা করেছি তা ব্যবহার করে আমি বেশ কয়েকটি গেম অবজেক্ট (কমপক্ষে কয়েকশ) চালিয়ে যেতে সক্ষম হয়েছি। এমনকি ধীর 1 জি আইপড স্পর্শেও। আপনি যে ধরণের গেমটি তৈরি করছেন তার উপর নির্ভর করে অ্যাপ্লিকেশনটি যখন ছাড়ছে তখন কোরেডাটা সমাধান আরও ভাল কাজ করতে পারে তবে ধীর গেম খেলতে ব্যয় করে।
ডেনিস মুনসি

1

ব্যবহারকারী যখন প্রস্থান না করে কোনও সেভ-গেমটি বন্ধ করে দেয় আপনি ঠিক সেভাবেই এটি সংরক্ষণ করুন।

এই প্রশ্নটি কীভাবে গেমের অবস্থা সংরক্ষণ করবেন? বা অ্যাপ-প্রস্থান করার সময় কীভাবে কিছু করবেন?

পরেরটির জন্য, উত্তরটি হ'ল: অ্যাপলইল-টারমিনেট (বা অ্যাপলইলআরসাইনএ্যাকটিভ।) আইওএস 4 বা তার পরে, যদি আপনার সেভ-গেমটি কিছুটা সময় নেয় তবে আপনি অতিরিক্ত সময় (গুগল "আইওএস -4 অনুরোধ অতিরিক্ত সময়") অনুরোধ করতে পারেন।

আপনি যদি কীভাবে গেম-স্টেটটি কীভাবে সংরক্ষণ করবেন তা জিজ্ঞাসা করছেন, আমি চালিয়ে যাওয়া গেম-ইঞ্জিন দ্বারা সহজেই পুনরায় পঠিত মানগুলি সঞ্চয় করতে আমি এনএসডেটরিয়ানের একটি বড় অনুরাগী।

NSMutableDictionary *saveDict = [NSMutableDictionary dictionary];
[saveDict setValue: [NSNumber numberWithInt: currentScore] forKey: @"currentScore"];
// etc...
[saveDict writeToFile: saveFilePath atomically: YES];

যদি আপনি চান, আপনি গেমটি যাচাই করতে একটি "স্বাক্ষর" ( অর্থাত্ এমডি 5 বা অনুরূপ) যুক্ত করতে পারেন তা নিশ্চিত করে চালিয়ে যাওয়ার চেষ্টা করার জন্য যে কেউ ফাইলটির সাথে উপদ্রব না করেছে।


1

আমি বলব না। অ্যাপটি প্রস্থান করার সময় নয়, যখন এটি গেমটির জন্য অর্থবোধ করে তখন এটি সংরক্ষণ করুন। উদাহরণস্বরূপ, যদি এটি একটি টার্ন ভিত্তিক গেম হয় তবে প্রতিটি টার্নের শেষে সংরক্ষণ করুন। যদি এটি স্তর ভিত্তিক খেলা হয় তবে প্রতিটি স্তরের শেষে সংরক্ষণ করুন। এর বেশ কয়েকটি কারণ রয়েছে:

  • মোবাইলের ব্যবহার অত্যন্ত অনির্দেশ্য। হ্যাঁ, অ্যাপটি বন্ধ হয়ে যাওয়ার সময় আপনি আইফোন এসডিকে দ্বারা বিজ্ঞপ্তি পেয়েছেন তবে এটি কোনও কিছুর মাঝামাঝি হতে পারে, এবং রূপান্তরটি কেবল "প্রস্থান করা" নয় এটি একটি কলও পেয়েছে, একটি পাঠ্য পেয়েছে ইত্যাদি is
  • অ্যাপ্লিকেশন থেকে প্রস্থান করার সময় আপনার গেমটি বন্ধ করতে আপনার কাছে খুব সীমিত সময় এবং সংস্থান রয়েছে। এর বেশিরভাগটি সম্ভবত আপনার গেমটি বিরতি দিয়ে এবং স্মৃতি পরিষ্কার করার মাধ্যমে গ্রাস করা হবে। গেমের অবস্থা সংরক্ষণ করে সেই লোডটিতে যুক্ত করার দরকার নেই No
  • বেশিরভাগ গেমগুলিতে প্রাকৃতিক বিরতি থাকে যা সংরক্ষণের অর্থ দেয়। নির্বিঘ্নে গেম স্টেট সংরক্ষণ করার জন্য আপনি এই বিরতিগুলির সুবিধা নিতে পারেন এবং ব্যবহারকারী কখনই লক্ষ্য করবেন না যে আপনি অতিরিক্ত সংস্থান ব্যবহার করছেন।
  • গেম প্লে চলাকালীন সময়ে ক্রমবর্ধমান সংরক্ষণ করে, সংরক্ষণের জন্য ডেটা পরিমাণ সংরক্ষণ করার সময় কম হবে।

1

কিছু উদাহরণ "মানচিত্র" এবং "প্লেয়ার" শ্রেণীর জন্য এনএসকোডিং প্রোটোকল কীভাবে প্রয়োগ করা যায় তার একটি উদাহরণ এখানে:

http://deadpanic.com/howtosave

তারপরে আপনি ডেনিসের এনএসকিড আর্কিভার পদ্ধতিটি ব্যবহার করে অবজেক্টগুলি সংরক্ষণ করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.