2 डी टॉवर रक्षा - एक दुश्मन को एक गोली


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
क्या इस जवाब से किसी और को कोई मतलब नहीं है?
ब्लूराजा - डैनी पफ्लुघोटे

@Fxlll: ठीक है, मुझे लगता है कि मैं देख रहा हूं कि आप क्या कहना चाह रहे हैं। प्रारंभ / अंत में उत्तर के लिए बहुत सारे फ़्लॉफ़ असंबंधित हैं, और मुझे आपकी अंग्रेजी (जो मुझे एहसास है कि शायद आपकी गलती नहीं है) भी भ्रमित थी । मैंने इस उत्तर को साफ करने के लिए एक संपादन-सुझाव प्रस्तुत किया है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

@BlueRaja - डैनी Pflughoeft आपके प्रयास के लिए धन्यवाद!
FxIII

7

यदि लक्ष्य स्थिर गति से एक स्थिर दिशा में आगे बढ़ रहा है, और आपका बुलेट पथ स्थिर गति से एक सीधी रेखा में है, तो आप उस स्थान पर अपने टावरों की बंदूक को निशाना बनाने और निशाना लगाने के लिए सटीक स्थान की भविष्यवाणी करने के लिए एक द्विघात समीकरण का उपयोग कर सकते हैं। ।

चूँकि यह निश्चित है कि गोली इसके निशान से टकराएगी, और आप सटीक समय की गणना कर सकते हैं, जिससे फायरिंग से लेकर प्रभाव तक की गणना की जा सकेगी, कोई टक्कर का पता लगाने की आवश्यकता नहीं होगी, बस बंदूक में आग लग जाए, परिकलित समय अवधि की प्रतीक्षा करें, एक हिट दर्ज करें।

यहाँ द्विघात समीकरण के लिए छद्म कोड है:

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

जब तक बुलेट उस तक पहुँचेगी, तब तक आपको वस्तुओं की स्थिति का अनुमान लगाना होगा। आप इसे ऑब्जेक्ट्स गति / वेग (उम्मीद है कि स्थिर है;) का उपयोग करके कर सकते हैं और यह दिशात्मक वेक्टर है।

मुझे यकीन नहीं है कि सटीक सूत्र मेरे सिर के ऊपर है, लेकिन मुझे लगता है कि यह कुछ इस तरह है:

न्यूपोजिशन = ओल्डपोजिशन + (स्पीड * दिशाविशेषज्ञ);

यदि आपके पास एक निर्धारित रास्ता है तो आपको ऑब्जेक्ट की दिशा बदलने पर पुन: गणना करने की आवश्यकता होगी। अपने दुश्मन के रूप में इस न्यूपोजिशन का उपयोग करें। सस्पेंशन वेक्टर और बुलेट को 'होमिंग इफेक्ट' के बिना ऑब्जेक्ट को हिट करना चाहिए। होमिंग इस तथ्य के कारण होता है कि मूल वेक्टर की गणना के बाद से दुश्मन वस्तु को स्थानांतरित कर दिया गया है, यह केवल तभी पकड़ सकता है जब कोई वस्तु एक दिशा में काफी लंबे समय से यात्रा कर रही हो।

उम्मीद है की यह मदद करेगा :)


3
या आप धोखा दे सकते हैं और स्वचालित रूप से हिट कर सकते हैं, फिर दृश्य प्रतिक्रिया के रूप में चलती स्प्राइट का उपयोग कर सकते हैं। या बस अपनी गोलियों को 50000²mph पर फायर करें।
जोनाथन कॉनेल

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 में नंबर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.