वैक्टर का उपयोग करके XNA / C # में स्प्राइट ले जाना


9

मैं वर्तमान में C # भाषा के साथ XNA खेल विकास देख रहा हूं।

मेरे पास दो कक्षाएं हैं: मुख्य गेम हैंडलर और एक "स्प्राइट" क्लास। निम्नलिखित कुछ बुनियादी छद्म कोड हैं जो मुझे उम्मीद है कि इस मुद्दे का पर्याप्त वर्णन करेंगे।

Game.cs

class game {
  sprite the_sprite;
  void update(time) {
    var mouse = mouse.state
    if(mouse.clicked) { this.the_sprite.moveTo(mouse.x, mouse.y) }
    this.the_sprite.update(time)
    base.update(time)
  }
}

Sprite.cs

class sprite {
  vector2 location;
  vector2 move_to;
  void moveTo(x, y) { this.move_to = new vector2(x, y) }
  void update(time) {
    if(this.location.x > this.move_to.x /* (or less than) */) {
      // adjust location.x
    }
    if(this.location.y > this.move_to.y /* (or greater than) */) {
      // adjust location.y
    }
  }
}

मूल रूप से: जब उपयोगकर्ता गेम विंडो में कहीं क्लिक करता है, तो माउस का x और y निर्देशांक लिया जाता है, और गेम ऑब्जेक्ट समय के साथ उस स्थान की ओर बढ़ जाएगा।

ठीक है ... कोड काम करता है, लेकिन यह बदसूरत है, और ऑब्जेक्ट सीधे ऑब्जेक्ट की ओर नहीं जाते हैं (इसके बजाय, यह विकर्ण आंदोलन है, इसके बाद एकल-अक्ष आंदोलन होता है)। मैं अनुमान लगा रहा हूं कि कुछ गणितीय कार्य हैं जिनका मैं उपयोग कर सकता हूं, लेकिन मैं ईमानदारी से कोई सुराग नहीं लगाता हूं कि कहां से शुरू किया जाए। कोई सुझाव?


3
नमस्कार मेहमान। आप जो देख रहे हैं वह सामान्यीकरण है। कृपया इस प्रश्न के उत्तर पढ़ें: gamedev.stackexchange.com/questions/7540/… । एक कोड प्रदान करता है जिसकी आपको आवश्यकता है, दूसरा बताता है कि यह बहुत अच्छी तरह से कैसे काम करता है।
नोटबंदी

हैलो, मैंने लिंक को देखा है और यह वही था जो मुझे चाहिए था। धन्यवाद!
मैट

जवाबों:


12

अगर मैं आपकी समस्या को ठीक से समझता हूं, तो आपको बस एक दिशा वेक्टर 2 होनी चाहिए जो उस दिशा का प्रतिनिधित्व करती है जिसे आप अपने स्प्राइट वर्ग के अंदर ले जाना चाहते हैं। ऐशे ही:

public Vector2 Direction { get; set; }

यह सामान्यीकृत वेक्टर है (जिसका अर्थ है कि इसकी लंबाई 1 है) जहां आप जाना चाहते हैं।

फिर, एक स्पीड फ्लोट संपत्ति जोड़ें, जो कहता है कि स्प्राइट कितनी तेजी से जाना चाहिए।

public float Speed { get; set; }

आपको एक UpdateSprite फ़ंक्शन भी जोड़ने की आवश्यकता है, इसलिए इसे अपने स्प्राइट वर्ग के अंदर क्यों न डालें?

public Update(GameTime gameTime)
{
   Position += Direction * Speed * gameTime.ElapsedGameTime.TotalSeconds;
}

यह इसे स्थानांतरित करने के लिए स्प्राइट की स्थिति को अपडेट करेगा (आप डेल्टा सेकंड से गुणा करें ताकि स्प्राइट धीमी गति से कंप्यूटर पर ठीक से चले)।

अंत में, आप अपनी दिशा संपत्ति को इस तरह निर्धारित करते हैं:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();

यह भी ध्यान दें कि यदि स्प्राइट की लंबाई। अप्रत्यक्ष (सामान्य होने से पहले) कुछ सीमा से कम है, तो आपका स्प्राइट आ गया है।
ट्रेब्डजेड

वास्तव में, मैं अपनी पोस्ट को संपादित करने वाला था, लेकिन मुझे लगता है कि मैं नहीं करूंगा। यदि आप अपने स्प्राइट को लगातार लक्ष्य की तलाश नहीं करना चाहते हैं, तो बस दिशा को वेक्टर2.Zero पर सेट करें जब यह लक्ष्य के काफी करीब हो।
जेसी एमोंड

बहुत अच्छा जवाब ... और आपने मुझे गेमटाइम के उपयोग के बारे में भी सिखाया (धीमी गति से कंप्यूटर पर स्प्राइट को स्थानांतरित करने के लिए), इसलिए एक पत्थर के साथ दो पक्षी। मैं इस उत्तर को स्वीकार करूंगा।
मैट

:) जिस तरह से मैं व्यक्तिगत रूप से अपने स्प्राइट क्लास (मेरे अपडेट फ़ंक्शन के अंदर) के अंदर सामान्यीकरण को रखना पसंद करता हूं, ताकि क्लास के बाहर लगातार इसे सामान्य करने से रोक सके। आपको यह भी सुनिश्चित करना चाहिए कि वेक्टर की लंबाई 0 के बराबर नहीं है, अन्यथा आपको 0 अपवाद द्वारा एक विभाजन मिलेगा। बस यह जांचें कि क्या Direct.LengthSquared ()> 0 को सामान्य करने से पहले इसे सुरक्षित करने के लिए (लंबाई चुकता इतना है कि आपको उस महंगी वर्ग फ़ंक्शन की गणना करने की आवश्यकता नहीं है;))।
जेसी एमोंड

आइए बताते हैं कि हम एक अलग आईडीई का उपयोग कर रहे हैं, जिसमें सामान्यीकृत फ़ंक्शन नहीं था, सामान्यीकृत समीकरण क्या होगा?
Spooks

2

Google सामान्यीकरण ... मैं भी इस पर थोड़ा खो गया हूं, लेकिन मुझे पूरा यकीन है कि यह आपकी समस्या को हल करने में मदद करेगा। कोई दूसरा मेरे जवाब को विस्तृत या नापसंद कर सकता है मुझे यकीन है

संपादित करें: मैं इस बेहतर, माफ़ी का जवाब दे सकता था

मैं व्यक्तिगत रूप से हमेशा इस तरह की समस्याओं के साथ मदद करने के लिए इस ब्लॉग पोस्ट को देखता हूं: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

यह खरोंच से शुरू होता है और खेल के विकास के लिए प्रासंगिक है।


3
आप सही हैं, यह सामान्यीकरण है। लेकिन पिछले प्रश्नों में अच्छे उत्तर खोजने की कोशिश करना हमेशा बेहतर होता है। और अगर आप इसका उत्तर दे रहे हैं तो कोड को कम से कम समझाना या साझा करना हमेशा बेहतर है या जो भी आपको लगता है कि उपयोगी हो सकता है, न कि केवल Google को इंगित करें।
नोटबंदी

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