আমি কিছুক্ষণের জন্য একটি 2 ডি আরপিজিতে কাজ করছি এবং আমি বুঝতে পেরেছি যে আমি কিছু খারাপ ডিজাইনের সিদ্ধান্ত নিয়েছি। বিশেষত কয়েকটি জিনিস যা আমার সমস্যার কারণ হতে পারে, তাই আমি ভাবছিলাম যে অন্যান্য লোকেরা এগুলি কাটিয়ে ওঠার জন্য কী ধরণের নকশা ব্যবহার করেছিল বা কীভাবে ব্যবহার করবে।
কিছুটা পটভূমির জন্য, আমি গত গ্রীষ্মে আমার ফ্রি সময়ে এটিতে কাজ শুরু করেছি। আমি প্রথম দিকে সি # তে গেমটি তৈরি করছিলাম তবে প্রায় 3 মাস আগে, সি ++ এ স্যুইচ করার সিদ্ধান্ত নিয়েছে। আমি সি ++ তে একটি ভাল হ্যান্ডেল পেতে চেয়েছিলাম যেহেতু আমি এটি প্রচুর পরিমাণে ব্যবহার করেছি, এবং এটির মতো একটি আকর্ষণীয় প্রকল্পটি ভাল অনুপ্রেরণাকারী হয়ে উঠেছে। আমি বুস্ট লাইব্রেরিটি ব্যাপকভাবে ব্যবহার করছি এবং গ্রাফিক্সের জন্য এসএফএমএল এবং অডিওর জন্য এফএমওডি ব্যবহার করে যাচ্ছি।
আমার কাছে মোটামুটি কোড লেখা আছে, তবে এটিকে স্ক্র্যাপ করে আবার শুরু করার বিষয়ে বিবেচনা করছি।
এখানে আমার উদ্বেগের প্রধান ক্ষেত্রগুলি রয়েছে এবং অন্যরা কীভাবে তাদের সমাধান করেছে বা সেগুলি সমাধান করবে সে সম্পর্কে সঠিকভাবে কিছু মতামত পেতে চাই।
১. চক্রীয় নির্ভরতা যখন আমি সি # তে গেমটি করছিলাম তখন সত্যিই আমাকে এই নিয়ে চিন্তা করতে হবে না কারণ এটি কোনও সমস্যা নয়। সি ++ এ সরানো, এটি মোটামুটি একটি বড় সমস্যা হয়ে দাঁড়িয়েছে এবং আমাকে ভাবতে বাধ্য করেছে যে আমি জিনিসগুলি ভুলভাবে ডিজাইন করেছি। আমি কীভাবে আমার ক্লাসগুলি ডিকুয়াল করতে পারি এবং এখনও যা চাই তা সেগুলি করার জন্য আমি সত্যিই কল্পনা করতে পারি না। নির্ভরতা শৃঙ্খলার কয়েকটি উদাহরণ এখানে:
আমার স্ট্যাটাস এফেক্ট ক্লাস রয়েছে। শ্রেণীর বিভিন্ন চরিত্রের বিরুদ্ধে এর প্রভাব প্রয়োগ করার জন্য অনেকগুলি পদ্ধতি রয়েছে (প্রয়োগ / আনপ্লাই, টিক ইত্যাদি)। এই ক্ষেত্রে,
virtual void TickCharacter(Character::BaseCharacter* character, Battles::BattleField *field, int ticks = 1);
এই ফাংশনগুলিকে স্থিতি প্রভাবের সাথে সংযুক্ত চরিত্রটি প্রতিবার বলা হবে। এটি রেজেন, পয়জন ইত্যাদির মতো প্রভাবগুলি প্রয়োগ করতে ব্যবহার করা হবে তবে এটি বেসচ্যারাক্টর ক্লাস এবং ব্যাটলফিল্ড শ্রেণীর উপর নির্ভরশীলতার পরিচয় দেয়। স্বাভাবিকভাবেই, বেসচ্যাকার্টর ক্লাসটি বর্তমানে তাদের উপর কী স্থিতির প্রভাবগুলি সক্রিয় তা ট্র্যাক করে রাখা দরকার যাতে এটি একটি চক্রীয় নির্ভরতা। যুদ্ধক্ষেত্রটি লড়াইয়ের দলগুলিকে নজর রাখতে হবে এবং পার্টি ক্লাসে বেসচ্যাকার্টরের একটি তালিকা রয়েছে যা অন্য একটি চক্রীয় নির্ভরতা প্রবর্তন করছে।
2 - ইভেন্টস
সি # তে আমি চরিত্রগুলি, যুদ্ধের ক্ষেত্র ইত্যাদির ঘটনাগুলিতে ঝাঁকুনির জন্য প্রতিনিধিদের ব্যাপক ব্যবহার করেছি (উদাহরণস্বরূপ, চরিত্রের স্বাস্থ্যের পরিবর্তন যখন, কোনও স্ট্যাট পরিবর্তন হয়েছিল, যখন কোনও স্ট্যাটাস এফেক্ট যুক্ত / অপসারণ করা হয়েছিল ইত্যাদি ইত্যাদির জন্য একজন প্রতিনিধি ছিলেন) ।) এবং যুদ্ধক্ষেত্র / গ্রাফিকাল উপাদানগুলি তাদের প্রভাবগুলি প্রয়োগের জন্য সেই প্রতিনিধিগুলিতে প্রবেশ করবে। সি ++ তেও আমি একই রকম কিছু করেছি। স্পষ্টতই সি # প্রতিনিধিদের সাথে সরাসরি সমতুল্য কোনও নেই, সুতরাং পরিবর্তে আমি এরকম কিছু তৈরি করেছি:
typedef boost::function<void(BaseCharacter*, int oldvalue, int newvalue)> StatChangeFunction;
এবং আমার চরিত্রের ক্লাসে
std::map<std::string, StatChangeFunction> StatChangeEventHandlers;
যখনই চরিত্রের স্ট্যাট পরিবর্তন হবে, আমি পুনরাবৃত্তি করব এবং মানচিত্রে প্রতিটি স্ট্যাটচেঞ্জফঞ্চটি কল করব। এটি কাজ করার সময়, আমি উদ্বিগ্ন এটি জিনিসগুলি করার একটি খারাপ দৃষ্টিভঙ্গি।
3 - গ্রাফিক্স
এটি বড় জিনিস। এটি আমি যে গ্রাফিক্স লাইব্রেরিটি ব্যবহার করছি তার সাথে সম্পর্কিত নয়, তবে এটি ধারণামূলক জিনিস more সি # তে, আমি আমার অনেক ক্লাসের সাথে গ্রাফিকগুলি সংযুক্ত করেছিলাম যা আমি জানি একটি ভয়ংকর ধারণা। এটি করতে চাইলে এবার ডুপ্লুড হয়ে গেলাম আমি আলাদা পদ্ধতির চেষ্টা করেছি।
আমার গ্রাফিক্স বাস্তবায়নের জন্য, আমি গেমের সাথে সম্পর্কিত সমস্ত গ্রাফিক্সকে পর্দার একটি ধারা হিসাবে কল্পনা করছিলাম। অর্থাৎ শিরোনামের পর্দা, একটি চরিত্রের স্থিতি পর্দা, একটি মানচিত্রের পর্দা, একটি ইনভেন্টরি স্ক্রিন, একটি যুদ্ধের পর্দা, যুদ্ধের জিইউআই স্ক্রিন রয়েছে এবং গেমের গ্রাফিকগুলি তৈরি করার জন্য প্রয়োজনীয়ভাবে আমি এই পর্দাগুলি একে অপরের উপরে রেখে দিতে পারি। সক্রিয় স্ক্রিন যাই হোক না কেন এটি গেম ইনপুটটির মালিক।
আমি এমন একটি স্ক্রিন ম্যানেজার ডিজাইন করেছি যা ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে পর্দা চাপ এবং পপ করবে।
উদাহরণস্বরূপ, আপনি যদি কোনও মানচিত্রের স্ক্রিনে ছিলেন (কোনও টাইল মানচিত্রের জন্য একটি ইনপুট হ্যান্ডলার / ভিজ্যুয়ালাইজার) এবং প্রারম্ভিক বোতামটি টিপেন, এটি মানচিত্রের স্ক্রিনের উপরে একটি প্রধান মেনু স্ক্রিনটি চাপতে এবং মানচিত্রটিকে চিহ্নিত করতে স্ক্রিন ম্যানেজারকে একটি কল জারি করবে পর্দা টানা / আপডেট করা যাবে না। প্লেয়ারটি মেনুর আশেপাশে নেভিগেট করত, যা স্ক্রিন স্ট্যাকের উপরে নতুন স্ক্রিনগুলি ধাক্কা দেওয়ার জন্য উপযুক্ত হিসাবে স্ক্রিন ম্যানেজারকে আরও কমান্ড জারি করবে, তারপরে ব্যবহারকারীদের পর্দা / বাতিলকরণ পরিবর্তন করার সাথে সাথে তাদের পপ করুন। অবশেষে যখন প্লেয়ারটি মূল মেনু থেকে প্রস্থান করে, আমি এটিকে পপ করব এবং মানচিত্রের স্ক্রিনে ফিরে আসব, এটিকে টানা / আপডেট করার জন্য মন্তব্য করব এবং সেখান থেকে চলে যাব।
যুদ্ধের পর্দা আরও জটিল হবে। আমার পটভূমি পটভূমি হিসাবে অভিনয় করার জন্য, যুদ্ধে প্রতিটি দলকে কল্পনা করার জন্য একটি স্ক্রিন এবং যুদ্ধের জন্য ইউআইয়ের কল্পনা করার জন্য একটি স্ক্রিন থাকবে। ইউআই চরিত্রের ইভেন্টগুলিতে ডুবে থাকে এবং কখন ইউআই উপাদানগুলি আপডেট / পুনরায় আঁকতে হয় তা নির্ধারণ করতে ব্যবহার করে। অবশেষে, প্রতিটি অ্যাটাকের একটি উপলভ্য অ্যানিমেশন স্ক্রিপ্ট পর্দার স্ট্যাকটি পপ করার আগে নিজেকে অ্যানিমেটেড করার জন্য একটি অতিরিক্ত স্তর কল করবে। এই ক্ষেত্রে, প্রতিটি স্তর ধারাবাহিকভাবে অঙ্কনযোগ্য এবং আপডেটযোগ্য হিসাবে চিহ্নিত করা হয় এবং আমি আমার যুদ্ধের গ্রাফিকগুলি পরিচালনা করে এমন পর্দার একটি স্ট্যাক পাই।
যদিও আমি এখনও স্ক্রিন ম্যানেজারকে পুরোপুরিভাবে কাজ করতে সক্ষম হতে পারি নি, আমি মনে করি আমি কিছুটা সময় পারব। এটি সম্পর্কে আমার প্রশ্নটি হ'ল এটি কি আদৌ একটি উপযুক্ত পন্থা? যদি এটি একটি খারাপ ডিজাইন হয় তবে আমি এখনই জানতে চাই যে আমার প্রয়োজনীয় সমস্ত পর্দা তৈরি করতে বেশি বেশি সময় বিনিয়োগ করা উচিত। আপনি আপনার গেমের জন্য গ্রাফিকগুলি কীভাবে তৈরি করবেন?