Tạo vũ khí cận chiến trong Box2D (libGDX)


10

Tôi đang vật lộn với cách thực hiện vũ khí cận chiến có thể vung lên khi nhấn phím.

Tôi đang tưởng tượng hai cuộc tấn công khác nhau (đâm và đu)

Tôi đã thử tạo hai đồ đạc (nhân vật + vũ khí), hai cơ thể khác nhau, hai cơ thể khác nhau + khớp xoay tròn, nhưng tôi không thể mã hóa nó để hành xử theo cách tôi tưởng tượng. sự tưởng tượng của tôi

CÚ ĐÂM:

Vì vậy, chỉ cần nhấn nút, một cơ thể / vật cố định (cảm biến) sẽ xuất hiện trong ~ 1 giây rồi biến mất (thay vào đó, cơ thể / vật cố định luôn có thể nằm trên anh hùng và chỉ xoay 90 độ quanh các đỉnh khi nhấn và sau đó quay trở lại bình thường)

LUNG LAY:

Điều tương tự, nhưng bây giờ vũ khí sẽ bắt đầu từ trên xuống và xoay xuống. Vũ khí cũng sẽ là một cảm biến.

Những gì tôi đã thử:

Tôi tạo ra hai cơ thể năng động.

Vũ khí phải đi theo anh hùng, vì vậy tôi đã sử dụng khớp xoay tròn để giữ chúng lại với nhau. Khi nhấn một phím, tôi đặt tốc độ góc của vũ khí thành một số. Tuy nhiên, vũ khí sẽ tiếp tục quay sau khi tôi buông chìa khóa. Tôi đã thử thực hiện kiểm tra if (nếu góc lớn hơn ___, đặt tốc độ góc bằng 0). Tuy nhiên, điều đó chỉ có nghĩa là vũ khí sẽ ngừng quay khi tôi nhấn phím lần thứ hai.


Vì bạn đã tạo ra các thân / đồ đạc hình chữ nhật, bạn sẽ chỉ cần xoay thân kiếm 90 độ sang phải cho hoạt hình xoay. Ngoài ra, bạn cần tắt các va chạm của thân kiếm, khi hoạt hình không xảy ra và không vẽ nó trên màn hình. Hoạt hình đâm chỉ là một phiên bản đơn giản hơn của swing, trong đó thanh kiếm có góc bắt đầu khác nhau. Điều này có đúng không? Trông khá đơn giản với tôi. Bạn bị mắc kẹt ở đâu?
dimitris93

Có phải vấn đề là thanh kiếm và anh hùng chồng chéo? có lẽ một cơ thể vuông nhỏ có thể là đầu kiếm để nó không bao giờ trùng nhau. có thể chỉnh sửa để biết thêm thông tin
drumbumLOLcatz

@Shiro Tôi bao gồm những nỗ lực của tôi ở phía dưới. Ngay bây giờ tôi bị kẹt vì tôi không biết làm thế nào để bắt đầu và dừng xoay trong một lần nhấn phím.
quidproquo

Phải, nó giống như câu hỏi thực sự của bạn là làm thế nào để xoay một đối tượng khi nhấn phím
dimitris93

Câu trả lời:


1

Ngẫu nhiên, tôi đã làm chính xác những gì bạn đang cố gắng làm. Điều hấp dẫn duy nhất là tôi đang sử dụng Jbox2d vì vậy mã nằm trong Java, nhưng bạn vẫn có thể tìm ra nếu bạn đang sử dụng C ++

Về cơ bản bạn cần sử dụng khớp / động cơ và tất cả những thứ thú vị đó nếu bạn muốn thực hiện hành động lắc lư. Đây là một đoạn mã về mã của tôi trông như thế nào dựa trên đầu vào khóa:

    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;

    }

Và sau đó thực sự xây dựng các cánh tay và không có gì, đoạn trích trông như thế này.

    // 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);

