2015-06-23 12 views
9

मैं अब 2-3 हफ्तों के लिए रहा हूं और मैं अभी भी उचित टक्कर का पता लगाने का प्रबंधन नहीं कर सकता। मैंने आयताकारों का उपयोग करके एक भूलभुलैया बनाई है। जब भी मेरी वस्तु किसी भी दीवार से टकराती है और कहीं भी स्थानांतरित करने में सक्षम होती है (या दीवार को स्लाइड करती है) तो मैं अपनी ऑब्जेक्ट (जो एक आयताकार में है) चाहता हूं।आयतों के बीच टकराव का पता लगाने (कोई ओवरलैप नहीं) - libgdx

shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH 
shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // WEST 
shapeRenderer.rect(2, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // EAST 
shapeRenderer.rect(0.9f, 11, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); // SOUTH 

मैं वर्तमान में एक ओवरलैप विधि है कि मैं इतना में मिल गया है का उपयोग कर रहा है: My दीवारों (आयतों) निम्नलिखित की तरह नकारात्मक निर्देशांक है।

private boolean overlaps (Rectangle collision, Rectangle wall) { 
    return Math.min(collision.x, collision.x + collision.width) 
     < Math.max(wall.x, wall.x + wall.width) 
    && Math.max(collision.x, collision.x + collision.width) 
     > Math.min(wall.x, wall.x + wall.width) 
    && Math.min(collision.y, collision.y + collision.height) 
     < Math.max(wall.y, wall.y + wall.height) 
    && Math.max(collision.y, collision.y + collision.height) 
     > Math.min(wall.y, wall.y + wall.height); 
} 

मैं एक समारोह है जो सभी स्थिति वस्तु द्वारा किए गए चाल बचाता है: यहाँ विधि मेरी CollisionManager कक्षा में है कि है। इस प्रकार, जब एक टक्कर होती है, तो वस्तु पिछले कदम पिछले कदम से पहले करने के लिए पुनर्स्थापित करता है (के बाद से पिछले चाल जब टकराव हुआ है) (नीचे दिए गए उदाहरण):

private void overlapsTop(Entity object, Rectangle wall){ 

    Rectangle r = new Rectangle(); 
    if(spritePositions.size() != 0){ 
     r = spritePositions.get(spritePositions.size()-1); 
    } 
    object.update(r.x, r.y, r.width, r.height); 
    object.getObject().setBounds(r.x, r.y, r.width, r.height); 
    spritePositions.clear(); 
} 

अतिरिक्त जानकारी: मैं अपने वस्तु कर रहा हूँ इस तरह:

public void moveRight(){ 
    position.x += 1f; 
    update(); 
} 

public void update(){ 

     boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight()); 
} 

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

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

अद्यतन

मैं moveRight समारोह और अद्यतन समारोह नवीनीकृत किया है। @ एड्रियन शम और @ मैथ्यू मार्क मिलर मैंने अब सब कुछ एक पूर्णांक के साथ बनाया है (जिसका अर्थ है 0.01 एफ, मैं 1 एफ का उपयोग करता हूं)।

इस प्रकार कोड है कि मैं ले जाने के लिए उपयोग करते हैं निम्नलिखित वस्तु इस तरह है:

if(Gdx.input.isKeyPressed(Keys.RIGHT)){ 

       if(collisionManager.canSpriteNotMoveRight(object)){ 
        object.stopGoingRight(); 
       }else{ 
        object.moveRight(); 
       } 
      } 

मेरी collisionManager कक्षा में, समारोह stopGoingRight निम्नलिखित है: अब तक

public void stopGoingRight(){ 
    position.x -= 1f; 
    update(); 
} 

, बहुत अच्छा। जब वस्तु दीवार से टकराती है, तो वस्तु बंद हो जाती है और वापस उछालती है। अच्छी बात है। लेकिन मुझे एक और समस्या है (जो परेशान है) कि मैं सबसे अच्छा वर्णन करने का प्रयास करूंगा। यदि, उदाहरण के लिए, मैं वस्तु को दीवार पर ले जा रहा हूं, तो वस्तु उस दीवार से कई बार वापस उछाल जाएगी; अगर मैं ऊपर की कुंजी दबाकर रोकता हूं, तो ऑब्जेक्ट कभी-कभी दीवार के भीतर फंस जाएगा। इस प्रकार क्या होता है जब मैं नीचे की कुंजी दबाता हूं, यह नीचे जाने के बजाए ऊपर जायेगा (या यदि मैं बाएं दबाता हूं, तो ऑब्जेक्ट बाएं जाने के बजाए सही हो जाएगा) क्योंकि ओवरलैप फ़ंक्शन निष्पादित हो जाता है (चूंकि ऑब्जेक्ट और दीवार दोनों एक दूसरे को काटना)।

क्या यह हल करने का मेरे लिए कोई तरीका है? ऐसा लगता है कि इस तरह के टकराव का पता लगाने के लिए लिबडक्स पूरी तरह से उपयुक्त नहीं है, लेकिन मैं अभी अपने खेल के निर्माण में गहराई से हूं।

+0

आयत है कि आप बारी बारी से नियंत्रित कर रहे हैं कर सकते हैं? या आप बस अपना शीर्षक घुमा रहे हैं? –

+0

हां, आप इसके घूर्णन को नियंत्रित कर सकते हैं। असल में, जब आप नीचे, ऊपर, दाएं या बाएं स्थानांतरित होते हैं, तो वस्तु संगत रूप से घुमाएगी। –

+0

लेकिन 'आयत' हमेशा एक्सिस-गठबंधन सही होगा? – Springrbua

उत्तर

4

मैं अंत में एक अच्छा समाधान नीचे दिए गए लिंक करने के लिए सभी धन्यवाद मिल गया है: On overlap, player gets stuck libgdx Rectangle

असल में मैं अगर वस्तु दीवार के साथ भिड़ना होगा देखने के लिए एक "नकली" चाल बनाने के लिए है। अगर टक्कर हो, तो मैं वस्तु को रोकता हूं और नए कदम को निष्पादित नहीं करता हूं।

हर किसी की मदद के लिए धन्यवाद :) !! यह बहुत सराहना की है !!

5

आपका टक्कर एल्गोरिथ्म अधिक शब्दों वाले लेकिन सही लगता है (Wordy हमेशा होता है क्योंकि एक्स के मिनट, x + चौड़ाई सिर्फ एक्स के रूप में चौड़ाई> = 0 होना चाहिए, और उलटा अधिकतम के लिए सच है)।

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

मेरा पसंदीदा उदाहरण: .1f + .2f> .3f

संबंधित मुद्दे