কোনও গেম অবজেক্টের প্রতিটি উদাহরণের জন্য DrawableGameComp घटक ব্যবহার করার কনস কী?


25

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

আমি সাধারণত এই জাতীয় জিনিসের দিকে খুব বেশি মনোযোগ দেব না, তবে এই ক্ষেত্রে আমি জানতে চাই যে আপাত সংখ্যাগরিষ্ঠরা কেন বিশ্বাস করেন যে এটি যাওয়ার উপায় নয়। হয়তো আমি কিছু মিস করছি।


আমি কৌতূহল করছি কেন, দুই বছর পরে, আপনি আমার উত্তর থেকে "স্বীকৃত" চিহ্নটি সরিয়ে দিয়েছেন ? সাধারণত আমি সত্যিই গ্রাহ্য না হবে - কিন্তু এই ক্ষেত্রে এটি VeraShackle এর কারণ infuriating আমার উত্তর এর মিথ্যা উপস্থাপনার বুদবুদের শীর্ষে :(
অ্যান্ড্রু রাসেল

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

1
": আমি আমার উত্তর এখানে ঘনীভূত করতে নিম্নরূপ ব্যবহার DrawableGameComponentপদ্ধতি স্বাক্ষর একটি একক সেট মধ্যে কেশ আপনি একটি নির্দিষ্ট অপরিবর্তিত রাখা তথ্য মডেল নিচে সাধারনতো ভুল পছন্দ প্রাথমিকভাবে, এবং লক-উল্লেখযোগ্যভাবে কোড ভবিষ্যতের বিবর্তন ব্যাহত করে।। "তবে এখানে কী হচ্ছে তা আমি আপনাকে বলি ...
অ্যান্ড্রু রাসেল

1
DrawableGameComponentমূল এক্সএনএ এপিআইয়ের অংশ (আবার: বেশিরভাগ historicalতিহাসিক কারণে)। নবীন প্রোগ্রামাররা এটি ব্যবহার করে কারণ এটি "সেখানে" রয়েছে এবং এটি "কাজ করে" এবং তারা আরও ভাল জানেন না। তারা আমার উত্তর দেখতে পেয়েছে যে তারা বলছে যে তারা " ভুল " এবং - মানব মনোবিজ্ঞানের প্রকৃতির কারণে - সেটিকে প্রত্যাখ্যান করে এবং অন্যটি "দিক" বাছাই করে। যা ভেরাকাকলের যুক্তিবাদী অ-উত্তর হতে দেখা যায়; যা গতি বাড়াতে ঘটেছে কারণ আমি তাৎক্ষণিকভাবে এটি কল করিনি (সেই মন্তব্যগুলি দেখুন)। আমি মনে করি যে সেখানে আমার শেষ প্রত্যাবর্তন যথেষ্ট পরিমাণে রয়ে গেছে।
অ্যান্ড্রু রাসেল

1
কেউ যদি upvotes ভিত্তিতে আমার উত্তর বৈধতা জিজ্ঞাসাবাদ আগ্রহী: যখন এটা সত্য যে (GDSE উপরোক্ত অনভিজ্ঞ সঙ্গে aflush হচ্ছে) VeraShackle এর উত্তর একটি অর্জন পরিচালিত হয়েছে দম্পতি সাম্প্রতিক বছরগুলোতে আমার চেয়ে upvotes আরো ভুলবেন না এক্সনএএন-তে আমার কাছে আরও হাজার হাজার নেটওয়ার্ক বিস্তৃত রয়েছে v আমি একাধিক প্ল্যাটফর্মে XNA এপিআই প্রয়োগ করেছি। এবং আমি এক্সএনএ ব্যবহার করে পেশাদার গেম ডেভেলপার। আমার উত্তরের বংশধর অনর্থক।
অ্যান্ড্রু রাসেল

উত্তর:


22

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

সুতরাং আপনি যেমন একটি ক্যামেরা বা একটি ... FPS কাউন্টার? ... বা ... এর মতো উপাদান থাকতে পারে?

দেখেন তো? দুর্ভাগ্যক্রমে এই ধারণাটি সত্যিকারের বিশ্ব গেমগুলির জন্য কার্যকরভাবে কাজ করে না। গেমের জন্য আপনি যে ধরণের উপাদানগুলি চান তা সত্যই পুনরায় ব্যবহারযোগ্য নয়। আপনার একটি "প্লেয়ার" উপাদান থাকতে পারে তবে এটি প্রতিটি অন্যান্য গেমের "প্লেয়ার" উপাদানগুলির থেকে খুব আলাদা হবে।

আমি ধারণা করি এটি এই কারণেই এবং একটি সহজ সময়ের অভাবের জন্য, জিএনআই-কে XNA 1.0 এর আগে টানা হয়েছিল।

তবে এপিআই এখনও ব্যবহারের যোগ্য ... আপনি কেন এটি ব্যবহার করবেন না তা এখানে:

মূলত এটি গেম ডেভেলপার হিসাবে লিখিত এবং পড়া এবং ডিবাগ এবং বজায় রাখার পক্ষে সবচেয়ে সহজ কোনটিতে আসে। আপনার লোডিং কোডে এরকম কিছু করা:

player.DrawOrder = 100;
enemy.DrawOrder = 200;

কেবল এটি করার চেয়ে অনেক কম স্পষ্ট:

virtual void Draw(GameTime gameTime)
{
    player.Draw();
    enemy.Draw();
}

বিশেষত যখন, একটি আসল-বিশ্ব গেমের মধ্যে, আপনি এর জাতীয় কিছু দিয়ে শেষ করতে পারেন:

GraphicsDevice.Viewport = cameraOne.Viewport;
player.Draw(cameraOne, spriteBatch);
enemy.Draw(cameraOne, spriteBatch);

GraphicsDevice.Viewport = cameraTwo.Viewport;
player.Draw(cameraTwo, spriteBatch);
enemy.Draw(cameraTwo, spriteBatch);

(স্বীকার করেছেন আপনি একই ধরণের Servicesআর্কিটেকচার ব্যবহার করে ক্যামেরা এবং স্প্রিটব্যাচ ভাগ করে নিতে পারেন But তবে এটি একই কারণে অনেক খারাপ ধারণা))

