কীভাবে কোনও এলাকায় ক্লিক'ন'ড্রাগ চলাচলকে সীমাবদ্ধ করবেন?


11

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

আমি বিভিন্ন ধরণের পাথ মার্কার বাস্তবায়নের চেষ্টা করছি (সম্ভবত এটির জন্য সবচেয়ে উপযুক্ত নাম আছে, তবে এটিই সেরা আমি নিয়ে আসতে পেরেছি)।

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

পাথ মার্কার ডায়াগ্রাম

সুতরাং আমি এখন দুটি সমস্যার সাথে আটকে আছি:

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

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

প্রথম চিত্র: উপরের দিকে সরানো দ্বিতীয় চিত্র: টানা অনুসরণ

আমি আশা করি এগুলি খুব বিভ্রান্তিকর ছিল না। ধন্যবাদ বন্ধুরা.

সম্পাদনা করুন: যদি এতে কোনও পার্থক্য আসে, আমি মার্মালেড এসডিকে দিয়ে সি ++ ব্যবহার করছি।


আমার মনে হয় আপনি যে শব্দটির সন্ধান করছেন তা হল "ওয়েপয়েন্ট", এবং আপনি কি গাণিতিকভাবে ধূসর অঞ্চলটি সংজ্ঞায়িত করতে পারেন? আপনার সমস্যার সমাধানটি যদি হয় তবে সম্ভবত এটি অনেক সহজ হবে।
জন ম্যাকডোনাল্ড

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

সমাধানগুলি মূলত প্ল্যাটফর্ম-নির্ভর হয়ে থাকায় আপনাকে কোন ভাষা এবং / বা টুলকিট ব্যবহার করছেন তাও নির্দিষ্ট করতে হবে।
রেসিমাজেশন

সত্যি? আমি একটি অ্যালগরিদমিক সমাধান বা এমনকি সিউডোকোড সাহায্য করবে। আমি প্রশ্নটি যেভাবেই হোক সম্পাদনা করব।
ভেক্সিল

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

উত্তর:


8

আপনি তিনটি মান সহ আপনার প্রশ্নের মতো একটি কার্যক্ষম ক্ষেত্রটি নির্ধারণ করতে পারেন:

float innerRadius;
float outerRadius;
float maxAngle;

এই মানগুলি কেন্দ্রের পয়েন্টের ভিত্তিতে তৈরি হবে যা প্লেয়ারের অবস্থান বা নাও থাকতে পারে। কার্যক্ষম ক্ষেত্রের আকৃতি নির্ভর করে আপনি কোথায় এই পয়েন্টটি রেখেছেন।

এখানে চিত্র বর্ণনা লিখুন

কেন্দ্রের অবস্থানের উপরের উদাহরণে খেলোয়াড়ের পিছনে একটি নির্দিষ্ট দূরত্ব রয়েছে (আসুন 50 ইউনিট বলি) lies এটি সহজে হিসাবে গণনা করা যেতে পারে:

float offset = -50;
Vector2 centerPosition = playerPosition + offset * playerForward;

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

Vector2 direction = markerPosition - centerPosition;
float distance = direction.Length();
direction.Normalize();
markerPosition = centerPosition + direction * clamp(distance, innerRadius, outerRadius);

পরিশেষে, চিহ্নিত ব্যাপ্তিকে নির্দিষ্ট ব্যাপ্তিতে বৈধতা দিন । আমি এটির জন্য সিউডোকোড ব্যবহার করব:

- Find angle between vector C->M and vector playerForward
- If abs(angle) <= maxAngle Then do nothing
- Else If angle > 0 Then rotate M around C by maxAngle-angle
- Else If angle < 0 Then rotate M around C by -maxAngle-angle

অন্যদিকে কীভাবে একটি বিন্দু ঘোরানো যায় তার চারপাশে দেখুন। এটি ত্রিকোনমিতি বা ট্রান্সফর্মেশন ম্যাট্রিক্স দিয়ে করা যেতে পারে।

আপনি চিহ্নিতকারীটির আকারটিও বিবেচনা করতে এবং ক্ষতিপূরণের জন্য ব্যাসার্ধ এবং কোণটিকে কিছুটা ছোট করতে চাইতে পারেন।

সম্পাদনা: দ্বিতীয় চিন্তায়, আপনি যদি প্রথমে কোণটি বৈধতা দেন তবে এটি আরও স্বাভাবিক দেখাবে, তারপরে দূরত্বটি, তাই উভয় বিকল্প চেষ্টা করে দেখুন!


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

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

10

আমি ভাবছিলাম যে আকারটি অনিয়মিত হলে কীভাবে সমস্যাটি সমাধান করা যায়, এবং কেউ এটি গাণিতিকভাবে সংজ্ঞা দিতে পারে না। সতর্কতা: এটি একটি ময়লা সমাধান, হৃদয়ের হতাশার জন্য নয়।

1. আপনার অঞ্চল নিন:

এখানে চিত্র বর্ণনা লিখুন

2. এবং এটিকে একরঙা বিটম্যাপে রূপান্তর করুন:

এখানে চিত্র বর্ণনা লিখুন এবং নাম এটি স্কেল

৩. বিটম্যাপটি ক্লোন করুন এবং এটি 50% এ স্কেল করুন:

এখানে চিত্র বর্ণনা লিখুন এবং এটি স্কেল_1 এর নাম দিন

