Création d'une arme de mêlée dans Box2D (libGDX)


10

J'ai du mal à mettre en œuvre une arme de mêlée qui peut se balancer lorsqu'une touche est enfoncée.

J'imagine deux attaques différentes (coup de couteau et swing)

J'ai essayé de créer deux appareils (personnage + arme), deux corps différents, deux corps différents + articulation révolutée, mais je ne peux pas le coder pour qu'il se comporte comme je l'imagine. mon imagination

POIGNARDER:

Donc, en appuyant sur un bouton, un corps / luminaire (capteur) sortirait pendant environ 1 seconde, puis disparaîtrait (alternativement, le corps / le luminaire pourrait toujours être sur le héros et simplement tourner de 90 degrés autour des sommets lorsqu'il est pressé, et puis revenir à la normale)

BALANÇOIRE:

Même chose, mais maintenant l'arme commencera par le haut et basculera vers le bas. L'arme sera également un capteur.

Ce que j'ai essayé:

J'ai créé deux corps dynamiques.

L'arme doit suivre le héros, j'ai donc utilisé une articulation de révolute pour les maintenir ensemble. Lorsqu'une touche est enfoncée, je règle la vitesse angulaire de l'arme sur un nombre. Cependant, l'arme continuera de tourner après avoir lâché la clé. J'ai essayé d'implémenter une vérification if (si l'angle est supérieur à ___, définissez la vitesse angulaire sur zéro). Cependant, cela signifie simplement que l'arme cessera de tourner lorsque j'appuierai sur la touche une deuxième fois.


Puisque vous avez déjà fait les corps / accessoires en forme de rectangle, il vous suffirait de faire pivoter le corps de l'épée de 90 degrés vers la droite pour l'animation swing. Vous devez également désactiver les collisions du corps de l'épée, lorsque l'animation ne se produit pas, et ne pas la dessiner à l'écran. L'animation de stab est juste une version plus simple du swing, où l'épée a un angle de départ différent. N'est-ce pas vrai? Semble assez simple pour moi. Où es-tu resté?
dimitris93

Le problème est-il l'épée et le héros qui se chevauchent? peut-être qu'un petit corps carré pourrait être la pointe de l'épée afin qu'il ne se chevauche jamais. peut-être éditer pour plus d'informations
drumbumLOLcatz

@Shiro J'ai inclus mes tentatives en bas. En ce moment, je suis bloqué parce que je ne sais pas comment démarrer et arrêter la rotation en une seule touche.
quidproquo

Oui, il semble que votre vraie question est de savoir comment faire pivoter un objet en appuyant sur une touche
dimitris93

Réponses:


1

Soit dit en passant, j'ai fait exactement ce que vous essayez de faire. Le seul hic, c'est que j'utilisais Jbox2d donc le code est en Java, mais vous devriez quand même pouvoir le comprendre si vous utilisez C ++

Vous avez essentiellement besoin d'utiliser des articulations / moteurs et toutes ces choses amusantes si vous voulez faire une action de swing. Voici un extrait de ce à quoi ressemble mon code basé sur l'entrée clé:

    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;

    }

Et puis en ce qui concerne la construction des armes et ainsi de suite, l'extrait de code ressemble à ceci.

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

Je me rends compte qu'il se passe beaucoup de choses ici, mais c'est probablement plus facile si vous me demandez simplement sur quoi vous avez besoin de clarté et je l'explique. Si vous n'avez jamais utilisé aucune de ces choses, vous devrez probablement faire une bonne lecture.

MODIFIER >>

Réalisez, Box2d a toute la détection de collision et la physique intégrées dans ses bibliothèques. Croyez-moi quand je dis, il est plus facile de comprendre leur système que d'essayer de faire les choses à partir de zéro. Si vous voulez une collision, vous utilisez des fixations de corps, si vous voulez qu'ils tournent ou se déplacent, vous utilisez des joints. Cela peut sembler un peu plus compliqué au début, mais au final cela vous fait gagner infiniment plus de temps pour utiliser leurs méthodes.

En fait, je dirais que vous ne terminerez probablement jamais si vous essayez de faire les choses à partir de zéro, en supposant que vous créez un jeu de physique. Parce que le calcul de choses comme le frottement, la flottabilité et sans parler de la détection / efficace / collision va vous prendre toute une vie.


0

J'ai trouvé une sorte de solution de contournement, mais je ne suis pas sûr que ce soit un bon moyen de coder.

Lorsqu'une touche est enfoncée, je règle la vitesse angulaire sur 10 puis à chaque mise à jour, je lui demande de vérifier

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

À l'intérieur, if(weapon.getAngle() <= 0)vous devez également le placer manuellement à l'angle spécifique que vous souhaitez, sinon ce ne sera pas précis et vous aurez besoin d'une if-elsedéclaration à la place if-if. Cela revient au codage Java de base, pas vraiment à voir avec un problème spécifique au jeu.
dimitris93

0

D'après ce que vous dites, il semble que vous pourriez également avoir à déplacer simplement le code qui réinitialise la vitesse angulaire après qu'un certain angle est atteint. Je soupçonne que ce code n'est utilisé que lorsque le bouton est enfoncé, car vous dites qu'en appuyant une deuxième fois sur le bouton, le mouvement s'arrête (et fait donc fonctionner le code de test).

Si tel est le cas, vous pouvez le déplacer vers une instruction 'else' après le code qui teste si la touche est enfoncée.


0

Une chose que vous pourriez faire est sur commande, exécutez une méthode qui créerait un corps par rapport à la position du corps principal en utilisant body.getPosition.set (); définissez les bits de filtre pour ne pas entrer en collision, puis définissez la vitesse linéaire ou appliquez la force, tout ce que vous voulez faire avancer après avoir démarré une minuterie pour la détruire après x quantité de boucles de jeu

Ou vous pouvez faire la même chose, mais à la place, créer une articulation à distance combinée à une articulation prismatique uniquement le long de l'axe des x pour effectuer un mouvement de poussée soudaine avec une collision connectée pour être fausse afin qu'elle n'entre pas en collision avec le corps principal, cette option serait fonctionnent probablement mieux,

pour une attaque de swing, créez un corps similaire tourné de la moitié de pi avec seulement la pointe de l'épée connectée au corps principal avec collision connectée à un faux égal bien sûr, alors vous pouvez appliquer une force motrice sur l'articulation une impulsion angulaire sur le corps de l'épée le détruire après une rotation définie du corps ou après un certain temps,

si une assistance supplémentaire est nécessaire, il suffit de commenter ci-dessous

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.