मैं एक सांप की पूंछ को सिर का पालन कैसे कर सकता हूं?


10

एक असाइनमेंट के बाद और बस एक छोटा सा स्नेक क्लोन बनाकर libGDX के साथ शुरू कर रहा हूं, मैं एक ऐसे मुद्दे पर चला गया हूं जिसे शायद थोड़ी देर के लिए शर्म आ जाएगी।

वर्तमान में मेरे पास एक सांप का सिर है (इस स्तर पर एक साधारण आयत) जो खेल के कैनवास के चारों ओर घूम रहा है। साँप के बाकी हिस्सों के निर्माण का सबसे सीधा-सीधा तरीका यह था कि साँप-बस्तियों के एक जावा कलेक्शंस लिंक्डलिस्ट के मालिक हों, जो खिलाड़ी के अनुसार आकार में कमी / कमी करता हो।

स्नेकलाईट की इस सूची के बाद सिर का पालन करना मामूली साबित हुआ है।

ऐसा करने वाला वर्तमान फ़ंक्शन निम्नानुसार है और हर बार कहा जाता है कि सिर अपनी स्थिति को अपडेट करता है:

private void moveTail (float x, float y, int direction) {
    float tmpx, tmpy;
    int tmpdirection;
    int offset_x, offset_y;

    for (SnakeSegment snse : tail) {
        offset_x = 0;
        offset_y = 0;

        tmpx = snse.getX();
        tmpy = snse.getY();
        tmpdirection = snse.getDirection();

        switch(direction) {
            case 0:
                offset_x = 0;
                offset_y = -(2 + snse.width);
                break;
            case 1:
                offset_x = -(2 + snse.width);
                offset_y = 0;
                break;
            case 2:
                offset_x = 0;
                offset_y = (2 + snse.width);
                break;
            case 3:
                offset_x = (2 + snse.width);
                offset_y = 0;
                break;
            default:
                System.out.println("wrong direction");
        }

        snse.setX(x + offset_x);
        snse.setY(y + offset_y);
        snse.setDirection(direction);

        x = tmpx;
        y = tmpy;
        direction = tmpdirection;
    }
}

जो दुर्भाग्य से इस व्यवहार का परिणाम है:

gif

कैसे सही ढंग से काम करने वाली साँप की पूंछ बनाने के लिए कोई सुझाव बहुत सराहना की जाएगी :)

जवाबों:


18

इस तरह की समस्या के बारे में सोचें:
मूल खेल में सांप कैसे चलता है?
सांप अपनी वर्तमान दिशा की ओर बढ़ता है। व्यवहार ऐसा दिखता है कि सिर कुछ भी नहीं है, और अंतिम पूंछ का हिस्सा गायब हो जाता है।

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


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

1
इसके बारे में सोचने का एक वैकल्पिक तरीका यह है कि प्रत्येक साँप तत्व केवल सिर के पीछे चलने के बजाय सीधे उसके सामने के तत्व का अनुसरण करता है। यह उपयोगी होगा यदि, बाद में, साँप बनावट या ऐसा कुछ भी हो।
नाथन रीड

2
इस तरह से वर्तमान संस्करण यहाँ है, फिर से धन्यवाद :) i.imgur.com/IaT5PNH.gif
Kilian

1

जिस तरह से मैं इसे देखता हूं वह सिस्टम की तरह एक "कैटरपिलर" है, जहां सांप का प्रत्येक भाग उसके आगे के भाग का अनुसरण करता है।

दूसरे शब्दों में, साँप का प्रत्येक भाग स्थिति (x, y) के साथ एक वस्तु होगा , इसके आगे के भाग का एक संदर्भ जो इसे घूमने के लिए उपयोग करेगा और इसके आगे के भाग की स्थिति को संसाधित करने के लिए एक फ़ंक्शन और तदनुसार चलते हैं। मुख्य साँप (हेड) के पास साँप के प्रत्येक भाग के लिए संदर्भ होना चाहिए, और भाग को अपने पूर्ववर्ती का पालन करने के लिए जिम्मेदार फ़ंक्शन को बुलाएगा, जो कि पहले भाग का पूर्ववर्ती प्रमुख होगा।
आशा है ये मदद करेगा!


यह विचार था, लेकिन कोनों को संभालना काफी जटिल हो गया। और क्या होगा यदि एक खिलाड़ी 180 डिग्री के तेज कोने में बदल जाएगा? हमें यकीन नहीं था कि इसे सही तरीके से कैसे संभालना है, और पोंटस मैग्नसन द्वारा वर्णित विधि का उपयोग करके इन सभी समस्याओं को अच्छी तरह हल करता है।
किलन

समझा। केवल एक बार जब मैंने एक कैटरपिलर प्रणाली लागू की तो मेरे पास भागों के आकार में कोशिकाओं के साथ एक ग्रिड था, इसलिए प्रत्येक भाग हमेशा एक विशिष्ट सेल के अंदर था, इस तरह, समस्या नहीं हुई। मेरी खराब इंग्लिश के लिए माफ़ कीजिये।
लिसन असैसिनो

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