पूर्ण आंदोलन में एक दूसरे का अनुसरण करने वाली वस्तुओं के लिए तकनीक?


14

मैं सोच रहा हूं कि वस्तुएं एक दूसरे का अनुसरण कैसे करती हैं, जहां वे वस्तु के पिछले स्थान पर उनके सामने चलती हैं। जब प्रमुख वस्तु बंद हो जाती है, तो निम्नलिखित सभी को अपनी स्थिति पर रोकना चाहिए। तो यह कैसे हासिल किया जाता है?

इस तरह:

यहाँ छवि विवरण दर्ज करें

संपादित करें:
मैं जो हासिल करना चाहता हूं वह यह है कि सभी निम्नलिखित वस्तुएं "चलना" पथ को सामने ले जा रही हैं। अन्य सभी वस्तुएं केवल प्रमुख वस्तु की गति से चलती हैं (यह वेग वेक्टर को निम्नलिखित सभी वस्तुओं के पास करके होगा)। लेकिन मैं एक-दूसरे से दूरी बनाए रखने के साथ-साथ सभी वस्तुओं को कैसे आगे बढ़ने देता हूं / रास्ते पर ठहराव देता हूं।

जवाबों:


11

अपने पथ का वर्णन करने वाले तरीके-बिंदुओं को संग्रहीत करने के लिए "पथ" नामक एक सूची का उपयोग करें , और चलती वस्तुओं और पथ को संग्रहीत करने के लिए "स्नेक" नामक एक दोगुनी-लिंक की गई सूची

प्रमुख वस्तु यात्रा करते समय नए तरीके-बिंदुओं को परिभाषित करती है। इन वस्तुओं-बिंदुओं द्वारा परिभाषित पथ के साथ निम्नलिखित वस्तुएं चलती हैं।

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

इन चीजों को कैसे लागू किया जा सकता है, इसके लिए यहां कुछ छद्म कोड दिए गए हैं। ज्ञात हो कि जिम्मेदारियों के वितरण और इनकैप्सुलेशन के संदर्भ में यह सबसे सुरुचिपूर्ण समाधान नहीं हो सकता है।

class Position {
    property x;
    property y;
}
class WayPoint extends ListNode {
    property position;
}
class Path extends List { 
    property WayPoints = array();

