এক্সবক্স নিয়ন্ত্রকের বিমূর্ত করার সঠিক উপায়


12

আমি একটি XBox360 নিয়ামক পেয়েছি যা আমি একটি অ্যাপ্লিকেশনটির জন্য ইনপুট হিসাবে ব্যবহার করতে চাই।

আমি যা কাজ করতে পারি না তা হ'ল ইন্টারফেসের মাধ্যমে এটি প্রকাশের সর্বোত্তম অনুশীলনের উপায়।

পর্দার আড়ালে, নিয়ামক (গুলি) পরিচালনা করে এমন শ্রেণীটি ভোট দেওয়ার বোতামের রাজ্যের উপর নির্ভর করে।

আমি প্রথমে কিছু লিঙ্ক চেষ্টা করেছি:

Event ButtonPressed() as ButtonEnum

কোথায় ButtonEnumছিল ButtonRed, ButtonStartইত্যাদি ...

এটি সামান্য সীমাবদ্ধ যে এটি কেবল বোতাম টিপে সমর্থন করে, হোল্ডিং / প্যাটার্নগুলি সমর্থন করে না (দুবার চাপুন ইত্যাদি)

পরবর্তী ধারণাটি কেবল অ্যাপ্লিকেশনটিতে বোতামের অবস্থাটি প্রকাশ করা ছিল

Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double

এটি খুব নমনীয় তবে সত্যই এটি অ্যাপটিতে খুব বেশি কাজ করার জন্য বাধ্য করে এবং অ্যাপটি পোল করার প্রয়োজন হয় - আমি যদি সম্ভব হয় তবে ইভেন্টটি চালিত করতে চাই।

আমি একাধিক ইভেন্ট যুক্ত করার বিষয়টি বিবেচনা করেছি:

Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)

তবে এটি কিছুটা জটিল বলে মনে হচ্ছে এবং এটি "বাঁধাই বোতাম" স্ক্রিনে আসল ব্যথা।

কেউ দয়া করে আমাকে নিয়ামকগণের কাছ থেকে ইনপুটগুলি হ্যান্ডেল করার "সঠিক" পথে নির্দেশ করতে পারেন।

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

উত্তর:


21

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

এর সাথে মোকাবিলা করার সবচেয়ে কার্যকর উপায়টি হ'ল বাস্তবায়নের তিন স্তর ব্যবহার করা। নীচের স্তরটি সম্পূর্ণ প্ল্যাটফর্ম / নিয়ামক নির্দিষ্ট, এবং কত ডিজিটাল বোতাম এবং অ্যানালগ অক্ষ উপলব্ধ তা জানে available এটি এই স্তরটি যা হার্ডওয়্যার স্থিতিটি কীভাবে পোল করতে হয় তা জানে এবং এটি এই স্তরটি পূর্ববর্তী রাষ্ট্রটিকে যথেষ্ট ভালভাবে মনে করে যে এটি যখন জানে যে কোনও বোতামটি সবে চাপানো হয়েছে, অথবা এটি একাধিক টিকের জন্য নিচে ছিল কিনা, বা এটি চাপা নেই কিনা it । এটি বোবা ছাড়াও - একটি খাঁটি রাষ্ট্রীয় বর্গ যা একক প্রকারের নিয়ামককে উপস্থাপন করে। এটির আসল মান হ'ল মাঝারি স্তর থেকে নিয়ন্ত্রক রাষ্ট্রকে জিজ্ঞাসা করার মজাদার .দ্ধত্য।

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

উপরের স্তরটি গেম স্তর। এটি প্রবণতা নেয়, এবং সেগুলি কীভাবে তৈরি হয়েছিল তা যত্ন করে না। হতে পারে তারা একটি নিয়ামক, বা একটি নিয়ামকের রেকর্ডিং থেকে এসেছে বা সম্ভবত তারা এআই থেকে এসেছে। এই স্তরে, আপনি যত্ন নেই। আপনি যে বিষয়টি যত্নশীল তা হ'ল এখানে একটি নতুন জাম্প প্রবণতা রয়েছে, বা এক্সিলিট্রেট অনুপ্রেরণা অব্যাহত রয়েছে, বা ডাইভ অনুপ্রেরণের মান এই টিকের 0.35।

এই ধরণের সিস্টেমের সাহায্যে আপনি প্রতিটি নিয়ামকের জন্য নীচের স্তরটি একবার লিখুন write উপরের স্তরটি প্ল্যাটফর্ম স্বাধীন। মিডিল লেয়ারের কোডটি কেবল একবার লেখা দরকার, তবে প্রতিটি প্ল্যাটফর্ম / নিয়ামকের জন্য ডেটা (রিম্যাপিং) আবার করা দরকার।


এটি একটি খুব পরিষ্কার এবং মার্জিত পদ্ধতির মত বলে মনে হচ্ছে। ধন্যবাদ!
বেসিক

1
খুব সুন্দর. আমার থেকে অনেক বেশি ভাল: পি
জর্দান মেলোনাস

3
খুব সুন্দর বিমূর্ততা। তবে প্রয়োগ করার সময় সতর্কতা অবলম্বন করুন: প্রতিটি ব্যবহারকারীর ক্রিয়াকলাপের জন্য নতুন প্রবণতা অবজেক্টটি তৈরি এবং ধ্বংস করবেন না। পুলিং ব্যবহার করুন। আবর্জনা সংগ্রহকারী আপনাকে ধন্যবাদ জানাবে।
গ্রেগা জি

একেবারে। একযোগে আবেগ সর্বাধিক সংখ্যার আকারের একটি স্ট্যাটিক অ্যারে প্রায় সর্বদা সেরা বিকল্প; যেহেতু প্রায় সর্বদা আপনি যে কোনও সময়ে প্রতিটি আবেগকে সক্রিয় করতে চান। প্রায়শই এই অ্যারেটিতে কেবল কয়েকটি আইটেম থাকে তাই এটি পুনরাবৃত্তি করা দ্রুত।
মিঃ ক্র্যাঙ্কি

@ গ্রেগা আপনাকে উভয়কে ধন্যবাদ - আমি এটি ভেবে দেখিনি।
বেসিক

1

সত্যি বলতে, আমি বলতে চাই যে সর্বোত্তম ইন্টারফেস গেমের ব্যবহারের উপর নির্ভর করবে। তবে, সাধারণ ব্যবহারের দৃশ্যের জন্য, আমি একটি দ্বি-স্তরের আর্কিটেকচারের পরামর্শ দেব যা ইভেন্ট ভিত্তিক এবং পোলিং ভিত্তিক পদ্ধতির পৃথক করে।

নিম্ন স্তরটি "পোলিং ভিত্তিক" স্তর হিসাবে বিবেচনা করা যেতে পারে এবং একটি বোতামের বর্তমান অবস্থা প্রকাশ করে। এই ধরনের একটি ইন্টারফেস কেবল 2 কার্যকারিতা থাকতে পারে, GetAnalogState(InputIdentifier)এবং GetDigitalState(InputIdentifier)যেখানে InputIdentifierপ্রতিনিধিত্বমূলক যা বোতাম, ট্রিগারে একটি গণিত মান অথবা আপনি বিপক্ষে পরীক্ষণ বিদ্ধ। (একটি বোতামের জন্য getAnologState চালানো 1.0 বা 0.0 ফিরে আসবে, এবং এনালগ স্টিকের জন্য getDigitalState চালানো যদি প্রিসেটের প্রান্তিকের উপর দিয়ে সত্য হয় বা অন্যথায় মিথ্যা হয়)।

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

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

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