গেমের আর্কিটেকচার / ডিজাইনের ধরণ সম্পর্কে পরামর্শ


16

আমি কিছুক্ষণের জন্য একটি 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 সি # তে, আমি আমার অনেক ক্লাসের সাথে গ্রাফিকগুলি সংযুক্ত করেছিলাম যা আমি জানি একটি ভয়ংকর ধারণা। এটি করতে চাইলে এবার ডুপ্লুড হয়ে গেলাম আমি আলাদা পদ্ধতির চেষ্টা করেছি।

আমার গ্রাফিক্স বাস্তবায়নের জন্য, আমি গেমের সাথে সম্পর্কিত সমস্ত গ্রাফিক্সকে পর্দার একটি ধারা হিসাবে কল্পনা করছিলাম। অর্থাৎ শিরোনামের পর্দা, একটি চরিত্রের স্থিতি পর্দা, একটি মানচিত্রের পর্দা, একটি ইনভেন্টরি স্ক্রিন, একটি যুদ্ধের পর্দা, যুদ্ধের জিইউআই স্ক্রিন রয়েছে এবং গেমের গ্রাফিকগুলি তৈরি করার জন্য প্রয়োজনীয়ভাবে আমি এই পর্দাগুলি একে অপরের উপরে রেখে দিতে পারি। সক্রিয় স্ক্রিন যাই হোক না কেন এটি গেম ইনপুটটির মালিক।

আমি এমন একটি স্ক্রিন ম্যানেজার ডিজাইন করেছি যা ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে পর্দা চাপ এবং পপ করবে।

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

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

যদিও আমি এখনও স্ক্রিন ম্যানেজারকে পুরোপুরিভাবে কাজ করতে সক্ষম হতে পারি নি, আমি মনে করি আমি কিছুটা সময় পারব। এটি সম্পর্কে আমার প্রশ্নটি হ'ল এটি কি আদৌ একটি উপযুক্ত পন্থা? যদি এটি একটি খারাপ ডিজাইন হয় তবে আমি এখনই জানতে চাই যে আমার প্রয়োজনীয় সমস্ত পর্দা তৈরি করতে বেশি বেশি সময় বিনিয়োগ করা উচিত। আপনি আপনার গেমের জন্য গ্রাফিকগুলি কীভাবে তৈরি করবেন?

উত্তর:


15

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

  1. এটি একটি সমস্যা হতে পারে তবে সাধারণত যে কোনও কিছুর চেয়ে বিরক্তি বেশি of আপনি কি একবার # প্রোগ্রমা ব্যবহার করছেন বা # স্বাক্ষর MY_HEADER_FILE_H # নির্ধারিত MY_HEADER_FILE_H ... # উপরের দিকে বা আপনার .h ফাইলগুলি ঘিরে যথাক্রমে? এই ভাবে .h ফাইলটি প্রতিটি ক্ষেত্রের মধ্যে একবারে উপস্থিত হয়? আপনি যদি হন তবে আমার প্রস্তাবনাটি সমস্ত # যুক্ত বিবরণী এবং সংকলন সরিয়ে, আবার গেমটি সংকলনের জন্য প্রয়োজনীয় হিসাবে যুক্ত করা হবে becomes

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

  3. এটি আমার কাছে সঠিক ট্র্যাকের জন্যও মনে হয় এবং আমি ব্যক্তিগতভাবে এবং পেশাগতভাবেই আমার নিজের ইঞ্জিনগুলির জন্য যা করি। এটি মেনু সিস্টেমকে এমন একটি রাজ্য সিস্টেমে পরিণত করে যা হয় রুট মেনুতে (গেম শুরু হওয়ার আগে) অথবা প্লেয়ার এইচইউডিটিকে 'রুট' স্ক্রিন হিসাবে প্রদর্শিত হয়, আপনি এটি কীভাবে সেট আপ করেন তার উপর নির্ভর করে।

সুতরাং সংক্ষেপে বলতে গেলে, আমি যা চালাচ্ছি তার জন্য আর কোনও কিছুই পুনরায় আরম্ভ করতে দেখছি না। আপনি রাস্তায় আরও একটি আনুষ্ঠানিক ইভেন্ট সিস্টেম প্রতিস্থাপন করতে চাইতে পারেন তবে তা সময় আসবে। সাইক্লিক অন্তর্ভুক্ত একটি প্রতিবন্ধকতা যা সমস্ত সি / সি ++ প্রোগ্রামারকে অবিচ্ছিন্নভাবে ঝাঁপিয়ে পড়তে হয় এবং গ্রাফিকগুলি ডিকুয়াল করার জন্য কাজ করা সমস্ত লজিকাল 'পরবর্তী পদক্ষেপগুলি' বলে মনে হয়।

আশাকরি এটা সাহায্য করবে!


#ifdef বিজ্ঞপ্তিতে সমস্যাগুলি অন্তর্ভুক্ত করতে সহায়তা করে না।
কমিউনিস্ট হাঁস

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

পরামর্শের জন্য ধন্যবাদ :) আমি সঠিক পথে রয়েছি তা জানতে পেরে আনন্দিত
ব্যবহারকারী 127817

4

আপনার চক্রীয় নির্ভরতা যতক্ষণ না সমস্যা সমাধান করা উচিত যতক্ষণ আপনি হেডার ফাইলগুলিতে যেখানে ক্লাসগুলি ঘোষণা করতে পারবেন এবং আসলে .cpp (বা যাই হোক না কেন) ফাইলগুলিতে তাদের অন্তর্ভুক্ত করবেন।

ইভেন্ট সিস্টেমের জন্য, দুটি পরামর্শ:

1) আপনি এখন যে প্যাটার্নটি ব্যবহার করছেন সেটি যদি রাখতে চান তবে স্ট্যান্ড :: মানচিত্রের পরিবর্তে একটি বর্ধন :: আনর্ডারড_ম্যাপে স্যুইচ করতে বিবেচনা করুন। কী হিসাবে স্ট্রিংগুলির সাথে ম্যাপিং ধীর গতিযুক্ত, বিশেষত যেহেতু। নেট দ্রুত গতি বাড়িয়ে তুলতে হুডের নীচে কিছু দুর্দান্ত কাজ করে। আনর্ডার্ড_ম্যাপ ব্যবহার করে স্ট্রিংগুলি স্ট্রিং করা হয় তাই তুলনাগুলি সাধারণত দ্রুত হয়।

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

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