স্ক্রিনের মাউসের অবস্থানটিকে "মানচিত্র" দেওয়া কি কোনও খারাপ ধারণা যাতে সংঘাত নির্বিশেষে সংঘর্ষ সনাক্তকরণ কাজ করে?


16

এমন একটি গেম বিবেচনা করুন যিনি এর ডিফল্ট রেজোলিউশন 800x600। সংঘর্ষের মুখোশযুক্ত অবজেক্টগুলি 800x600 আকারের গেমের জগতে স্থাপন করা হয়েছে। সংঘর্ষের মুখোশগুলি মাউসগুলির সাথে সংঘর্ষের সময় সনাক্ত করতে পারে।

এখন বিবেচনা করুন আমরা 1024x768 পর্যন্ত গেমটি স্কেল করব (ধরে নিই আমরা কেবল সমস্ত কিছু স্তরকে রেন্ডার করে এবং তারপরে পুরো স্তরটিকে একবারে স্কেল করে গ্রাফিকগুলি স্কেল করি)। এই নতুন রেজোলিউশনে মাউসের সাথে সঠিকভাবে কাজ করার জন্য আমাদের দুটি বিকল্প রয়েছে:

উ।) বিশ্বকে 1024x768 এ আকার দিন এবং সেই অনুযায়ী প্রতিটি বস্তুর সংঘর্ষের মুখোশটি স্কেল করুন।

খ) মূল মানচিত্রে (800x600) মাউসের অবস্থান "মানচিত্র" করুন।

"মানচিত্র" দ্বারা আমার অর্থ আসল 800x600 বিশ্বে মাউসের অবস্থানটি স্কেল করা। সুতরাং উদাহরণস্বরূপ, যদি উপর মাউস অবস্থান পর্দা আছে (1024, 768), তারপর মাউস অবস্থান বিশ্বের (800, 600) হয়।

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

আমার কোন পদ্ধতিটি অনুসরণ করা উচিত: এ, বি, বা অন্য কিছু?


2
ক্লাসিক থান্ডার দ্বারা নির্দেশিত হিসাবে, প্রদর্শন স্থানাঙ্কগুলি বিশ্বের স্থানাঙ্ক বা বস্তু স্থানাঙ্কের মতো হওয়া উচিত নয়। সাধারণত আপনি রূপান্তর করতে চান (মূলত, আপনি ম্যাপিংস হিসাবে বলেন , তবে সাধারণত ম্যাট্রিক্স গণিত দ্বারা সম্পন্ন)।
ড্যান

উত্তর:


38

সাধারণত (এমনকি 2 ডি গেমের জন্যও) গেমটির জন্য একটি পৃথক সমন্বয় ব্যবস্থা রয়েছে যা রেজোলিউশনের থেকে পৃথক, এটিকে সাধারণত বিশ্ব স্থান হিসাবে উল্লেখ করা হয়। এটি আপনাকে একটি স্বেচ্ছাসেবী রেজোলিউশনে স্কেল করতে দেয়।

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

এক্সএনএ 2 ডি ক্যামেরা স্ক্রোলিংয়ের নীচের বিভাগটি একবার দেখুন - ম্যাট্রিক্স ট্রান্সফর্ম কেন ব্যবহার করবেন?

সমন্বিত সিস্টেম সংজ্ঞাগুলির মধ্যে রূপান্তর করা এটি সত্যই সহজ করে তোলে

পর্দা থেকে বিশ্বের মহাকাশে যেতে কেবল ভেক্টর 2. ট্রান্সফর্ম ব্যবহার করুন। এটি সাধারণত পৃথিবীতে মাউসের অবস্থান বাছাইয়ের জন্য ব্যবহৃত হয়।

Vector2.Transform(mouseLocation, Matrix.Invert(Camera.TransformMatrix));

বিশ্ব থেকে স্ক্রিন স্পেসে যাওয়ার জন্য কেবল বিপরীতে করুন।

Vector2.Transform(mouseLocation, Camera.TransformMatrix);

সামান্য পড়াশুনার দরকার পরে ম্যাট্রিক্স ব্যবহারে অন্য কোনও অসুবিধা নেই।


... এবং প্রকৃতপক্ষে, সাধারণভাবে বলা যায়, আধুনিক হার্ডওয়্যার মেট্রিক্স অপারেশনের জন্য এসএসই, নিওন ইত্যাদির মতো ভেক্টরাইজেশন আর্কিটেকচারের জন্য ডিজাইন করা হয়েছে। সুতরাং এটি স্মার্ট পছন্দ - আপনি সিপিইউ চক্রকে নন-ভেক্টরাইজড পদ্ধতির উপর সাশ্রয় করবেন।
প্রকৌশলী

1
হালকা অস্বীকৃতি: মাইক্রোসফ্ট দ্বারা এক্সএনএ বন্ধ করে দেওয়া হয়েছিল, তবে মনোোগেম একই এপিআই ব্যবহার করে।
ফারাপ

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

"পর্দার মাউসের অবস্থানটিকে" মানচিত্র "দেওয়া কি খারাপ ধারণা তা যাতে সংঘাত নির্বিশেষে সংঘর্ষ সনাক্তকরণ কাজ করে?" "দুটি সমন্বিত সিস্টেমের মধ্যে অনুবাদ করার জন্য ম্যাট্রিক ব্যবহার করা স্মার্ট" এর দ্বারা জবাব দেওয়া হয়েছে ...
ক্লাসিক থান্ডার

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

2