Tôi nhận ra có rất nhiều điều đang diễn ra ở đây, nhưng có lẽ sẽ dễ dàng hơn nếu bạn chỉ hỏi tôi những gì bạn cần rõ ràng và tôi giải thích nó. Nếu bạn chưa bao giờ sử dụng bất kỳ thứ gì trong số này, có lẽ bạn sẽ cần phải đọc một chút công bằng.

CHỈNH SỬA >>

Nhận ra, Box2d có tất cả các phát hiện va chạm và vật lý được xây dựng sạch sẽ trong các thư viện của nó. Hãy tin vào điều đó khi tôi nói, sẽ dễ dàng tìm ra hệ thống của họ hơn là thử và làm mọi thứ từ đầu. Nếu bạn muốn va chạm, bạn sử dụng đồ đạc bodydefs, nếu bạn muốn chúng xoay hoặc di chuyển, bạn sử dụng khớp. Ban đầu có vẻ phức tạp hơn một chút, nhưng cuối cùng, nó giúp bạn tiết kiệm thời gian hơn rất nhiều để sử dụng các phương pháp của họ.

Trên thực tế, tôi sẽ đề nghị rằng bạn có thể sẽ không bao giờ hoàn thành nếu bạn cố gắng và làm mọi thứ từ đầu, giả sử bạn đang tạo ra một trò chơi vật lý. Bởi vì những thứ điện toán như ma sát, độ nổi và không đề cập đến, / hiệu quả / phát hiện va chạm sẽ khiến bạn mất cả cuộc đời.


0

Tôi đã tìm thấy một số cách giải quyết này, nhưng tôi không chắc liệu đây có phải là một cách tốt để viết mã hay không.

Khi nhấn phím, tôi đặt tốc độ góc thành 10 và sau đó ở mỗi lần cập nhật, tôi yêu cầu kiểm tra

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

Bên trong if(weapon.getAngle() <= 0)bạn cũng nên đặt thủ công ở góc cụ thể mà bạn muốn, nếu không nó sẽ không chính xác và bạn cần if-elsetuyên bố thay vì if-if. Nó liên quan đến mã hóa java cơ bản không thực sự liên quan nhiều đến vấn đề cụ thể của trò chơi.
dimitris93

0

Từ những gì bạn đang nói, có vẻ như bạn cũng có thể chỉ cần di chuyển mã đặt lại vận tốc góc sau khi đạt được một góc nhất định. Tôi nghi ngờ rằng mã này chỉ được sử dụng khi nhấn nút, vì bạn nói nhấn nút lần thứ hai sẽ khiến chuyển động dừng lại (và do đó làm cho mã kiểm tra hoạt động).

Nếu đây là trường hợp, bạn có thể di chuyển nó sang câu lệnh 'khác' sau khi mã kiểm tra nếu phím được nhấn.


0

Một điều mà bạn có thể làm là theo lệnh, chạy một phương thức sẽ tạo ra một cơ thể liên quan đến vị trí của cơ thể chính bằng cách sử dụng body.getPocation.set (); đặt các bit bộ lọc không va chạm, sau đó đặt vận tốc tuyến tính hoặc tác dụng lực, bất cứ điều gì bạn muốn di chuyển về phía trước sau khi bắt đầu hẹn giờ để phá hủy sau x số vòng lặp trò chơi

Hoặc bạn có thể làm điều tương tự nhưng thay vào đó, tạo một khớp khoảng cách kết hợp với khớp hình lăng trụ chỉ dọc theo trục x để thực hiện chuyển động đột ngột với va chạm được kết nối là sai để nó không va chạm với thân chính, tùy chọn này sẽ có lẽ làm việc tốt hơn

đối với đòn tấn công tạo ra một cơ thể tương tự xoay một nửa số pi chỉ bằng đầu thanh kiếm được nối với thân chính với sự va chạm được kết nối với sai bằng nhau, dĩ nhiên, bạn có thể tác dụng lực của động cơ lên ​​khớp một xung lực vào thân kiếm phá hủy nó sau khi đạt được một vòng quay của cơ thể hoặc một thời gian nhất định đã xảy ra,

nếu cần hỗ trợ thêm, chỉ cần bình luận bên dưới

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.