การสร้างอาวุธระยะประชิดใน Box2D (libGDX)


10

ฉันกำลังดิ้นรนกับวิธีการใช้อาวุธระยะประชิดที่สามารถสวิงเมื่อกดปุ่ม

ฉันจินตนาการการโจมตีสองแบบที่แตกต่างกัน (แทงและแกว่ง)

ฉันได้ลองสร้างการแข่งขันสองรายการ (ตัวละคร + อาวุธ) สองร่างที่แตกต่างกันสองร่างที่แตกต่างกัน + ข้อต่อที่น่ารังเกียจ แต่ฉันไม่สามารถเขียนโค้ดเพื่อให้ทำงานตามที่ฉันจินตนาการได้ myimagination

แทง:

ดังนั้นด้วยการกดปุ่มร่างกาย / อุปกรณ์จับยึด (เซ็นเซอร์) จะออกมาเป็นเวลาประมาณ 1 วินาทีและหายไป (อีกทางหนึ่งร่างกาย / อุปกรณ์ติดตั้งสามารถอยู่กับฮีโร่ได้เสมอและหมุน 90 องศารอบจุดยอดเมื่อกดและ จากนั้นหมุนกลับเป็นปกติ)

แกว่ง:

สิ่งเดียวกัน แต่ตอนนี้อาวุธจะเริ่มจากด้านบนและแกว่งลง อาวุธก็จะเป็นเซ็นเซอร์ด้วย

สิ่งที่ฉันได้ลอง:

ฉันสร้างร่างกายที่มีพลังสองแบบ

อาวุธต้องติดตามฮีโร่ดังนั้นฉันจึงใช้ข้อต่อหมุนรอบเพื่อรวมเข้าด้วยกัน เมื่อกดปุ่มฉันจะตั้งค่าความเร็วเชิงมุมของอาวุธให้เป็นตัวเลข อย่างไรก็ตามอาวุธจะยังคงหมุนหลังจากที่ฉันปล่อยกุญแจ ฉันลองใช้การตรวจสอบถ้า (ถ้ามุมมากกว่า ___ ตั้งค่าความเร็วเชิงมุมเป็นศูนย์) อย่างไรก็ตามนั่นหมายความว่าอาวุธจะหยุดหมุนเมื่อฉันกดปุ่มเป็นครั้งที่สอง


เนื่องจากคุณได้สร้างรูปทรงสี่เหลี่ยม / ตัวยึดเรียบร้อยแล้วคุณจะต้องหมุนตัวดาบ 90 องศาไปทางขวาสำหรับการเคลื่อนไหวแบบแกว่ง นอกจากนี้คุณต้องปิดการชนของร่างกายดาบเมื่อภาพเคลื่อนไหวไม่ได้เกิดขึ้นและไม่ได้วาดบนหน้าจอ แอนิเมชั่นแทงเป็นเพียงการแกว่งที่ง่ายกว่าซึ่งดาบนั้นมีมุมเริ่มต้นที่แตกต่างกัน ไม่ถูกต้องใช่มั้ย ดูเหมือนจะง่ายสำหรับฉัน คุณติดอยู่ที่ไหน
dimitris93

ปัญหาคือดาบและฮีโร่ที่ทับซ้อนกันหรือไม่? อาจจะเป็นร่างสี่เหลี่ยมจัตุรัสเล็ก ๆ อาจเป็นปลายดาบจึงไม่เคยทับซ้อนกัน อาจแก้ไขข้อมูลเพิ่มเติม
drumbumLOLcatz

@Shiro ฉันรวมความพยายามของฉันไว้ที่ด้านล่าง ตอนนี้ฉันติดอยู่เพราะฉันไม่รู้วิธีเริ่มและหยุดการหมุนในการกดปุ่มเดียว
quidproquo

แท้จริงแล้วมันรู้สึกเหมือนคำถามที่แท้จริงของคุณคือวิธีการหมุนวัตถุบนปุ่มกด
dimitris93

คำตอบ:


1

บังเอิญฉันได้ทำสิ่งที่คุณพยายามจะทำ สิ่งที่จับได้เพียงอย่างเดียวคือฉันใช้ Jbox2d ดังนั้นโค้ดอยู่ใน Java แต่คุณควรจะสามารถเข้าใจได้ถ้าคุณใช้ 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มันลงมาเพื่อการเขียนโปรแกรมภาษาจาวาพื้นฐานไม่ได้เกี่ยวกับปัญหาเฉพาะของเกม
dimitris93

0

จากสิ่งที่คุณพูดดูเหมือนว่าคุณอาจต้องย้ายโค้ดที่รีเซ็ตความเร็วเชิงมุมหลังจากถึงมุมที่กำหนด ฉันสงสัยว่ารหัสนี้จะใช้เฉพาะเมื่อกดปุ่มเนื่องจากคุณบอกว่าการกดปุ่มในครั้งที่สองจะทำให้การเคลื่อนไหวหยุดลง (และทำให้รหัสการทดสอบทำงาน)

หากเป็นกรณีนี้คุณสามารถย้ายไปยังคำสั่ง 'else' หลังจากรหัสที่ทดสอบว่ามีการกดคีย์หรือไม่


0

สิ่งหนึ่งที่คุณสามารถทำได้คือในคำสั่งเรียกใช้วิธีการที่จะสร้างเนื้อหาที่สัมพันธ์กับตำแหน่งของร่างกายหลักโดยใช้ body.getPosition.set (); ตั้งค่าตัวกรองบิตให้ไม่ชนจากนั้นตั้งค่าความเร็วเชิงเส้นหรือบังคับใช้สิ่งที่คุณต้องการย้ายไปข้างหน้าหลังจากเริ่มจับเวลาเพื่อทำลายหลังจาก x จำนวนลูปของเกม

หรือคุณสามารถทำสิ่งเดียวกันได้ แต่แทนที่จะสร้างข้อต่อระยะทางรวมกับข้อต่อปริซึมตามแนวแกน x เท่านั้นเพื่อให้การเคลื่อนไหวอย่างฉับพลันพร้อมการชนที่เชื่อมต่อเป็นเท็จเพื่อที่จะไม่ชนกับตัวหลักตัวเลือกนี้จะ อาจทำงานได้ดีขึ้น

สำหรับการโจมตีแบบสวิงสร้างร่างกายที่คล้ายกันหมุนครึ่งหนึ่งของ pi โดยมีเพียงปลายดาบที่เชื่อมต่อกับร่างกายหลักที่มีการชนกันที่เชื่อมต่อกับเท็จเท่ากันแน่นอนจากนั้นคุณสามารถใช้แรงมอเตอร์กับข้อต่อแรงกระตุ้นเชิงมุม ทำลายมันหลังจากการหมุนรอบตัวของร่างกายสำเร็จหรือเกิดขึ้นในช่วงระยะเวลาหนึ่ง

หากต้องการความช่วยเหลือพิเศษใด ๆ เพียงแค่แสดงความคิดเห็นด้านล่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.