এই স্থাপত্য - বা এর অভাব - এত বেশি হালকা ওজন এবং নমনীয়!

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

এটি সাজানোর বনাম অত্যাবশ্যক প্রোগ্রামিংয়ের মধ্যে পার্থক্যের মতো। দেখা যাচ্ছে যে গেমের বিকাশের জন্য, অপরিহার্য প্রোগ্রামিং আরও বেশি পছন্দনীয়।


2
আমি কম্পোনেন্ট ভিত্তিক প্রোগ্রামিংয়ের ছাপে ছিলাম , যা স্পষ্টতই গেম প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

3
এক্সএনএ গেমের উপাদানগুলির ক্লাসগুলি সেই প্যাটার্নের জন্য সরাসরি প্রযোজ্য নয়। এই প্যাটার্নটি হ'ল একাধিক উপাদানগুলির বাইরে অবজেক্টগুলি রচনা করা। এক্সএনএ ক্লাসগুলি প্রতি-বস্তুর এক-উপাদান-এর জন্য প্রস্তুত are যদি সেগুলি আপনার ডিজাইনে পুরোপুরি ফিট করে তবে কোনওভাবে সেগুলি ব্যবহার করুন। তবে আপনার চারপাশে আপনার নকশা তৈরি করা উচিত নয় ! আরও দেখুন এখানে আমার উত্তর - আমি যেখানে উল্লেখ জন্য চক্ষু মেলিয়া DrawableGameComponent
অ্যান্ড্রু রাসেল