    // Find out the x, y coordinates given the distance traveled on the path
    function getPositionFromDistanceFromEnd(distance) {
        currentWayPoint = this->first();
        while(distance > 0) {
            distanceBetweenWayPoints = this->getDistance(currentWayPoint, currentWayPoint->next());
            if(distanceBetweenWayPoints > distance) {
                position = ... // travel remaining distance between currentWayPoint and currentWayPoint->next();
                return position;
            } else {
                distance -= distanceBetweenWayPoints;
                currentWayPoint = currentWayPoint->next();
            }
        }
    }
    function addWayPoint(position) {
        // Vector describing the current and new direction of movement
        currentDirection = this->first() - this->second();
        newDirection = position - this->first();
        // If the direction has not changed, there is no need to add a new WayPoint
        if( this->sameDirection(currentDirection, newDirection) {
            this->first->setPosition(position);
        } else {
            this->add(position);
        }
    }
}
class Snake extends DoublyLinkedList {
    property Path;
    property MovingObjects = array();
}
abstract class MovingObject extends DoublyLinkedListNode {
    property Snake; // shared among all moving objects of the same snake
    property position;
    const securityDistance = 10;
    abstract function move() { }
}
class MovingObjectLeader extends MovingObject {
    property direction;
    function move() {
        this->position += this->direction * this->Snake->speed;
        this->Snake->Path->addWayPoint(this->position);
        if(this->hasFollower()) {
            this->follower->move();
        }
    }
}
class MovingObjectFollower extends MovingObject {
    property distanceFromEnd;
    function move() {
        this->distanceFromEnd += this->Snake->speed;

        // If too close to leader: stop in order to respect security distance
        if(this->distanceFromEnd > this->leader()->distanceFromEnd - this->securityDistance) {
            this->distanceFromEnd = this->leader()->distanceFromEnd - this->securityDistance;
        }

        this->position = this->Snake->getPositionFromDistanceFromEnd(this->distanceFromEnd);

        if(this->hasFollower()) {
            this->follower->move();
        }
    }
}

पथ-> WayPoints जितना बड़ा और बड़ा होता जाता है खेल उतना ही लंबा होता जाता है। यदि आपका साँप कुछ समय के लिए मौजूद रहता है, तो आपको जब भी साँप के अंतिम तत्व पथ के दूसरे-से-अंतिम मार्ग को पारित किया जाता है, तो आपको अंतिम वेपॉप को हटाने की आवश्यकता होती है। यह भी याद रखें कि नाग के सभी MoveObjects में दूरीFromEnd को कम करें।


मान लीजिए कि मैं अपने माउस के साथ अपनी प्रमुख वस्तु को खींचना चाहता हूं (ऐसा नहीं है जिसे मैं चाहता हूं, लेकिन चलो कहते हैं कि मैं करता हूं)। आपके उदाहरण से यह कैसे काम करेगा?
14

ऑब्जेक्ट्स की सूची पहले तत्व को किसी दिए गए दिशा में अपनी वर्तमान स्थिति से आगे बढ़ने से दे सकती है (एक दी गई गति के साथ), और फिर अन्य सभी तत्वों को उनकी वर्तमान स्थिति से उनकी वर्तमान स्थिति और $ द्वारा निर्दिष्ट दिशा में ले जाने देती है। इस-> previousElement-> getPosition ()। यदि आप अपने पहले तत्व को कहीं खींचते हैं, तो आपको बस इसकी सेटपोजिशन () विधि को कॉल करना होगा। जब सूची प्रदान की जाती है, तो अन्य वस्तुएं अपने पूर्ववर्तियों का पालन करने के लिए अपना रास्ता बदल देंगी।
बर्नब्रोट

अगर मैं गलत हूं तो मुझे सुधारो लेकिन दिशा बदलने के दौरान शॉर्टकट लेने के बाद वस्तुओं में भी ऐसा नहीं होगा? (जैसा मैंने दिया है छवि के निचले हिस्से में)। ऐसा लगता है कि वे सामने वाले के रास्ते का अनुसरण नहीं करेंगे। इसके बजाय वे जितना संभव हो उतना प्रमुख वस्तु की दिशा में जाते। रास्ते से जा रही वस्तुओं के कारण और शॉर्टकट ले रहे हैं?
सिद

हां, यह वास्तव में इस विशेष कार्यान्वयन के साथ होगा। आपके चित्रों को जोड़ने से पहले मैंने उत्तर पोस्ट किया था, तो चलिए फिर कोशिश करते हैं ...
BerndBrot

ठीक है। इस बारे में क्या?
बर्नब्रोट

6

अनिवार्य रूप से आपको दो डेटा संरचनाओं की आवश्यकता होगी (आपके कोड के बाकी हिस्सों के आधार पर तार्किक, घुसपैठ या वास्तविक)। पहला वस्तुओं की जंजीरों को ट्रैक करेगा, और दूसरा पथ को।

चेन बस आपको यह जानना होगा कि कौन सी वस्तुएं अन्य वस्तुओं का अनुसरण कर रही हैं। सबसे सरल मामले में यह केवल ए बी का अनुसरण करेगा, लेकिन इसमें अधिक अनुयायी शामिल हो सकते हैं। श्रृंखला में एक नामित नेता है।

पथ प्रत्येक श्रृंखला के लिए आपको एक पथ की आवश्यकता होगी। इस बात पर निर्भर करता है कि आपका खेल कैसे निर्धारित करता है कि यह कैसे संरचित है। ज्यादातर मामलों में यह किसी प्रकार की लिंक की गई सूची होगी। इससे उन स्थितियों को ट्रैक किया जा सकेगा जिनका चेन में सभी को पालन करने की आवश्यकता है।

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

रूपक के रूप में नेता अपने अनुयायियों के लिए एक ब्रेडक्रंब निशान छोड़ता है। सूची में अंतिम अनुयायी ब्रेडक्रंब का उपभोग करता है।

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


हाँ मैंने ऐसी बात समझ ली। यह वह कार्यान्वयन है जो आमतौर पर मेरे दिमाग को प्रभावित करता है। जवाब के लिए धन्यवाद। स्वीकृत बर्नब्रोट उत्तर, लेकिन आपका उत्थान किया।
सिदार

-3

लुकअप ए * पाथफाइंडिंग। यह एक सामान्य और आसान तरीका है कि आपकी गेम इकाइयाँ / ऑब्जेक्ट किसी स्थिति का अनुसरण / अनुसरण करते हैं।


मुझे पता है कि ए * क्या है, न कि मैं जो खोज रहा हूं और वह बहुत भारी चीज के लिए है जो कि कहीं अधिक सरल लगता है।
13

आपका उत्तर भी सही उत्तर के करीब नहीं है। A * एक पथ खोजने के लिए एक एल्गोरिथ्म है। हालांकि वह कुछ भी नहीं खोजना चाहता है, वह बस एक-दूसरे का पालन करना चाहता है, जो कि अंतिम वस्तु थी।
अली 1 एस 232

जब मैंने मूल रूप से इस सवाल का जवाब दिया तो यह स्पष्ट करने के लिए तय नहीं किया गया था / यह दिखाने के लिए कोई तस्वीर नहीं थी कि उसका क्या मतलब है। मैं सिर्फ पहले 2 वाक्य पढ़ता हूं और लगा कि वह कई संस्थाओं को कुछ ट्रैक करने की कोशिश कर रहा है, एक रास्ते का पालन नहीं कर रहा है। मेरे द्वारा दिए गए बुरे उत्तर के लिए खेद है
thedeadlybutter

मैंने कहा कि एक दूसरे का अनुसरण करें = पी एक बिंदु पर नहीं जाएं।
17

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