Box2D में एक हाथापाई हथियार बनाना (libGDX)


10

मैं एक हाथापाई हथियार को लागू करने के लिए संघर्ष कर रहा हूं जो एक कुंजी दबाए जाने पर स्विंग कर सकता है।

मैं दो अलग-अलग हमलों (छुरा और स्विंग) की कल्पना कर रहा हूं

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

छुरा:

तो एक बटन के प्रेस के साथ, एक शरीर / स्थिरता (सेंसर) ~ 1 सेकंड के लिए बाहर आ जाएगी और फिर गायब हो जाएगी (वैकल्पिक रूप से, शरीर / स्थिरता हमेशा नायक पर हो सकती है और दबाए जाने पर कोने के चारों ओर 90 डिग्री घूम सकती है, और फिर वापस सामान्य की ओर घूमें)

जोरों:

एक ही बात है, लेकिन अब हथियार ऊपर से शुरू होकर नीचे की ओर झूलेंगे। हथियार भी सेंसर होगा।

मैंने क्या कोशिश की है:

मैंने दो गतिशील निकाय बनाए।

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


चूंकि आपने पहले ही आयत के आकार के निकाय / जुड़नार बना लिए हैं, इसलिए आपको स्विंग एनीमेशन के लिए तलवार के शरीर को 90 डिग्री पर दाईं ओर घुमाना होगा। इसके अलावा, आपको तलवार के शरीर के टकराव को बंद करने की आवश्यकता है, जब एनीमेशन नहीं हो रहा है, और इसे स्क्रीन पर नहीं खींचें। छुरा एनीमेशन स्विंग का एक सरल संस्करण है, जहां तलवार का एक अलग प्रारंभिक कोण होता है। क्या यह सही नहीं है? मेरे लिए बहुत आसान लगता है। कहां फंस गए?
dimitris93

क्या समस्या अतिव्यापी तलवार और नायक है? शायद एक छोटा वर्ग शरीर तलवार की नोक हो सकता है इसलिए यह कभी भी ओवरलैप नहीं होता है। शायद कुछ और जानकारी के लिए संपादित करें
drumbumLOLcatz

@ सिरो मैंने अपने प्रयासों को सबसे नीचे रखा। अभी मैं फंस गया हूं क्योंकि मुझे पता नहीं है कि एक प्रमुख प्रेस में रोटेशन कैसे शुरू करें और बंद करें।
quidproquo

हाँ, ऐसा लगता है कि आपका वास्तविक सवाल कुंजी प्रेस पर किसी वस्तु को घुमाने के लिए कैसे है
dimitris93

जवाबों:


1

संयोग से, मैंने ठीक वही किया है जो आप करने की कोशिश कर रहे हैं। एकमात्र कैच मैं Jbox2d का उपयोग कर रहा था इसलिए कोड जावा में है, लेकिन यदि आप C ++ का उपयोग कर रहे हैं तो भी आपको इसका पता लगाने में सक्षम होना चाहिए

यदि आप स्विंगिंग एक्शन करना चाहते हैं, तो आपको मूल रूप से जोड़ों / मोटरों और उस सभी मज़ेदार सामान का उपयोग करने की आवश्यकता है। यहाँ मेरा स्निपेट है कि कुंजी कोड के आधार पर मेरा कोड कैसा दिखता है:

    if (myinput.mouse0) {

        agents.get(0).rightForeJoint.enableMotor(true);
        agents.get(0).rightArmJoint.enableMotor(false);    

        if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)){
            agents.get(0).rightForeJoint.enableMotor(false);
        }

        mouseY = Mouse.getY();
        mouseX = Mouse.getX();
        float temp = mouseY - prevPos[1];

        float temp2 = -mouseX + prevPos[0];

        temp2 *= modifier; temp2 *= 0.000026;
        temp  *= modifier; temp  *= 0.000030;

        agents.get(0).armR.applyAngularImpulse(-temp);
        agents.get(0).foreR.applyAngularImpulse(temp2); 

        prevPos[1] = mouseY;
        prevPos[0] = mouseX;

        if(temp2 < 0){
            temp2 *=-1;
        }
        if(temp < 0){
            temp *=-1;
        }
        fatigueDrain += temp2;
        fatigueDrain += temp;

    }