1
আমি সম্মত হই যে গেম কম্পোনেন্ট / পরিষেবাদি আর্কিটেকচার সমস্ত দরকারী নয় এবং অফিস-মত বা ওয়েব অ্যাপ্লিকেশন ধারণাগুলির মতো শব্দগুলি গেমের কাঠামোর জন্য বাধ্য করা হচ্ছে। তবে আমি player.DrawOrder = 100;ড্রয়ের ক্রমটির জন্য অত্যাবশ্যকীয় একটির উপরে পদ্ধতিটি ব্যবহার করতে পছন্দ করব । আমি এখনই একটি ফ্লিক্সেল গেমটি শেষ করছি, যা আপনি দৃশ্যে তাদের যুক্ত করার ক্রমে বস্তুগুলি আঁকেন। ফ্লেক্সগ্রুপ সিস্টেমটি এর কয়েকটি হ্রাস করে তবে কিছুটা জেড-ইনডেক্স বাছাই করা ভাল লাগত।
michael.bartnett

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


26

হুম। কিছুটা ভারসাম্যের জন্য এটিকে চ্যালেঞ্জ জানাতে হবে আমি ভীত।

অ্যান্ড্রুয়ের জবাবে 5 টি চার্জ বলে মনে হচ্ছে, তাই আমি চেষ্টা করব এবং ঘুরে প্রতিটির সাথে ডিল করব:

1) উপাদানগুলি একটি পুরানো এবং পরিত্যক্ত নকশা।

এক্সএনএর অনেক আগে উপাদানগুলির নকশার প্যাটার্নের ধারণাটি বিদ্যমান ছিল - মূলত ওভার-আর্চিং গেম অবজেক্টের চেয়ে তাদের নিজস্ব আপডেট এবং অঙ্কন আচরণের আবাসস্থল না করে কেবল অবজেক্ট তৈরির সিদ্ধান্ত। এর উপাদান সংগ্রহের অবজেক্টগুলির জন্য, গেমটি উপযুক্ত সময়ে স্বয়ংক্রিয়ভাবে এই পদ্ধতিগুলি (এবং আরও কয়েকজনকে) কল করবে - গুরুতরভাবে গেমের অবজেক্টটি নিজেই এই কোডটির কোনওটিই 'জানতে "হবে না। আপনি যদি নিজের গেমের ক্লাসগুলি বিভিন্ন গেমগুলিতে (এবং এইভাবে বিভিন্ন গেমের জিনিসগুলিতে) পুনরায় ব্যবহার করতে চান তবে অবজেক্টগুলির এই ডি-কাপলিংটি এখনও তহবিলিকভাবে একটি ভাল ধারণা। অ্যাপহাব থেকে এক্সএনএ ৪.০ এর সর্বশেষ (পেশাগতভাবে উত্পাদিত) ডেমোগুলির একটি তাত্ক্ষণিক দৃষ্টিভঙ্গি আমার ছাপটিকে নিশ্চিত করে যে মাইক্রোসফ্ট এখনও এর পিছনে দৃ (়ভাবে পিছনে রয়েছে (বেশ সঠিকভাবে আমার মতে)।

2) অ্যান্ড্রু 2 টির বেশি পুনরায় ব্যবহারযোগ্য গেম ক্লাসের কথা ভাবতে পারে না।

আমি পারি. আসলে আমি বোঝার কথা ভাবতে পারি! আমি স্রেফ আমার বর্তমান ভাগ করা lib পরীক্ষা করেছি এবং এতে ৮০ টিরও বেশি পুনরায় ব্যবহারযোগ্য উপাদান এবং পরিষেবাদি রয়েছে। আপনাকে স্বাদ দিতে, আপনি এটি পেতে পারেন:

  • গেম স্টেট / স্ক্রিন ম্যানেজার
  • ParticleEmitters
  • অঙ্কনযোগ্য আদিম
  • এআই নিয়ামক
  • ইনপুট নিয়ন্ত্রক
  • অ্যানিমেশন নিয়ন্ত্রণকারী
  • বিলবোর্ড
  • পদার্থবিজ্ঞান এবং সংঘর্ষের পরিচালক
  • ক্যামেরা

