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.
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.
Réponses:
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é:
Et puis en ce qui concerne la construction des armes et ainsi de suite, l'extrait de code ressemble à ceci.
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.
la source
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
la source
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'uneif-else
déclaration à la placeif-if
. Cela revient au codage Java de base, pas vraiment à voir avec un problème spécifique au jeu.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.
la source
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
la source