और फिर जहां तक ​​वास्तव में हथियारों और व्हाट्सएप का निर्माण है, स्निपेट इस तरह दिखता है।

    // RIGHTARM //
    this.rightArmDef = new RevoluteJointDef();
        this.rightArmDef.bodyA = this.torso ; this.rightArmDef.bodyB = this.armR;
        this.rightArmDef.collideConnected = false;

        torso_armL_pin = new Vec2(0.50f, +0.05f);
        local_armL_pin = new Vec2(0.14f, 0.14f);

        this.rightArmDef.localAnchorA.set(this.torso.getLocalCenter().add(torso_armL_pin));
        this.rightArmDef.localAnchorB.set(this.armR.getLocalCenter().add(local_armL_pin));

        this.rightArmDef.enableMotor = true;
        this.rightArmDef.motorSpeed = 0f;
        this.rightArmDef.maxMotorTorque =10f;

        this.rightArmDef.enableLimit = true;
        this.rightArmDef.lowerAngle = 1.2f;// * DEGTORAD;
        this.rightArmDef.upperAngle = 5;
    this.rightArmJoint = (RevoluteJoint)world.createJoint(this.rightArmDef);

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

संपादित >>

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

वास्तव में, मैं सुझाव दूंगा कि आप शायद कभी खत्म नहीं करेंगे अगर आप कोशिश करते हैं और खरोंच से चीजें करते हैं, तो मान लें कि आप एक भौतिकी खेल बना रहे हैं। क्योंकि घर्षण, उछाल जैसी चीजों की गणना करना और उल्लेख नहीं करना, / कुशल / टकराव का पता लगाना, आपको जीवन भर लेने वाला है।


0

मुझे इसमें कुछ हल मिल गया है, लेकिन मुझे यकीन नहीं है कि यह एक अच्छा तरीका है।

जब एक कुंजी दबाया जाता है, तो मैं कोणीय वेग को 10 पर सेट करता हूं और फिर प्रत्येक अद्यतन पर, मैं इसे जांचने के लिए कहता हूं

    if(weapon.getAngle() >= Math.PI / 2) {
        weapon.setAngularVelocity(-10);
    }
    if(weapon.getAngle() <= 0) {
        weapon.setAngularVelocity(0);
    }

आपके अंदर if(weapon.getAngle() <= 0)भी आपको इसे अपने इच्छित कोण पर मैन्युअल रूप से रखना चाहिए, अन्यथा इसका सटीक होना संभव नहीं है और आपको if-elseइसके बजाय कथन की आवश्यकता है if-if। यह बुनियादी जावा कोडिंग के लिए नीचे आता है वास्तव में खेल विशिष्ट समस्या के साथ करने के लिए नहीं।
डिमिट्रिश93

0

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

यदि यह मामला है, तो आप इसे कोड के बाद 'और' बयान में ले जा सकते हैं जो कुंजी दबाए जाने पर परीक्षण करता है।


0

एक चीज जो आप कर सकते हैं, वह है कमांड पर, एक विधि चलाएं जो शरीर के मुख्य भाग की स्थिति के सापेक्ष एक बॉडी बनाएगी ।getPosition.set (); फ़िल्टर बिट्स को टकराने के लिए सेट न करें, फिर रैखिक वेग सेट करें या बल लागू करें, जो भी आप इसे आगे बढ़ाना चाहते हैं, खेल की मात्रा के x मात्रा के बाद नष्ट करने के लिए टाइमर शुरू करने के बाद इसे आगे बढ़ाएं।

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

एक स्विंग अटैक के लिए एक समान बॉडी बनाइए, जिसमें पि का आधा हिस्सा केवल तलवार की नोक से जुड़ा हो, जो मुख्य बॉडी से जुड़ा हो, जो कि बिल्कुल झूठ से जुड़ा हो, तो आप तलवार के शरीर पर संयुक्त कोणीय आवेग पर मोटर बल लगा सकते हैं शरीर के एक सेट रोटेशन के बाद इसे नष्ट करना या एक निश्चित समय आ गया है,

यदि किसी अतिरिक्त सहायता की आवश्यकता है, तो बस नीचे टिप्पणी करें

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