যে কোনও নির্দিষ্ট গেম আইডিয়াকে এই সেট থেকে কমপক্ষে 5-10 টি জিনিস প্রয়োজন হবে - গ্যারান্টিযুক্ত - এবং তারা কোডের এক লাইনের সাথে সম্পূর্ণ নতুন গেমটিতে পুরোপুরি কার্যকরী হতে পারে।

3) সুস্পষ্ট ড্র কলগুলির অর্ডার দ্বারা অঙ্কিত আদেশকে নিয়ন্ত্রণ করা উপাদানটির ড্রআর্ডার সম্পত্তি ব্যবহার করা পছন্দনীয়।

ঠিক আছে, আমি মূলত এটার সাথে অ্যান্ড্রুয়ের সাথে একমত হই। কিন্তু, আপনি যদি সমস্ত উপাদানগুলির ড্রআর্ডার বৈশিষ্ট্যগুলিকে ডিফল্ট হিসাবে ছেড়ে দেন তবে আপনি এখনও তাদের সংগ্রহের সাথে যে ক্রমটি যুক্ত করেছেন সেগুলি দিয়ে স্পষ্টভাবে তাদের অঙ্কনের ক্রমটি নিয়ন্ত্রণ করতে পারেন। এটি তাদের ম্যানুয়াল ড্র কলগুলির সুস্পষ্ট ক্রম হিসাবে 'দৃশ্যমানতা' পদে সত্যই অভিন্ন।

৪) অবজেক্টের অঙ্কন পদ্ধতিগুলির একটি লোডকে কল করা একটি বিদ্যমান ফ্রেমওয়ার্ক পদ্ধতি দ্বারা কল করার চেয়ে নিজেকে আরও 'লাইটওয়েট'।

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

5) আপনার কোডটি একটি ফাইলে স্থাপন করা পছন্দনীয়, ডিবাগ করার সময়, পৃথক বস্তুর ফাইলের চেয়ে বেশি।

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

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


