একটি উপাদান-ভিত্তিক ইঞ্জিন সম্পর্কে কী ?
আপনার নামের একটি প্রধান শ্রেণি থাকবে Engine, যা একটি তালিকা GameScreensরাখবে, যা তারা নিজেরাই একটি তালিকা রাখবে Components।
ইঞ্জিনটির একটি Updateএবং একটি Drawপদ্ধতি রয়েছে এবং উভয়ই GameScreenএর পদ্ধতি Updateএবং Drawপদ্ধতিগুলিকে কল করে যা সেগুলি প্রতিটি উপাদানগুলির মাধ্যমে যায় এবং কল করে Updateএবং Draw।
এর মতো উপস্থাপিত, আমি সম্মত হই যে এটি একটি দুর্বল এবং পুনরাবৃত্তি নকশার মতো শোনাচ্ছে। তবে বিশ্বাস করুন, আমার কোডটি আমার সমস্ত পুরানো পরিচালকের ক্লাসের চেয়ে কোনও উপাদান-ভিত্তিক পদ্ধতির ব্যবহার করে আরও ক্লিনার হয়ে উঠেছে ।
এ জাতীয় কোডটি বজায় রাখাও অনেক সহজ, যেহেতু আপনি কেবল একটি বড় শ্রেণির শ্রেণিবিন্যাসের মধ্য দিয়ে যাচ্ছেন এবং BackgroundManagerসমস্ত নির্দিষ্ট ভিন্ন ব্যাকগ্রাউন্ডের জন্য অনুসন্ধান করতে পারেন না । আপনি শুধুমাত্র একটি আছে ScrollingBackground, ParallaxBackground, StaticBackground, ইত্যাদি যা সব A থেকে আহরণ করা Backgroundবর্গ।
আপনি অবশেষে একটি দুর্দান্ত শক্ত ইঞ্জিন তৈরি করবেন যা আপনি আপনার সমস্ত প্রকল্পগুলিতে প্রচুর ঘন ঘন ব্যবহৃত উপাদান এবং সাহায্যকারী পদ্ধতিগুলির সাথে পুনরায় ব্যবহার করতে পারেন (উদাহরণস্বরূপ FrameRateDisplayerএকটি ডিবাগিং ইউটিলিটি Spriteহিসাবে , বেতারগুলির জন্য একটি টেক্সচার এবং এক্সটেনশন পদ্ধতির একটি বেসিক স্প্রাইট হিসাবে একটি শ্রেণি) এবং এলোমেলো সংখ্যা জেনারেশন)।
আপনার আর কোনও BackgroundManagerক্লাস নেই, তবে এমন একটি Backgroundক্লাস যা তার পরিবর্তে নিজেকে পরিচালনা করবে।
আপনার গেমটি শুরু হয়ে গেলে, আপনাকে যা করতে হবে তা হ'ল মূলত:
// when declaring variables:
Engine engine;
// when initializing:
engine = new Engine();
engine.Initialize();
engine.LoadContent();
engine.AddGameScreen(new MainMenuScreen());
// when updating:
engine.Update();
// when drawing:
engine.Draw();
এবং এটি আপনার গেম শুরুর কোডের জন্য।
তারপরে, মূল মেনু স্ক্রিনের জন্য:
class MainMenuScreen : MenuScreen // where MenuScreen derives from the GameScreen class
{
const int ENEMY_COUNT = 10;
StaticBackground background;
Player player;
List<Enemy> enemies;
public override void Initialize()
{
background = new StaticBackground();
player = new Player();
enemies = new List<Enemy>();
base.AddComponent(background); // defined within the GameScreen class
base.AddComponent(player);
for (int i = 0; i < ENEMY_COUNT; ++i)
{
Enemy newEnemy = new Enemy();
enemies.Add(newEnemy);
base.AddComponent(newEnemy);
}
}
}
আপনি সাধারণ ধারণা পেতে।
আপনি কোনও ক্লাসের মধ্যে এমনকি নতুন পর্দা যুক্ত করতে সক্ষম হওয়ার জন্য, Engineআপনার সমস্ত GameScreenক্লাসের মধ্যে থাকা রেফারেন্সটিও রাখবেন GameScreen(উদাহরণস্বরূপ যখন ব্যবহারকারী স্টার্টগেম বোতামে ক্লিক করে আপনার মধ্যে স্থান MainMenuScreenপরিবর্তন করতে পারে GameplayScreen)।
Componentক্লাসের ক্ষেত্রেও এটি একই রকম হয় : এটিতে তার পিতামাতার রেফারেন্স রাখা উচিত GameScreen, Engineক্লাস এবং তার পিতামাতার উভয়ই GameScreenনতুন উপাদান যুক্ত করার অ্যাক্সেস থাকতে পারে (যেমন আপনি একটি এইচইউডি সম্পর্কিত ক্লাস তৈরি করতে পারেন DrawableButtonযা একটি DrawableTextউপাদান এবং একটি StaticBackgroundউপাদান রাখে ) holds
আপনি তার পরে অন্যান্য নকশার ধরণগুলিও প্রয়োগ করতে পারেন, যেমন "পরিষেবা নকশা প্যাটার্ন" (সঠিক নাম সম্পর্কে নিশ্চিত নয়) যেখানে আপনি নিজের Engineশ্রেণীর মধ্যে বিভিন্ন দরকারী পরিষেবাদি রাখতে পারবেন (আপনি কেবলমাত্র একটি তালিকা রাখবেন IServiceএবং অন্যান্য শ্রেণিগুলিকে পরিষেবাগুলি নিজেরাই যুক্ত করতে দিন )। উদাহরণস্বরূপ, Camera2Dঅন্যান্য উপাদানগুলি অঙ্কন করার সময় আমি রূপান্তরটি প্রয়োগ করার জন্য পরিষেবা হিসাবে আমার সমস্ত প্রকল্পের উপর একটি উপাদান রাখব। এটি এটিকে সর্বত্র প্যারামিটার হিসাবে পাস করা এড়িয়ে যায়।
উপসংহারে, অবশ্যই কোনও ইঞ্জিনের জন্য আরও ভাল ডিজাইন থাকতে পারে তবে আমি এই লিঙ্কটি দ্বারা প্রস্তাবিত ইঞ্জিনটি খুব মার্জিত, অত্যন্ত সহজেই রক্ষণযোগ্য এবং পুনরায় ব্যবহারযোগ্য হিসাবে দেখতে পেলাম । আমি ব্যক্তিগতভাবে কমপক্ষে এটি চেষ্টা করার পরামর্শ দেব।