৪. এবং এভাবে, বিটম্যাপ কম না হওয়া পর্যন্ত 4 পিক্সেল প্রশস্ত / লম্বা:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন স্কেল: 2, 3, 4, 5, 6

৫. এখন আমাদের অঞ্চলটি বিভিন্ন রেজোলিউশনের একরঙা বিটম্যাপ হিসাবে রয়েছে: এখানে চিত্র বর্ণনা লিখুন

The. সর্বশেষ চিত্রটি নিন (এখানে "স্কেল_6") এবং এর সমস্ত পিক্সেল দিয়ে পুনরাবৃত্তি করুন।

  • প্রতিটি পিক্সেলের স্থানাঙ্কগুলি স্ক্রিন স্থানাঙ্কে অনুবাদ করুন: x = Math.pow ( 2, scale_level );যেখানে স্কেল_লেভেলটি আমরা "স্কেল_" এর পরে যোগ করা নম্বর। আমরা এটিকে একটি চতুষ্কোণ গাছের স্তরও বলতে পারি, যদিও আমরা আসলে কোয়াড গাছের সাথে কাজ করছি না। Y এর সাথে একই করুন।
  • অনুবাদকৃত এক্স ও ওয়াই পিক্সেলটি কালো কিনা তা পরীক্ষা করে দেখুন। যদি তা না হয় তবে এটি আকৃতির অংশ নয় এবং continueলুপের পরবর্তী ধাপে আপনার উচিত
  • আগের চেক করা পিক্সেলের চেয়ে পিক্সেল মাউস কার্সারের কাছাকাছি রয়েছে কিনা তা পরীক্ষা করে দেখুন - হ্যাঁ, পিক্সেলের স্থানাঙ্কগুলি সংরক্ষণ করুন - অনুবাদ করার আগে স্থানাঙ্কগুলি ব্যবহার করুন, এটি বিটম্যাপের ভিতরে স্থানাঙ্ক ates
  • লুপের শেষে, এই স্থানাঙ্কগুলিকে 2 দিয়ে গুণ করুন: x *= 2; y*=2;পরের চিত্রটিতে স্থানাঙ্কে অনুবাদ করতে (পূর্ববর্তী স্কেল)

7. পূর্ববর্তী চিত্রটি নিন (এখানে "স্কেল_5"), তবে সমস্ত পিক্সেল লুপ করবেন না; x = সেভড_এক্স থেকে শুরু করুন এবং x = সেভড_এক্স + 2 দিয়ে শেষ, y এর সাথে সমান। এটি হ'ল এখন থেকে আপনি প্রতিটি স্তরের জন্য কেবল 4 পিক্সেলের মধ্য দিয়ে লুপ করবেন! বাকি যেমন পি। 6।

৮. প্রথম চিত্রটি নিন (সবচেয়ে বড় = সবচেয়ে বড় রেজোলিউশনের সাথে একটি), আবার 4 পিক্সেলের মধ্য দিয়ে লুপ করুন এবং শেষ পর্যন্ত আপনার কাছে পিক্সেল যা মাউস কার্সারের নিকটে রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

9. তবে, আমি এখানে "এম "টিকে একটি বিন্দু হিসাবে আচরণ করছি। আপনি যদি এটি পুরোপুরি ফিট করে এমন একটি বৃত্ত হতে চান তবে আপনাকে circle.radiusপ্রথমে পিক্সেল দ্বারা আকারটি সঙ্কুচিত (সঙ্কুচিত) করতে হবে ।

আমি ভেবেছিলাম আমি যুক্ত করলাম যে এই অ্যালগরিদম কেবল তখনই কাজ করবে যদি আপনি একরঙা নয় তবে গ্রেস্কেল চিত্র ব্যবহার করেন এবং একটি পিক্সেলটিকে সাদা না হলে "পূর্ণ" এবং যদি এটি একেবারে সাদা হয় তবে "খালি" হিসাবে বিবেচনা করবেন ... বা যদি আপনার আকার পরিবর্তনশীল এই 4 পিক্সেলের কমপক্ষে কোনও একটি সাদা না হলে অ্যালগরিদম প্রতিবার 4 টি পিক্সেলের প্রতিটি দলকে 1 কালো পিক্সেলে পরিণত করে।


2
এমন আকারের উত্তরগুলির জন্য +1 যা গাণিতিকভাবে প্রকাশ করা কঠিন (যদি অসম্ভব না হয়)।
সাইফার

বাহ, খুব আকর্ষণীয়। +1 খুব: ডি
ভেক্সিল

আমি এটি বাস্তব প্রকল্পে বাস্তবায়ন করেছি এবং আমি অবশ্যই বলব যে কিছু সমস্যা উদ্ভূত হয়েছিল। মূলত, আপনাকে গ্রিড কোষের একটি তালিকা তৈরি করতে হবে, যেখানে আপনি নামীদামী গ্রিড সেলটি গ্রহণ করেন closestএবং এর মধ্যে দূরত্বটি চূড়ান্তভাবে পরীক্ষা করতে চান closest- আসুন দূরত্বটির নাম দিন furthest_dist। এখন আপনাকে সেই তালিকা থেকে সমস্ত কক্ষের তালিকাটি সরিয়ে ফেলতে হবে যাগুলির নিকটতম পয়েন্ট রয়েছে এবং আরও furthest_distগভীর স্তরে যেতে হবে। সুতরাং এর মতো কিছু পরিবর্তে: i.imgur.com/4UuFo.png এটি এর মতো কিছু: i.imgur.com/dyTT3.png
মার্কাস ভন ব্রডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.