2
আমি কেবল এই পোস্টটি লক্ষ্য করেছি, এবং আমাকে অবশ্যই একটি দৃ reb় প্রত্যাখ্যান জারি করতে হবে: পুনরায় ব্যবহারযোগ্য শ্রেণীর সাথে আমার কোনও সমস্যা নেই! (কোন আঁকা এবং আপডেট পদ্ধতি ইত্যাদি থাকতে পারে।) আমি নিচ্ছি নির্দিষ্ট (ব্যবহার সঙ্গে সমস্যা Drawable) GameComponentআপনার খেলা স্থাপত্য প্রদান করতে, স্পষ্ট নিয়ন্ত্রণ হ্রাস জায়গায় বসান / আপডেট অর্ডার অনমনীয়তা (যা আপনি # 3 সাথে একমত) কারণে তাদের ইন্টারফেসের (যা আপনি সম্বোধন করেন না)
অ্যান্ড্রু রাসেল

1
আপনার পয়েন্ট # 4 পারফরম্যান্স বোঝাতে আমার "লাইটওয়েট" শব্দের ব্যবহার করে, যেখানে আমি প্রকৃতপক্ষে আর্কিটেকচারাল নমনীয়তা বোঝাতে চাইছি। আপনার অবশিষ্ট পয়েন্ট # 1, # 2, এবং বিশেষত # 5 মনে হচ্ছে অবাস্তব স্ট্রো-ম্যানটি খাড়া করে যা আমি মনে করি / সমস্ত কোডটি আপনার মূল গেম শ্রেণিতে স্থান দেওয়া উচিত! আর্কিটেকচার সম্পর্কিত আমার আরও কিছু বিশদ ভাবনার জন্য এখানে আমার উত্তরটি পড়ুন
অ্যান্ড্রু রাসেল

5
পরিশেষে: আপনি যদি আমার উত্তরের প্রতিক্রিয়া পোস্ট করতে চলেছেন, আমি বলছি যে আমি ভুল, আমার উত্তরে একটি উত্তর যুক্ত করাও নম্রভাবে কাজ করা উচিত তাই আমি হোঁচট খাওয়ার পরিবর্তে এটি সম্পর্কে একটি বিজ্ঞপ্তি দেখতে পেতাম এটা দুই মাস পরে।
অ্যান্ড্রু রাসেল

আমি ভুল বুঝে থাকতে পারি, তবে এই প্রশ্নের উত্তর কীভাবে দেয়? আমার স্প্রেটিসের জন্য কি আমার একটি গেম কম্পোনেন্ট ব্যবহার করা উচিত?
সুপারবেস্ট


4

আমি অ্যান্ড্রুয়ের সাথে কিছুটা দ্বিমত পোষণ করি, তবে আমি আরও মনে করি যে সমস্ত কিছুর জন্য একটি সময় এবং জায়গা আছে। আমি Drawable(GameComponent)স্প্রাইট বা শত্রু হিসাবে সহজ কিছু জন্য ব্যবহার করতে হবে না । তবে আমি এটি একটি SpriteManagerবা এর জন্য ব্যবহার করব EnemyManager

অ্যান্ড্রু ড্র এবং আপডেট অর্ডার সম্পর্কে যা বলেছিল সে সম্পর্কে ফিরে গিয়ে আমি মনে করি Sprite.DrawOrderঅনেক স্প্রিটের জন্য খুব বিভ্রান্তিকর হবে। তাছাড়া, তার অপেক্ষাকৃত সহজ একটি সেট আপ করার জন্য DrawOrderএবং UpdateOrderপরিচালকের আছে এর জন্য একটি ছোট (অথবা যুক্তিসংগত) পরিমাণ (Drawable)GameComponents

আমি মনে করি যে মাইক্রোসফ্ট যদি তাদের সত্যিকারের যেখানে কঠোর হয় এবং কেউ তাদের ব্যবহার না করে তবে তাদের সাথে শেষ করে দিত। তবে ভূমিকাটি সঠিক হলে তারা পুরোপুরি সূক্ষ্মভাবে কাজ করার কারণ তাদের নেই। আমি নিজে সেগুলি বিকাশের জন্য ব্যবহার করি Game.Servicesযা ব্যাকগ্রাউন্ডে আপডেট হয়।


2

আমি এটি সম্পর্কেও ভাবছিলাম, এবং এটি আমার কাছে ঘটেছিল: উদাহরণস্বরূপ, আপনার লিঙ্কে উদাহরণটি চুরি করতে, আরটিএস গেমটিতে আপনি প্রতিটি ইউনিটকে গেমের উপাদান হিসাবে তৈরি করতে পারেন। ঠিক আছে.

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


2

মন্তব্যে, আমি আমার উত্তর পুরানো উত্তরের একটি ঘনীভূত সংস্করণ পোস্ট করেছি:

ব্যবহার DrawableGameComponentপদ্ধতি স্বাক্ষর একটি একক সেট মধ্যে কেশ আপনি একটি নির্দিষ্ট অপরিবর্তিত রাখা ডাটা মডেল। এগুলি সাধারণত প্রাথমিকভাবে ভুল পছন্দ এবং লক-ইনটি উল্লেখযোগ্যভাবে কোডের বিবর্তনে বাধা দেয়।

এখানে আমি আমার বর্তমান প্রকল্প থেকে কিছু কোড পোস্ট করে বিষয়টি কেন তা বোঝানোর চেষ্টা করব।


গেম ওয়ার্ল্ডের অবস্থা বজায় রাখার মূল জিনিসটির এমন একটি Updateপদ্ধতি রয়েছে যা দেখতে এই রকম দেখাচ্ছে:

void Update(UpdateContext updateContext, MultiInputState currentInput)

Updateনেটওয়ার্কটিতে গেমটি চলছে কিনা তার উপর নির্ভর করে এখানে অনেকগুলি এন্ট্রি-পয়েন্ট রয়েছে । উদাহরণস্বরূপ, গেমের স্টেটটি সময়ের সাথে পূর্ববর্তী বিন্দুতে ফিরিয়ে দেওয়া এবং তারপরে পুনরায় সিমুলেটেড করা সম্ভব।

অতিরিক্ত কিছু আপডেটের মতো পদ্ধতি রয়েছে যেমন:

void PlayerJoin(int playerIndex, string playerName, UpdateContext updateContext)

গেমের রাজ্যের মধ্যে আপডেট করার জন্য অভিনেতাদের একটি তালিকা রয়েছে। তবে এটি একটি সাধারণ Updateকলের চেয়ে বেশি । পদার্থবিদ্যাকে পরিচালনা করার আগে এবং পরে অতিরিক্ত পাস রয়েছে। পিছনে ছড়িয়ে থাকা / অভিনেতাদের ধ্বংস, পাশাপাশি স্তরের রূপান্তরগুলির জন্য কিছু অভিনব জিনিস রয়েছে।

গেমের রাজ্যের বাইরেও একটি ইউআই সিস্টেম রয়েছে যা স্বতন্ত্রভাবে পরিচালনা করা দরকার। তবে ইউআইতে কিছু স্ক্রিনের নেটওয়ার্ক প্রসঙ্গে চালাতে সক্ষম হওয়াও দরকার।


অঙ্কনের জন্য, গেমের প্রকৃতির কারণে, এখানে একটি কাস্টম বাছাই এবং কুলিং সিস্টেম রয়েছে যা এই পদ্ধতিগুলি থেকে ইনপুট নেয়:

virtual void RegisterToDraw(SortedDrawList sortedDrawList, Definitions definitions)
virtual void RegisterShadow(ShadowCasterList shadowCasterList, Definitions definitions)

এবং তারপরে, এটি কী আঁকতে হবে তা একবার নির্ধারণ করে, স্বয়ংক্রিয়ভাবে কল করে:

virtual void Draw(DrawContext drawContext, int tag)

tagপ্যারামিটার প্রয়োজন বোধ করা হয় কারণ কিছু অভিনেতা অন্যান্য অভিনেতা সম্মুখের ধরে রাখতে পারেন - এবং তাই প্রয়োজন উভয় উপরের এবং নীচের অনুষ্ঠিত অভিনেতা আঁকা পাবে। বাছাই ব্যবস্থা নিশ্চিত করে যে এটি সঠিক ক্রমে ঘটে।

আঁকার জন্য মেনু সিস্টেমও রয়েছে। এবং গেমের আশেপাশে, এইচইউডির চারপাশে ইউআই আঁকার জন্য একটি হায়ারার্কিকাল সিস্টেম।


এখন সেই প্রয়োজনীয়তার সাথে তুলনা করুন যা DrawableGameComponentসরবরাহ করে:

public class DrawableGameComponent
{
    public virtual void Update(GameTime gameTime);
    public virtual void Draw(GameTime gameTime);
    public int UpdateOrder { get; set; }
    public int DrawOrder { get; set; }
}

DrawableGameComponentআমি উপরে বর্ণিত সিস্টেমটি ব্যবহার করে কোনও সিস্টেম থেকে পাওয়ার কোনও যুক্তিসঙ্গত উপায় নেই । (এবং এগুলি এমনকি সামান্য জটিলতার গেমের জন্য অস্বাভাবিক প্রয়োজনীয়তা নয়)।

এছাড়াও, এটি লক্ষ করা খুব জরুরী যে প্রকল্পগুলির শুরুতে এই প্রয়োজনীয়তাগুলি কেবল স্প্রিং-আপ করেনি। এগুলি বহু মাস ধরে উন্নয়নের কাজ করেছে।


লোকেরা সাধারণত যা করে, যদি তারা DrawableGameComponentরুটটি শুরু করে, তবে তারা কি হ্যাকগুলি তৈরি করা শুরু করে:

  • পদ্ধতিগুলি যুক্ত করার পরিবর্তে তারা তাদের নিজস্ব বেস ধরণের কিছু কুরুচিপূর্ণ ডাউন কাস্টিং করে (কেন কেবল এটি সরাসরি ব্যবহার করবেন না?)।

  • বাছাই এবং আহ্বানের জন্য কোডটি প্রতিস্থাপনের পরিবর্তে Draw/ Updateফ্লাইয়ের ক্রম সংখ্যা পরিবর্তন করতে তারা কিছু খুব ধীর গতি সম্পন্ন করে।

  • এবং সর্বোপরি সবচেয়ে খারাপ: পদ্ধতিগুলিতে পরামিতিগুলি যুক্ত করার পরিবর্তে, তারা মেমরির অবস্থানগুলিতে "পরামিতি" "পাস" শুরু করে যা স্ট্যাক নয় (এর Servicesজন্য ব্যবহার জনপ্রিয়)। এটি সংশ্লেষযুক্ত, ত্রুটি-প্রবণ, ধীর, ভঙ্গুর, খুব কমই থ্রেড-নিরাপদ এবং আপনি যদি নেটওয়ার্কিং যুক্ত করেন, বাহ্যিক সরঞ্জাম তৈরি করেন এবং এই জাতীয় কিছু সমস্যা হয়ে দাঁড়ানোর সম্ভাবনা রয়েছে।

    এটি কোডটিকে পুনরায় ব্যবহার আরও শক্ত করে তোলে , কারণ এখন আপনার নির্ভরতাগুলি এপিআই বাউন্ডারে প্রকাশের পরিবর্তে "উপাদান" এর মধ্যে লুকিয়ে রয়েছে।

  • অথবা, তারা প্রায় দেখতে পাচ্ছেন যে এগুলি কতটা ক্রেজি এবং DrawableGameComponentএই সমস্যাগুলি ঘিরে কাজ করার জন্য "ম্যানেজার" এর কাজ শুরু করে। "ম্যানেজার" সীমানায় এখনও তাদের এই সমস্যাগুলি বাদে।

    অবিচ্ছিন্নভাবে এই "পরিচালকদের" কাঙ্ক্ষিত ক্রমে একাধিক পদ্ধতি কল দিয়ে প্রতিস্থাপন করা যেতে পারে। অন্য যে কোনও কিছুই অতিরিক্ত জটিল।

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


অনেক লোক এই স্থানে পৌঁছেছে এবং তাদের কাছে একটি দর্শনীয় প্রতিক্রিয়া রয়েছে বলে মনে হয় - সম্ভবত কারণ তারা ব্যবহার করে DrawableGameComponentএবং "ভুল" বলে স্বীকার করতে চায় না। সুতরাং তারা এটিকে ল্যাচ করে যে এটি "কাজ" করা কমপক্ষে সম্ভব

অবশ্যই এটা হতে পারে তৈরি "কাজ" করুন! আমরা প্রোগ্রামাররা - অস্বাভাবিক সংযমের মধ্যে জিনিসগুলি তৈরি করা কার্যত আমাদের কাজ। তবে এই সংযম প্রয়োজনীয়, দরকারী বা যৌক্তিক নয় ...


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

public class Actor
{
    public virtual void Update(GameTime gameTime);
    public virtual void Draw(GameTime gameTime);
}

List<Actor> actors = new List<Actor>();

foreach(var actor in actors)
    actor.Update(gameTime);

foreach(var actor in actors)
    actor.Draw(gameTime);

(এটা সরল অনুযায়ী বাছাই মধ্যে যোগ করার জন্য DrawOrderএবং UpdateOrder। এক সহজ উপায় দুই তালিকা, এবং ব্যবহার বজায় রাখা হয় List<T>.Sort()। এছাড়া হ্যান্ডেল তুচ্ছ হয় Load/ UnloadContent।)

এটা তোলে গুরুত্বপূর্ণ নয় কি যে কোড আসলে হয়কী গুরুত্বপূর্ণ তা হল আমি তুচ্ছভাবে এটি সংশোধন করতে পারি

যখন আমি বুঝতে পারি যে আমার আলাদা টাইমিং সিস্টেমের প্রয়োজন gameTime, বা আমার আরও বেশি পরামিতি (বা UpdateContextএটিতে প্রায় 15 টি জিনিস রয়েছে এমন একটি সামগ্রিক ) প্রয়োজন, বা অঙ্কনের জন্য আমার সম্পূর্ণ আলাদা অর্ডার অফ-অপারেশন প্রয়োজন, বা আমার কিছু অতিরিক্ত পদ্ধতি প্রয়োজন বিভিন্ন আপডেট পাসের জন্য, আমি কেবল এগিয়ে যেতে পারি এবং এটি করতে পারি

এবং আমি তা অবিলম্বে এটি করতে পারেন। আমার কোডটি বাছাইয়ের বিষয়ে DrawableGameComponentআমার ত্রুটি করার দরকার নেই । বা আরও খারাপ: এটি এমন কোনও উপায়ে হ্যাক করুন যা পরের বার যখন এমন প্রয়োজনের আশপাশে আসে তখন আরও শক্ত হয়ে যায়।


সত্যিই কেবলমাত্র একটি দৃশ্য রয়েছে যেখানে এটি ব্যবহার করা ভাল পছন্দ DrawableGameComponent: এবং এটি হ'ল যদি আপনি XNA এর জন্য আক্ষরিকভাবে ড্রাগ-ড্রাগ-ড্রপ-উপাদান-শৈলীর মিডওয়্যারের তৈরি এবং প্রকাশ করছেন ing যা এর আসল উদ্দেশ্য ছিল। কোনটি - আমি যুক্ত করব - কেউ করছে না!

(একইভাবে, কাস্টম সামগ্রীর ধরণের তৈরি করার সময় এটি ব্যবহার করার জন্য কেবল সত্যটি উপলব্ধি করেServicesContentManager ))


আমি আপনার পয়েন্টগুলির সাথে একমত হওয়ার পরেও DrawableGameComponentবিশেষত মেনু স্ক্রিনের (মেনু, প্রচুর বোতাম, বিকল্প এবং স্টাফ) স্টাফ বা এফপিএস / ডিবাগ ওভারলেসের মতো জিনিসগুলির জন্য উত্তরাধিকার সূত্রে প্রাপ্ত সামগ্রীগুলি ব্যবহার করার ক্ষেত্রে আমি বিশেষত কোনও ভুল দেখতে পাচ্ছি না তুমি উল্লেখ করেছিলে. এই ক্ষেত্রে আপনার সাধারণত আঁকার ক্রমের উপর সূক্ষ্ম দানাদার নিয়ন্ত্রণের প্রয়োজন হয় না এবং আপনাকে নিজে হাতে কম লেখার প্রয়োজন হয় (যা একটি ভাল জিনিস, যদি না আপনি কোডটি লেখার প্রয়োজন হয়)। তবে আমি অনুমান করি যে এটি আপনি যে ড্র্যাগ-ড্রপ দৃশ্যের কথা বলছিলেন তা অনেকটাই।
গ্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.