ভূখণ্ডের বিরুদ্ধে খেলোয়াড়কে কীভাবে স্লাইড করুন


11

নকশা

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

আমার মনে হচ্ছে আমি প্রায় সেখানে এসেছি কিন্তু আমি শেষ টুকরোটি রাখতে পারি না।

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

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

উত্তর:


13

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

Vector undesiredMotion = normal * (dotProduct(input, normal));
Vector desiredMotion = input - undesiredMotion;

যাইহোক এরকম কিছু। যদিও আপনার সুন্দর চিত্রটিতে ইনপুটটি দেয়াল থেকে দূরে বলে মনে হচ্ছে তাই আমি কিছুটা বিভ্রান্ত।


দুঃখিত, তিনি সেখানে একটি উল্লম্ব প্রাচীরের সামনে থাকার কথা। ভয়ানক অঙ্কন
Iain

1
ডট পণ্য সম্পর্কে আমি কিছুটা বিভ্রান্ত। বিন্দুর পণ্যটি কী স্কেলার নয়?
আয়েন

1
হ্যাঁ, তবে আপনি আপনার অনাকাঙ্ক্ষিত গতির ভেক্টর পেতে সাধারণ (কোনও ভেক্টর) দিয়ে এটি গুণ করেন। স্কেলার গুলি দ্বারা গুণিত একটি ভেক্টর (এক্স, ওয়াই, জেড) আপনাকে ভেক্টর দেয় (এসএক্স, সি, এসজেড)।
ক্রিস হাও

হয়ে গেছে, পরিবর্তনগুলি পরিবর্তন করে আশাকরি ডায়াগ্রামের সাথে মেলে। :)
ক্রিস হাও

@ আইইন আমি সত্যিই এই উত্তরটি কীভাবে ব্যবহার করব তা বোঝার চেষ্টা করছি তবে আমি এটি উপলব্ধি করতে পারছি না। আমি যখন এই সঠিক কোডটি তৈরি করি তখন আমি সত্যই অদ্ভুত desiredMotionফলাফল পাই । আপনি কি কখনও এই কাজ পেয়েছেন?
পরীক্ষা

1

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

// assume that 'normal' is unit length
Vector GetDesired(Vector input, Vector normal) {
   // tune this to get where you stop when you're running into the wall,
   // vs. bouncing off of it
   static float k_runningIntoWallThreshold = cos(DEG2RAD(45));

   // tune this to "fudge" the "push away" from the wall
   static float k_bounceFudge = 1.1f;

   // normalize input, but keep track of original size
   float inputLength = input.GetLength();
   input.Scale(1.0f / inputLength);

   float dot = DotProduct(input, normal);

   if (dot < 0)
   {
      // we're not running into the wall
      return input;
   }
   else if (dot < k_runningIntoWallThreshold)
   {
      Vector intoWall = normal.Scale(dot);
      intoWall.Scale(k_bounceFudge);

      Vector alongWall = (input - intoWall).Normalize();
      alongWall.Scale(inputLength);

      return alongWall;
   }
   else
   {
      // we ran "straight into the wall"
      return Vector(0, 0, 0);
   }
}

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

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