উপাদান ভিত্তিক নকশায় ইনপুট হ্যান্ডলিং


12

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

আমি যে উপাদানটি ব্যবহার করেছি তার উপর ভিত্তি করে ডিজাইন টি = মেশিনের ব্লগ সিরিজ এবং আর্টেমিসের উপর ভিত্তি করে ছিল যেখানে সত্ত্বা কেবল আইডি।

ইনপুট হ্যান্ডলিং বাস্তবায়নে আমার কাছে তিনটি প্রধান ধারণা রয়েছে:

  1. ইনপুট উপাদানটি আগ্রহী এমন ইভেন্টগুলিকে ধারণ করবে। ইনপুট সিস্টেমটি কী এবং মাউস ইভেন্টগুলিকে গেম ইভেন্টগুলিতে এবং ইনপুট উপাদানগুলির সাথে সত্ত্বার মাধ্যমে লুপে অনুবাদ করবে এবং যদি তারা ইভেন্টে আগ্রহী হয় তবে ইনপুট সিস্টেমের দ্বারা উপযুক্ত ব্যবস্থা নেওয়া হবে। এই ক্রিয়াটি ইনপুট সিস্টেমে কঠোরভাবে কোড করা হবে।
  2. কোনও ইনপুট উপাদান নেই। আপনি ইনপুট সিস্টেমে সুনির্দিষ্ট ইভেন্ট সহ সত্ত্বাকে নিবন্ধভুক্ত করবেন। ইনপুট সিস্টেমটি তখন অন্য সিস্টেমে বার্তা (সত্তা আইডি এবং ইভেন্টের ধরণ সহ) প্রেরণ করবে যাতে এগুলি যথাযথ পদক্ষেপ নিতে পারে। বা প্রথম ক্ষেত্রে হিসাবে, ক্রিয়াগুলি ইনপুট সিস্টেমে কঠোর কোড করা হবে।
  3. প্রথম পদ্ধতির মতো, তবে ইনপুট সিস্টেমে ক্রিয়াকলাপটি কোডিংয়ের পরিবর্তে উপাদানটিতে ফাংশনগুলিতে ইভেন্টগুলির মানচিত্র (যেমন std::map<std::function>) থাকে যা ইনপুট সিস্টেম বলে। এটি একই ক্রিয়াকলাপটিকে বিভিন্ন ক্রিয়ায় জুটিতে সক্ষম হওয়ার অতিরিক্ত প্রভাব ফেলেছে।

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

দ্রষ্টব্য: আমি বাস্তবায়নটি পূরণ করতে চাইবে এমন একটি অতিরিক্ত প্রয়োজনীয়তা হ'ল আমি অনেক সত্তায় একই ইনপুটটি পাস করতে সক্ষম হব যেমন উদাহরণস্বরূপ ক্যামেরা সত্তা এবং প্লেয়ারকে একই সাথে স্থানান্তরিত করা।


2
সাধারণত (যখন ক্যামেরা প্লেয়ারটিকে অনুসরণ করে) আপনি ক্যামেরাটিতে ইনপুট নিতে চান না, পরিবর্তে আপনি ক্যামেরাটি প্লেয়ারের অবস্থানটি পরীক্ষা করে এটি অনুসরণ করেন।
লুক বি।

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

1
@ লুক বি: এটি কিছুটা চিন্তা করার পরে, আমি দেখতে পাচ্ছি যে আপনি কোনও পৃথক শ্রেণি হিসাবে ক্যামেরাও তৈরি করতে পারবেন, কোনও সত্তাকে অনুসরণ করতে পয়েন্টার রেখে taking
গ্রিভারহার্ট

উত্তর:


8

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

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

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

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


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

4

আমার অভিজ্ঞতা পক্ষপাতদুষ্ট হতে পারে তবে বহু প্ল্যাটফর্ম প্রকল্পগুলিতে ইনপুট ডিভাইসগুলি সত্তা সিস্টেমে সরাসরি প্রকাশিত হয় না।

ইনপুট ডিভাইসগুলি নিম্ন স্তরের সিস্টেম দ্বারা পরিচালিত হয় যা কীগুলি, বোতামগুলি, অক্ষ, মাউস, স্পর্শ পৃষ্ঠতল, অ্যাকসিলোমিটারগুলি থেকে ইভেন্টগুলি গ্রহণ করে ...

এই ইভেন্টগুলি পরে প্রসঙ্গ নির্ভর নির্ভর জেনারেটরের একটি স্তর মাধ্যমে প্রেরণ করা হয়।

প্রতিটি জেনারেটর উপাদান, সত্তা এবং এর কাজগুলির সাথে প্রাসঙ্গিক সিস্টেমগুলি থেকে সেট পরিবর্তনের জন্য নিবন্ধভুক্ত করে।

এই জেনারেটরগুলি তখন উদ্দেশ্য সিস্টেমে রাউটিংয়ের জন্য বার্তা / উদ্দেশ্যগুলি প্রেরণ করে যেখানে সত্তাগুলির কোনও উপাদান রয়েছে বা সরাসরি সঠিক উপাদানগুলিতে।

আপনি সহজেই একই ইনপুট অর্থাৎ JUMP_INTENT (1), JUMP_INTENT (0), AIM_INTENT (1) থাকার "সর্বদা" নির্ভর করতে পারেন ...

এবং "সমস্ত" নোংরা প্ল্যাটফর্ম নির্ভর ইনপুট কাজ আপনার সত্তা সিস্টেমের বাইরে থেকে যায়।


ক্যামেরা সম্পর্কিত যদি আপনি এটিকে প্লেয়ারের চারপাশে সরিয়ে নিতে চান তবে এটি তার নিজস্ব উদ্দেশ্য উপাদানটি নিবন্ধভুক্ত করতে পারে এবং আপনি যে ইন্টেন্ট প্রেরণ করবেন তা শুনতে পাবে।

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


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

2

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

Action jump = () =>
{
    entities["player"].Transform.Velocity.Y += 5;
};

অপর একটি উদাহরণ, ওপি থেকে:

Action moveRight = () =>
{
    foreach (var entity in entities.Tagged("player", "camera"))
        entity.Transform.Position.X += 5;
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.