অন্য বিকল্পটি হ'ল: প্রতিটি ইনপুট মাউস চলন ইভেন্টে, গেমের মাউস কার্সারটি মাউস ইভেন্টের পিক্সেলের সংখ্যার সাথে গেম পিক্সেলের সংখ্যার সাহায্যে সরান। এটি স্বাভাবিকভাবেই 3 ডি গেমগুলির জন্য আসে যা আসল মাউস পয়েন্টারটিকে কেন্দ্রে লক করে এবং ইনপুট মাউস চলাচলের সাথে সামঞ্জস্য রেখে লক্ষ্য দিকটি ঘোরায়, তবে আপনি ইন-গেমের মাউস কার্সারের প্রতিনিধিত্বকারী স্প্রিটকে সরিয়ে একইভাবে করতে পারেন।

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

আংশিকভাবে, আপনি কোন সমাধানটি ব্যবহার করেন তার উপর নির্ভর করে গেমপ্লেতে মাউসের অবস্থানটি কতটা গুরুত্বপূর্ণ। যদি এটি আরটিএস হয় এবং প্লেয়ারটি কেবল ইউনিটগুলি নির্বাচন করতে ক্লিক করে থাকে তবে আপনি সম্ভবত আপনার যে কোনও A বা B সহজতর সাথে যেতে পারেন। যদি এটি একটি শীর্ষ-ডাউন শ্যুটার হয় এবং মাউস সরাসরি চরিত্রের গতিবিধি নিয়ন্ত্রণ করে তবে আপনি সম্ভবত আরও গভীরতর সমাধান চাইবেন যা কেবলমাত্র রেজোলিউশনের ভিত্তিতে নয়, মাউস আন্দোলনের মতো বিষয়গুলির উপর নির্ভর করে অক্ষরটি কীভাবে চলতে পারে তার পরিবর্তনশীলতার পরিমাণকে সীমাবদ্ধ করে দেয় probably গতি. যদি মাউস পরিবর্তে লক্ষ্য নির্দেশক নিয়ন্ত্রণ করে, তবে আপনি অন্যরকম সমাধান চাইবেন ইত্যাদি want


0

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

বলেন ম্যাপিং সম্পাদন করতে, আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন (এটি স্থির শ্রেণিতে সংজ্ঞায়িত করা অনুমান Helper):

static float Map(float value, float fromLow, float fromHigh, float toLow, float toHigh)
{
    return ((value - fromLow) / (fromHigh - fromLow) * (toHigh - toLow)) + toLow;
}

(আপনি কোনও ভাষা নির্দিষ্ট করেন নি, তবে আমি দেখতে পাচ্ছি যে আপনার কাছে সি # এর কিছু জ্ঞান রয়েছে, তাই আমার উদাহরণটি সি # তে রয়েছে))

তারপরে আপনি এই ফাংশনটি এর মতো ব্যবহার করতে পারেন:

float mouseXInWorld = Helper.Map(Mouse.X, 0, Screen.Width - 1, camera.Bounds.X, camera.Bounds.X + camera.Bounds.Width - 1);
float mouseYInWorld = Helper.Map(Mouse.Y, 0, Screen.Height - 1, camera.Bounds.Y, camera.Bounds.Y + camera.Bounds.Height - 1);

camera.Boundsপৃথিবীর ক্ষেত্রের প্রতিনিধিত্ব করে এমন একটি আয়তক্ষেত্র যেখানে ক্যামেরা দেখতে পাবে (অর্থাত্ অঞ্চলটি স্ক্রিনে প্রজেক্ট করা হচ্ছে)।

আপনার যদি কোনও Vectorবা Pointশ্রেণি থাকে তবে আপনি মানচিত্রের কার্যের 2D সমতুল্য তৈরি করে এই প্রক্রিয়াটিকে আরও সহজ করতে পারবেন:

static Vector Map(Vector value, Rectangle fromArea, Rectangle toArea)
{
    Vector result = new Vector();
    result.X = Map(value.X, fromArea.X, fromArea.X + fromArea.Width - 1, toArea.X, toArea.X + toArea.Width - 1);
    result.Y = Map(value.Y, fromArea.Y, fromArea.Y + fromArea.Height - 1, toArea.Y, toArea.Y + toArea.Height - 1);
    return result;
}

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

Vector mousePosInWorld = Map(Mouse.Pos, Screen.Bounds, camera.Bounds);

-1

বিকল্প (সি): 800x600 এ স্ক্রিনের রেজোলিউশনটি পরিবর্তন করুন।

এমনকি যদি আপনি এটি না করেন তবে এটি চিন্তার পরীক্ষা হিসাবে বিবেচনা করুন। সেক্ষেত্রে গ্রাফিক্সকে তার শারীরিক আকারের সাথে মাপ দেওয়ার জন্য আকারটি পরিবর্তন করা এবং তারপরে একটি 800x600 রেজোলিউশনে আপনাকে পয়েন্টার ইভেন্ট দেওয়ার অপারেটিং সিস্টেমের দায়িত্ব।

আমি মনে করি এটি আপনার গ্রাফিক্স বিটম্যাপ বা ভেক্টর কিনা তার উপর নির্ভর করে। যদি সেগুলি বিটম্যাপ হয় এবং আপনি 800x600 বাফারকে উপস্থাপন করছেন তবে হ্যাঁ স্ক্রিন স্পেসে মাউসটিকে পুনরায় তৈরি করা এবং আসল পর্দার রেজোলিউশন উপেক্ষা করা অনেক সহজ। তবে এর বড় ক্ষতিটি হ'ল আপসেলিংটি কুশ্রী দেখাতে পারে, বিশেষত যদি আপনি "8-বিট" স্টাইলের গ্রাফিকগুলি অবরুদ্ধ করেন।

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