2 ডি টাওয়ার প্রতিরক্ষা - শত্রুর কাছে একটি গুলি bullet


14

আমি শত্রুকে আঘাত করার জন্য একটি ভাল সমাধানের চেষ্টা করছি। খেলাটি 2 ডি টাওয়ার প্রতিরক্ষা, টাওয়ারটি একটি গুলি চালানোর এবং শত্রুদের গ্যারান্টিযুক্ত আঘাত করার কথা।

আমি এই সমাধানটি চেষ্টা করেছিলাম - http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

বুলেটটির উত্স এবং শত্রুর পাশাপাশি (ভেক্টর বিয়োগ) বিয়োগের জন্য উল্লিখিত লিঙ্কটি। আমি চেষ্টা করেছিলাম কিন্তু একটি গুলি শত্রুর চারপাশে অনুসরণ করে।

float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;

velocity.x = diffX;
velocity.y = diffY;

position.add(velocity.x * deltaTime, velocity.y * deltaTime);

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


উত্তর:


11

আপনার যুক্তি নিখুঁত ছিল: আমার অবস্থান থেকে আমার টার্গেটে যেতে ভেক্টর ব্যবহার করুন। এটি একটি ভেক্টরের উদ্দেশ্য ; আপনি কেবল গতি ভুলে গেছেন !

বেগ একটি ভেক্টর: একটি গতি এবং একটি দিক। তবে, আপনি যদি পার্থক্য ভেক্টরটিকে স্বাভাবিক করতে এবং এটি বুলেট গতির (একটি স্কেলার) গুণ করতে ভুলে যান তবে আপনি মূলত বলছেন যে আপনি লক্ষ্যটির নিকটে থাকলে (পার্থক্য ভেক্টরটি ছোট) বুলেটটি ধীর হয়ে যায় ; আপনি যদি দূরে থাকেন তবে বুলেটটির গতি আরও বেশি।

এটি অন্তর্নিহিত সমস্যা: আপনাকে ভেক্টরের দিক এবং প্রবণতা উভয়ই গণনা করতে হবে ।


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

1
এই উত্তরটি কি অন্য কারও কাছে বোঝায় না?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

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

@ ব্লুরাজা - আপনার প্রচেষ্টার জন্য ড্যানি ফ্লুঘুফুট ধন্যবাদ!
FxIII

7

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

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

চতুর্ভুজ সমীকরণের জন্য এখানে সিউডো কোডটি রয়েছে:

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

সিউডো কোডের জন্য ধন্যবাদ, আমি চতুর্ভুজ সমীকরণ এই পরিস্থিতির সাথে কীভাবে কাজ করে তা পরীক্ষা করে দেখব। আবার ধন্যবাদ.
তাশু

সমস্যাটি হ'ল ব্যবহারকারী বুলেটটির দিকে এগিয়ে যেতে পারে এবং আঘাতের ঠিক আগে, তিনি বুলেটটির সন্ধান থেকে দূরে সরে যেতে পারেন। এই ক্ষেত্রে, এই সমাধান কি যথেষ্ট ভাল হবে?
মার্টিন

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

3

বুলেটটি পৌঁছানোর সময়কালে আপনাকে অবজেক্টগুলির অবস্থান 'পূর্বাভাস' দিতে হবে। আপনি বস্তুর গতি / বেগ (আশা করি এটি ধ্রুবক;)) এবং এটি দিকনির্দেশক ভেক্টর ব্যবহার করে এটি করতে পারেন।

আমি নিশ্চিত না যে সঠিক সূত্রটি আমার মাথার উপরের দিক থেকে বন্ধ রয়েছে তবে আমি মনে করি এটি এরকম কিছু:

নতুন অবস্থান = ওল্ডপজিশন + (গতি * দিকনির্দেশকারী);

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

আশাকরি এটা সাহায্য করবে :)


3
অথবা আপনি প্রতারণা করতে এবং স্বয়ংক্রিয়ভাবে আঘাত করতে পারেন, তারপরে চলন্ত স্প্রিটটি ভিজ্যুয়াল প্রতিক্রিয়া হিসাবে ব্যবহার করুন। অথবা আপনার বুলেটগুলিকে 50000 মিমি ঘন্টা বর্ষণ করুন fire
জোনাথন কনেল

1

আপনি 2 এর বর্গমূল এবং শক্তি ব্যবহার এড়াতে পারেন।

var distX:Float = target.x - x;
var distY:Float = target.y - y;
_velX = distX / timeTravel;
_velY = distY / timeTravel;

// Take out if you want a nice slow down as approaches effect.  
timeTravel -= 1.0; // make sure u have a positive timeTravel.
x += _velX;
y += _velY;

if (distX < 0)
    distX = -distX;

if (distY < 0)
    distY = -distY;

if (_velX < 0)
    _velX = -_velX;

if (_velY < 0)
    _velY = -_velY;

// Should both snap @ the same time.
if (distX < _velX)
x = target.x; // snap & see what happens.

if (distY < _velY)
y = target.y; // snap & see what happens.

// TODO: call your onHitTarget here ...
// Hopefully this shall provide 10x the performance 
// of using Math.sqrt and all the extra multiplications.

এগুলি সবই স্মৃতি থেকে লেখা। যাইহোক, যে উপাদানগুলি কাজ করে সেগুলি ব্যবহার করুন - আপনি যদি নতুন হন তবে এটি লাইন লাইনে পরীক্ষা করুন। এএস 3 তে ভাসা নম্বর।

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