অবজেক্টিভ-সি-তে লেখা একটি আইফোন গেমের জন্য আপনি কীভাবে আপনার গেমের অবস্থাটি সঞ্চয় করবেন?
অবজেক্টিভ-সি-তে লেখা একটি আইফোন গেমের জন্য আপনি কীভাবে আপনার গেমের অবস্থাটি সঞ্চয় করবেন?
উত্তর:
আমি আমার গেমগুলিতে যে পদ্ধতিটি ব্যবহার করেছি তা এখানে।
প্রথমত, প্রতিটি বস্তু যা স্থির রাখতে হবে তাদের অবশ্যই এনএসকোডিং প্রোটোকলটি প্রয়োগ করতে হবে। আপনি কেবলমাত্র আপনার মডেল ডেটা এবং বর্তমান প্রক্রিয়ার সাথে সুনির্দিষ্ট কিছু সঞ্চয় করতে চান। এর অর্থ হল যে আপনি পয়েন্টার বা কোনও সংস্থান আইডি চালিয়ে যেতে পারবেন না যা ওএস আপনাকে রানটাইম সময় দেয়। পয়েন্টারগুলির জন্য আপনি কেবল পয়েন্টারগুলির পরিবর্তে তারা যে বস্তুগুলিকে নির্দেশ করেছেন সেগুলি এনকোড করে তা নিশ্চিত করেই আপনি সহজেই এটি ঠিক করতে পারেন। অন্যান্য সংস্থানগুলির জন্য, রানটাইমের সময় আপনার নতুন সামগ্রীতে আপনার অবজেক্টটি হুক করার একটি উপায় প্রয়োজন।
দ্বিতীয়ত, নিশ্চিত হয়ে নিন যে আপনার সমস্ত গেমের অবজেক্টগুলিকে একটি একক মূল অবজেক্টের মাধ্যমে অ্যাক্সেস করা যেতে পারে। উদাহরণস্বরূপ, এই অবজেক্টটি পুরো গেমের রাজ্যের জন্য মাস্টার অবজেক্ট হতে পারে। আর একটি সম্ভাবনা হ'ল আপনি এগুলিকে ফাউন্ডেশন সংগ্রহের ক্লাসগুলির একটিতে (এনএস মিউটেবলআরে, এনএস মিউটেবলসেট, এনএস মিউটেবলড অভিধান) সংরক্ষণ করতে পারেন।
যখন আপনি বিজ্ঞপ্তি পেয়েছেন যে আপনার অ্যাপ্লিকেশনটি পটভূমিতে চলে যাচ্ছে (অ্যাপ্লিকেশনডিন্টারব্যাকগ্রাউন্ড), আপনাকে একটি ফাইলের মধ্যে পুরো রাষ্ট্রটি সংরক্ষণ করতে এনএসকিডআরচিভার ব্যবহার করতে হবে। এই ফাইলটি আপনার আবেদনের জন্য দস্তাবেজ ডিরেক্টরিতে থাকা উচিত। কীভাবে তা সম্পন্ন হয় তা দেখানোর জন্য এখানে কোডের একটি বিট দেওয়া হল:
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
আশা করি এটি আইফোনটিতে গেম সেভিং বাস্তবায়নের চেষ্টা করছে এমন অন্য কাউকে সাহায্য করবে।
কীভাবে গেমের স্টেট সংরক্ষণ করবেন তা একটি জটিল প্রশ্ন যা আপনি নিজের গেমটি কীভাবে সেট আপ করেন তার উপর নির্ভর করে।
বিশেষভাবে iPhone এ, আপনি শুধু মধ্যে হুক করতে হবে -(void)applicationWillTerminate:
আপনার UIApplicationDelegate
ধরতে যখন আবেদন থেকে প্রস্থান করা হবে, ব্যবহারকারী কর্ম থেকে অথবা অন্যথায়। যদিও ওএস আপনার প্রক্রিয়াটি মেরে ফেলবে তার আগে আপনার কাজ করার জন্য অল্প পরিমাণ সময় রয়েছে।
এটি আপনার খেলার কোড কীভাবে করা হয়েছিল তার উপর নির্ভর করে। আপনি কি কয়েকটি আইভর বা আরও উল্লেখযোগ্য কিছু ট্র্যাক করছেন?
যদি এটি মাত্র কয়েকটি আইভর হয় তবে আমি সম্ভবত সেগুলি পটভূমির একটি লেখকের কাছে লিখতাম এবং এটি শুরু করার পরে লোড করতাম।
যদি আরও আইভর থাকে তবে আপনি সম্ভবত কোরিডাটা (এবং / অথবা তাদের মানগুলি নিকটে উইন্ডোতে সবকিছু ফিট করার চেষ্টা করার পরিবর্তে পরিবর্তিত হওয়ার সাথে সাথে) সংরক্ষণ করা ভাল better
ব্যবহারকারী যখন প্রস্থান না করে কোনও সেভ-গেমটি বন্ধ করে দেয় আপনি ঠিক সেভাবেই এটি সংরক্ষণ করুন।
এই প্রশ্নটি কীভাবে গেমের অবস্থা সংরক্ষণ করবেন? বা অ্যাপ-প্রস্থান করার সময় কীভাবে কিছু করবেন?
পরেরটির জন্য, উত্তরটি হ'ল: অ্যাপলইল-টারমিনেট (বা অ্যাপলইলআরসাইনএ্যাকটিভ।) আইওএস 4 বা তার পরে, যদি আপনার সেভ-গেমটি কিছুটা সময় নেয় তবে আপনি অতিরিক্ত সময় (গুগল "আইওএস -4 অনুরোধ অতিরিক্ত সময়") অনুরোধ করতে পারেন।
আপনি যদি কীভাবে গেম-স্টেটটি কীভাবে সংরক্ষণ করবেন তা জিজ্ঞাসা করছেন, আমি চালিয়ে যাওয়া গেম-ইঞ্জিন দ্বারা সহজেই পুনরায় পঠিত মানগুলি সঞ্চয় করতে আমি এনএসডেটরিয়ানের একটি বড় অনুরাগী।
NSMutableDictionary *saveDict = [NSMutableDictionary dictionary];
[saveDict setValue: [NSNumber numberWithInt: currentScore] forKey: @"currentScore"];
// etc...
[saveDict writeToFile: saveFilePath atomically: YES];
যদি আপনি চান, আপনি গেমটি যাচাই করতে একটি "স্বাক্ষর" ( অর্থাত্ এমডি 5 বা অনুরূপ) যুক্ত করতে পারেন তা নিশ্চিত করে চালিয়ে যাওয়ার চেষ্টা করার জন্য যে কেউ ফাইলটির সাথে উপদ্রব না করেছে।
আমি বলব না। অ্যাপটি প্রস্থান করার সময় নয়, যখন এটি গেমটির জন্য অর্থবোধ করে তখন এটি সংরক্ষণ করুন। উদাহরণস্বরূপ, যদি এটি একটি টার্ন ভিত্তিক গেম হয় তবে প্রতিটি টার্নের শেষে সংরক্ষণ করুন। যদি এটি স্তর ভিত্তিক খেলা হয় তবে প্রতিটি স্তরের শেষে সংরক্ষণ করুন। এর বেশ কয়েকটি কারণ রয়েছে:
কিছু উদাহরণ "মানচিত্র" এবং "প্লেয়ার" শ্রেণীর জন্য এনএসকোডিং প্রোটোকল কীভাবে প্রয়োগ করা যায় তার একটি উদাহরণ এখানে:
http://deadpanic.com/howtosave
তারপরে আপনি ডেনিসের এনএসকিড আর্কিভার পদ্ধতিটি ব্যবহার করে অবজেক্টগুলি সংরক্ষণ করতে পারেন।