ডেটা-চালিত কোডিং
আপনার উল্লেখ করা প্রতিটি জিনিসই এমন কিছু যা ডেটাতে নির্দিষ্ট করা যায়। আপনি কেন বোঝাচ্ছেন?aspecificmap
? কারণ গেম কনফিগারেশনটি বলে যে কোনও খেলোয়াড় নতুন গেম শুরু করার সময় এটি প্রথম স্তর, বা যে কারণ প্লেয়ারের সেভ ফাইলের বর্তমান সেভ পয়েন্টের নাম এটি হ'ল তারা ইত্যাদি save
আপনি কিভাবে খুঁজেন aspecificmap
? কারণ এটি কোনও ডেটা ফাইলে রয়েছে যা মানচিত্রের আইডিস এবং তাদের অন ডিস্ক সংস্থানগুলিকে তালিকাবদ্ধ করে।
কেবলমাত্র "মূল" সংস্থানগুলির একটি বিশেষ সংখ্যক সেট থাকা দরকার যা হার্ড কোডিং এড়ানোর জন্য বৈধভাবে শক্ত বা অসম্ভব। কিছুটা কাজ করে, এটি একক হার্ড-কোডেড ডিফল্ট সম্পদ নামের মতো main.wad
বা পছন্দ মতোই সীমাবদ্ধ থাকতে পারে । এই ফাইলটি সম্ভবত রানটাইমে গেমের কাছে কমান্ড-লাইন আর্গুমেন্ট পেরিয়ে পরিবর্তন করা যেতে পারে akagame.exe -wad mymain.wad
।
ডেটা-চালিত কোড লেখার জন্য কয়েকটি অন্যান্য নীতির উপর নির্ভর করে। উদাহরণস্বরূপ, সিস্টেম বা মডিউলগুলি কোনও নির্দিষ্ট উত্সের জন্য জিজ্ঞাসা করা এবং তার পরিবর্তে depend নির্ভরতাগুলি উল্টাতে পারে can অর্থাত, এর সূচনা কোডটি DebugDrawer
লোড আপ করবেন না debug.font
; পরিবর্তে, DebugDrawer
এর সূচনা কোডটিতে একটি সংস্থান হ্যান্ডেল নিন। এই হ্যান্ডেলটি মূল গেম কনফিগারেশন ফাইল থেকে লোড হতে পারে।
আমাদের কোডবেস থেকে একটি কংক্রিট উদাহরণ হিসাবে, আমাদের কাছে একটি "গ্লোবাল ডেটা" অবজেক্ট রয়েছে যা রিসোর্স ডাটাবেস থেকে লোড করা হয় (এটি স্বয়ংক্রিয়ভাবে ডিফল্টরূপে./resources
ফোল্ডার হয় তবে কমান্ড লাইনের যুক্তি দিয়ে ওভারলোড করা যেতে পারে)। এই বৈশ্বিক তথ্যটির রিসোর্স ডেটাবেস আইডি হ'ল কোডবেসে একমাত্র প্রয়োজনীয় হার্ড-কোডেড রিসোর্সের নাম (আমাদের কাছে অন্য কারও কারও কারও মাঝে মাঝে প্রোগ্রামাররা অলস হয়ে যায়, তবে আমরা সাধারণত ফিক্সিং / শেষ পর্যন্ত শেষ করি)। এই গ্লোবাল ডেটা অবজেক্টটি এমন উপাদানগুলিতে পূর্ণ যাঁর একমাত্র উদ্দেশ্য কনফিগারেশন ডেটা সরবরাহ করা। উপাদানগুলির মধ্যে একটি হ'ল ইউআই গ্লোবাল ডেটা উপাদান যা সংস্থানীয় অন্যান্য কনফিগারেশন আইটেমগুলির মধ্যে সমস্ত মূল ইউআই সংস্থানগুলিতে (হরফ, ফ্ল্যাশ ফাইল, আইকন, স্থানীয়করণ ডেটা, ইত্যাদি) সংস্থান করে। একটি UI 'তে বিকাশকারীর কাছ থেকে প্রধান UI' তে সম্পদ নামান্তর করার সিদ্ধান্ত নেয় যখন /ui/mainmenu.swf
থেকে/ui/lobby.swf
তারা কেবল সেই বৈশ্বিক ডেটা রেফারেন্স আপডেট করে; কোনও ইঞ্জিন কোডে কোনও পরিবর্তন করার দরকার নেই।
আমরা সমস্ত কিছুর জন্য এই গ্লোবাল ডেটা ব্যবহার করি। সমস্ত খেলার যোগ্য অক্ষর, সমস্ত স্তর, ইউআই, অডিও, মূল সম্পদ, নেটওয়ার্ক কনফিগারেশন, সবকিছু everything (ভাল, সব কিছু নয় , তবে এই অন্যান্য জিনিসগুলি ঠিক করার জন্য বাগ রয়েছে))
এই পদ্ধতির অন্যান্য অনেক সুবিধা রয়েছে। একটির জন্য, এটি রিসোর্স প্যাকিং এবং পুরো প্রক্রিয়াটির জন্য বান্ডিল অবিচ্ছেদ্য করে তোলে। ইঞ্জিনের হার্ড-কোডিং পাথগুলিও বোঝায় যে সেই একই পাথগুলিকে যে কোনও স্ক্রিপ্ট বা সরঞ্জাম প্যাকেজ গেমের সম্পদগুলিতে প্যাকেজে হার্ড কোডিং করতে হবে এবং সেই পাথগুলি তখন সিঙ্ক থেকে বেরিয়ে আসতে পারে। পরিবর্তে সেখান থেকে একটি একক মূল সম্পদ এবং রেফারেন্স চেইনের উপর নির্ভর করে আমরা একক কমান্ডের মতো একটি সম্পদ বান্ডিল তৈরি করতে পারি bundle.exe -root config.data -out main.wad
এবং জানতে পারি যে এটি আমাদের প্রয়োজনীয় সমস্ত সম্পদকে অন্তর্ভুক্ত করবে। আরও, যেহেতু বান্ডলারটি কেবলমাত্র উত্স রেফারেন্স অনুসরণ করে, আমরা জানি যে এটি কেবল আমাদের প্রয়োজনীয় সম্পদগুলিকে অন্তর্ভুক্ত করবে এবং সমস্ত প্রকল্পের জীবনের উপর নির্ভরযোগ্যভাবে জমে থাকা বাম-ওভার ফ্লাফকে এড়িয়ে চলবে (প্লাস আমরা স্বয়ংক্রিয়ভাবে তার তালিকা তৈরি করতে পারি) ছাঁটাই জন্য fluff)।
এই পুরো জিনিসটির একটি জটিল কর্নার কেস স্ক্রিপ্টগুলিতে। ইঞ্জিন ডেটা চালিত করা ধারণাগতভাবে সহজ, তবে আমি অনেকগুলি প্রকল্প (এএএ শখের শখ) দেখেছি যেখানে স্ক্রিপ্টগুলিকে ডেটা হিসাবে বিবেচনা করা হয় এবং তাই কেবল নির্বিচারে রিসোর্স পাথগুলি ব্যবহার করার "অনুমতি দেওয়া" হয়। এটা করবেন না। যদি কোনও লুয়া ফাইলের কোনও সংস্থান প্রয়োজন এবং এটি ঠিক যেমন একটি ফাংশন কল করে textures.lua("/path/to/texture.png")
তবে সম্পদ পাইপলাইনটি জানার ক্ষেত্রে প্রচুর সমস্যা হতে চলেছে যে স্ক্রিপ্টটি /path/to/texture.png
সঠিকভাবে পরিচালনা করতে হবে এবং এই টেক্সচারটিকে অব্যবহৃত এবং অপ্রয়োজনীয় হিসাবে বিবেচনা করতে পারে। স্ক্রিপ্টগুলি অন্য যে কোনও কোডের মতো চিকিত্সা করা উচিত: সংস্থানসমূহের জন্য ইঞ্জিন এবং রিসোর্স পাইপলাইন পরিদর্শন করতে পারে এমন কোনও কনফিগারেশন এন্ট্রিতে সংস্থান এবং টেবিল সহ তাদের প্রয়োজনীয় ডেটা নির্দিষ্ট করা উচিত। foo.lua
পরিবর্তে "লোড স্ক্রিপ্ট " বলে এমন ডেটা বলতে হবে "foo.lua
এবং এগুলিকে এই প্যারামিটারগুলি দিন "যেখানে প্যারামিটারগুলিতে প্রয়োজনীয় কোনও সংস্থান অন্তর্ভুক্ত থাকে example উদাহরণস্বরূপ কোনও স্ক্রিপ্ট এলোমেলোভাবে শত্রুদের উদ্ভব করে, সেই কনফিগারেশন ফাইল থেকে সম্ভাব্য শত্রুদের তালিকাটি স্ক্রিপ্টে পাস করুন The ইঞ্জিন তারপরে শত্রুগুলিকে স্তর সহ প্রি-লোড করতে পারে ( যেহেতু এটা সম্ভব spawns সম্পূর্ণ তালিকা জানে) ও রিসোর্স পাইপলাইন যেহেতু তারা নিশ্চিতভাবেই কনফিগারেশন ডেটা দ্বারা সমর্থিত করছি) খেলা সঙ্গে সব শত্রুকে বান্ডেল করতে (জানে না। স্ক্রিপ্ট পথ নামের স্ট্রিং উত্পন্ন যদি শুধু একটি কল load
তারপর তন্ন তন্ন ফাংশন ইঞ্জিন বা রিসোর্স পাইপলাইন স্পষ্টভাবে কোন সম্পদ লোড করার চেষ্টা করতে পারে তা জানার কোনও উপায় রয়েছে।