Myrne 6312

Un shooter en vue du haut et en coop, développé en 72h dans le cadre du 26e Ludum Dare

Song of the Myrne: What Lies Beneath

Un action-RPG en pixel-art

vendredi 31 mars 2017

Game design: Donner du punch à vos attaques


Salut les lecteurs (et les autres aussi) !

Aujourd'hui on va parler un peu de game design et si vous savez lire un titre, vous devez déjà savoir qu'on parlera plus précisément d'attaques. Pour une fois, je ne vais pas parler spécifiquement d'Unity, j'estime que ces conseils peuvent s'adapter partout (peut-être même en animation également, pas seulement en game design).

Concrètement, je vais essayer de vous expliquer comment donner de l'impact, du punch, de la juiciness... appelez ça comme vous voulez, aux attaques de corps à corps de vos personnages.

En gros, je vais tenter de vous expliquer ce qui fait la différence entre Dark Souls et Minecraft quand il s'agit des combats. Je suis en train de pas mal bosser sur toutes ces petites choses qui font que le personnage soit "ancré" dans l'univers, qu'il ait un poids quand il marche (au lieu de donner l'impression de flotter au ras du sol) et que lorsqu'il donne un gros coup de hache, qu'on sente le poids et l'inertie de l'arme.

Etape 0: L'observation



Ça c'est un bon conseil pour tout le processus de création de jeux en général: regarder comment les autres font.

Oui, super, merci Sherlock, et continue bien de nous faire croire que tu bosses quand tu est en train de jouer, aussi !

Tss tss tss... L'idée c'est, quand on joue à un bon jeu, d'observer comment les mecs ont fait et pourquoi (précisément) le jeu est si bien. Pas juste en se disant "ah bah leur combat est bien fluide et y'a de l'impact" mais en regardant vraiment pourquoi c'est fluide et impact...ant... En gros, passer d'une attitude passive ("je constate que c'est bien fait") à une attitude active ("quels éléments précis font que c'est bien fait ?").

Bon, voyons comment marche une attaque concrètement.

Etape 1: Diviser pour mieux régner



Une attaque ?! Facile ! Je fais un clic souris, le perso fait un mouvement avec l'arme puis l’ennemi prend le coup !

Faux.

Cette manière de voir l'attaque va vous mener directement à la méthode Minecraft (je précise que j'adore ce jeu bourré de qualités, hein, n'allez pas tirer des conclusions parce que je le prend pour exemple sur un truc qu'il fait moins bien que Dark Souls :D), ou à la méthode que j'utilisais jusqu'ici dans Myrne: The Quest (que je suis donc occupé à améliorer).

A savoir, la méthode du : Une attaque = une animation

Si on veut un truc qui ait un peu de la gueule, on va séparer notre action en plusieurs sous-actions (et au passage on devra sans doute la diviser en plusieurs animations, désolé :D).

Concrètement, une attaque c'est quoi ? Je la vois en 3 ou 4 parties (après ça peut se discuter, ça dépend de la précision et de la complexité que vous souhaitez avoir pour votre attaque). On va leur donner des noms qui claquent ;)

  • La préparation
  • L'exécution
  • La résolution
  • Le retour

Chacune de ses parties va avoir un rôle bien différent dans l'action, et le fait de bien séparer chacune de ces parties dans notre code va nous donner un contrôle énorme sur tout ce qui va se passer avant, pendant et après l'attaque, ce qui serait plus difficile, voir impossible avec une attaque faites en une seule animation/état.

On va passer chacune de ces actions en revue.

La préparation



Peu importe avec quoi on décide de frapper un truc, on va, dans un premier temps, préparer notre coup pour maximiser la force qu'on met dedans. Si on souhaite donner un coup de hache, on va lever cette hache bien haut, pour une attaque à la lance, on va d'abord la reculer, pareil pour un coup de poing, on va tirer notre poing en arrière.



Heu, oui, on s'en fout, non ?

Nope. L'avantage d'avoir séparé ça du reste de l'attaque (et donc éventuellement d'en avoir fait une animation à part) va nous permettre 2-3 trucs sympas.

La première chose c'est d'éventuellement accélérer ou ralentir cette phase en fonction de l'arme. Ça donne du poids à l'objet (c'est super important). Imaginons une attaque à l'arme contondante genre marteau ou massue. Personnellement, pour Myrne: The Quest j'utilise une animation par type d'armes (contondante, lames, perforantes,...) et en principe il n'y a aucun soucis à ça. Mais est-ce que vous ne pensez pas qu'il y a une différence entre manier ça

Petit marteau de guerre



et ça ?

Très gros marteau de guerre

Ah zut, donc il faut deux animations différentes rien que pour la préparation ?

Non. Ce qu'on peut faire c'est utiliser la même animation, mais en variant sa vitesse, donc en rendant la deuxième plus lente à lever au-dessus de notre tête. L'arme aura tout de suite plus de poids, ce sera plus réaliste et en plus ça ralentira la vitesse d'attaque avec cette arme, ce qui a du sens.

Le deuxième truc qu'on peut faire à cette phase, c'est s'arrêter à cette étape, attendre pour charger une attaque plus puissante par exemple. Je m'attarde pas trop sur ce point car on est un peu en dehors de l'ajout de punch/juiciness. Mais voilà, si vous voulez un gameplay où on peut charger les coups pour faire plus de dégâts, le découpage de votre attaque sera nécessaire.

Idem pour la troisième possibilité, c'est qu'on peut par exemple, comme dans Chivalry, annuler l'attaque durant cette phase (après c'est un peu tard vu que l'arme sera emportée par la force du coup et difficilement arrêtable).

L'exécution et la résolution



Voilà, le coup part pour de vrai !

Pas grand chose à dire sur l'exécution, concrètement c'est le moment où l'arme passe d'une vitesse nulle à sa vitesse maximale (le marteau tombe, la lance est propulsée vers l'avant,...). Générallement on va ajouter quelques effets ici pour donner de la présence à l'arme. Je m'étend pas dessus car c'est ce que vous faites rpobablement avec vos attaques en une seule animation: un son "woosh", un petit effet visuel de déformation de l'air,...

Là où les choses deviennent très intéressantes c'est lors de la résolution. C'est ici que le coup prend effet. On a touché quelque chose ? Si oui, quoi ? Et il se passe quoi ?

C'est ici qu'on va vraiment pouvoir ajouter autant de complexité qu'on veut. Si vous visez la qualité Dark Souls, Vermintide ou Chivalry, vous allez vous amusez. Il y a un million de trucs à faire, à voir ce qu'on a le temps (et l'énergie) de faire ou non.

La bonne nouvelle c'est qu'en divisant notre action en différentes parties, on s'est donné la possibilité d'implémenter des trucs petits à petits. Chaque détail que vous ajouterez améliorera la qualité de votre attaque, mais si vous ne faites pas un truc, ce sera facile de revenir l'implémenter par la suite, là où avec une animation unique d'attaque, venir ajouter de la complexité nous forcerait à refaire toute l'animation.

Oui bon, on a compris. On peut faire quoi alors ici ?

On peut déjà commencer par regarder si on a touché ou non un truc avec notre attaque :


  • J'ai raté mon attaque !
Pas de chance... Mais c'est intéressant parce que notre arme ne va pas se comporter de la même manière que si on avait touché un truc. Elle va en fait probablement se comporter comme elle l'aurait fait si on l'avait créée en une seule animation. Elle continue son mouvement jusqu'à la fin de l'animation.
  • Ah non, c'est bon, j'avais touché un truc en fait !
Ah bah super ! Si c'est un ennemi, il émet un cri de douleur (si c'est un rat il couine, un paysan poussera un grognement,...), l'arme fait aussi un bruit (*pof* pour un marteau, bruit de coupure pour une épée,...), du sang gicle,...

Ce qu'on a touché n'était pas vivant ? C'est l'occasion d'ajouter du réalisme, et surtout de montrer que l'arme existe vraiment dans le jeu ! Elle va faire *toc* contre une surface de bois, et à la place de la giclée de sang, on peut utiliser un système de particules pour qu'il y ait des éclats de bois. On peut même ajouter un décal (une texture) sur l'objet pour montrer que notre arme l'a abîmé (trace de coupure, de coups,...).

A noter qu'on peut aussi s'adapter au point touché sur l'ennemi, ok, on l'a touché, mais où ? Dans la tête (Vermintide rend très bien l'effet *sprotch* d'un coup de marteau de guerre sur une tête d'homme-rat) ? Sur l'épaulière en cuir (*pof*) ? Sur son casque métallique (*cling*). Les possibilités sont quasiment infinies.

Et en ce qui concerne le fait d'avoir heurté un truc avec notre arme, c'est important de noter qu'on a... ben... heurté un truc avec notre arme !

Alors je sais pas chez vous, mais perso moi quand je frappe un outil contre une surface, l'outil s'arrête ;)

Et ça c'est super important ! Si votre système d'animations vous le permet (ce qui n'est malheureusement pas le cas du mien, je suis pas super doué en anim^^'), ça peut être super d'arrêter l'animation (enfin, la partie "résolution" de votre anim) ici. Ça va ajouter de l'impact au coup.

Puisque je ne fais pas ça, à la place je vais attendre la fin de mon anim et laisser l'arme figée en position de fin (hache vers le bas, lance vers l'avant,...) quelques instants avant de passer à la phase suivante. Ça marche aussi. L'idée c'est de vraiment montrer que vous avez donné un coup avec une hache, le corps prend un moment pour se ré-équilibrer, la hache reste plantée un moment dans l'objet,...

Je ne sais pas encore si je vais laisser l'arrêt quand on ne touche rien, probablement pas

Et voilà. Je pense que c'est tout pour cette partie.

Le retour


Comme son nom l'indique, cette dernière étape est le retour à l'état initial de l'arme. On a donné notre coup de hache, qui est maintenant tournée vers le sol. On va simplement la remonter pour pouvoir recommencer le cycle lors d'une prochaine attaque ;)

Comme pour "la préparation", on pourrait ralentir ou accélérer l'animation selon le poids de l'arme et le résultat (résolution) de l'attaque. Relever une petite hache à une main qui a raté son coup ira vite, déplanter une lance du corps d'un ennemi beaucoup moins.

Ah mais c'est fini, alors ! Cool !

En fait ça dépend du niveau de complexité voulue et de comment s'est terminé votre phase de résolution. C'est tout à fait possible de juste remonter notre hache et pas trop s'embêter avec des détails.

Mais laissez-moi vous parler de l'équilibre du personnage, juste au cas où vous voulez le top du top niveau qualité.

Ici les choses deviennent un peu plus compliquées/complexes parce qu'on va toucher au gameplay et qu'on va ajouter des animations en plus, je ne vous en voudrai pas si vous évitez de toucher à ça dans un premier temps (n'oubliez pas, on peut toujours repasser dans un an pour mettre le jeu à jour, quand on a un peu plus de temps pour les détails^^).

Il y a certaines actions dans une attaque qui vont déséquilibrer le mec qui porte le coup. Je pense à deux cas en particulier :
  • Frapper un mur (ou un mec en armure de plates avec un bâton en bois, par exemple)
L'arme va rebondir et probablement déséquilibrer le personnage vers l'arrière. C'est ce qu'il se passe dans Dark Souls par exemple et bien adapter son arme à l'endroit où on combat fait partie intégrante du gameplay (agitez une épée dans un couloir étroit c'est pas le top). Concrètement on part sur une animation de déséquilibre et sur un petit temps pendant lequel notre perso ne pourra rien faire le temps de retrouver l'équilibre...
  • Frapper dans le vide
Un peu pareil sauf qu'on va plutôt trébucher vers l'avant. L'animation sera différente et si vous décidez de mettre un temps de "ré-équilibre" pendant lequel le perso ne peut plus faire d'action, c'est une bonne idée de prendre en compte le poids de l'arme (frapper dans le vide avec une claymore ou avec une dague, ça n'a pas le même effet).

Ce genre d'animation est assez complexe à la troisième personne je pense (surtout pour ne pas traverser le mur^^). En vue première personne il s'agit simplement de "pousser" l'arme en arrière/avant et éventuellement relever/baisser la caméra.


Et je pense que c'est à peu près tout pour "le retour". Notez qu'en arrivant à ce stade et en ayant tout fait, on a plus besoin de coder de cooldown (temps d'attente avant de pouvoir attaquer de nouveau) arbitraire à nos attaques, on a eu des temps d'attentes un peu partout en fonction du résultat de l'attaque et au final le cooldown correspondra vraiment à la physique de l'objet et de l'attaque.

On conclusionne ?

Conclusion


Comme je vous ai dis, je pense qu'il n'y a pas vraiment de limites à ce qu'on peut faire, si ce n'est le temps et la complexité voulue.

Mais ce qu'il est important de noter c'est que rien de tout ça n'est compliqué en soi !

On peut vite se laisser impressionné par des jeux comme Dark Souls, Vermintide ou Chivalry (à juste titre, ces jeux ont vraiment un système de melee remarquable) mais ce qu'il ne faut pas faire c'est se heurter au mur du "pfouu, c'est trop dur et les mecs sont 50 pour faire ces jeux, moi je suis juste un petit indé".

Quand on prend le temps de vraiment regarder dans le détail ce qui constitue ces jeux et leur système de combat, on se rend compte que c'est tout un ensemble de petits trucs qu'il est très simple d'implémenter dans nos petits projets indés.

Alors oui, vos animations ne seront peut-être pas aussi fluides que celles de Dark Souls, vos coups de marteau aussi satisfaisants que ceux de Vermintide, mais rappelez-vous qu'entre ces jeux et Minecraft, il y a tout un monde et qu'on est pas soit d'un côté soit de l'autre, il y a tout un milieu. Je ne veux plus voir d'animation d'attaque consistant en un bras qui fait une rotation de 90 degrés :)





jeudi 2 mars 2017

Blender: Trucs et astuces divers


Salut les lecteurs !

Ça faisait longtemps que je n'avais plus posté de tutos sur ce blog... et ça ne va pas changer vu que ce que je vous propose aujourd'hui n'est pas vraiment un tutorial mais plutôt deux trois trucs que j'utilise souvent et qu'on ne retrouve pas vraiment dans les tutos pour débutant (je crois?^^).

Quand je met quelque chose comme ça Ctrl-Tabulation/Faces, ça signifie qu'il faut appuyer sur une combinaison de touche ou une touche puis sélectionner une option dans le menu déroulant qui devrait apparaître.

Allez, c'est part~

Hey, attends ! Ça demande quoi comme connaissances de Blender ?!

Ben, je vais pas vous apprendre la base, je part du principe que vous savez faire un modèle basique, "extruder" des faces, connaitre la différence entre le mode édition et le mode objet, savoir faire un Loop Subdivide (le truc avec ctrl-r), savoir ce qu'est un mesh, un material,... la base.

Cela dit les pros ou les habitués ou les gens qui n'ont pas appris à l'arrache comme moi rouleront sans doute des yeux devant ces conseils qui leur sembleront probablement évidents^^

Cette fois on se lance !

Dupliquer un objet... mais lier son mesh et son material


On commence par un truc tout simple. J'utilise Blender sérieusement depuis environ 2 ans, et j'ai appris ça aujourd'hui, la vie est dure :'(

Lorsqu'on duplique quelque chose en mode objet, plutôt que d'utiliser Shift-D pour une simple copie, on peut utiliser Alt-D et faire une copie liée.

L’intérêt est que lorsque vous modifier le mesh (en mode édition) de l'objet (ou les objets) copié ou bien le mesh de l'objet de base, les deux (3, 4, 5...) objets sont modifiés de la même manière. Un peu comme le font les Prefabs sous Unity3D.

Cela permet par exemple d'éditer les 22 murs constituants votre muraille en un seul coup ;)

Supprimer les faces inutiles


Si vous n'êtes pas au courant, je développe des jeux-vidéos. Une des grosses différences entre la 3D pour jeu-vidéo et la 3D cinéma/image, c'est qu'on est très attentif à ne pas laisser de polygones inutiles dans nos modèles qui utiliseraient des capacités de la carte graphique pour rien.

Un truc qui arrive souvent, c'est que j'ai des faces inutiles qui se retrouvent à l'intérieur d'un modèle. Par exemple la face tout en bas d'un mât que j'aurais planté dans mon bateau pirate, puisque la face est sous le pont, elle ne sert à rien. C'est facile de la sélectionner et la supprimer, mais parfois quand j'ai travaillé comme un porc (genre pour tout ce qui est bâtiment :D), il y en a plein, et je risque de supprimer une face utile (qu'on voit à l'extérieur du modèle) par accident.

Cette face est dans un cube, elle ne sera jamais visible en jeu

Bref, il y a une technique toute bête pour sélectionnez toutes ces faces inutiles assez facilement.

Mettez vous en mode édition et veillez à ce que rien ne soit déjà sélectionné. Passez en mode d'édition de faces (avec Ctrl-Tabulation) puis appuyez sur C pour sélectionner l'outil de sélection. C'est un cercle dont la taille est réglable avec la molette de la souris. Réglez-le pour qu'il soit assez très grand.

Commencez à tout sélectionner (en mode solide, pas en wireframe) sur votre modèle grâce à cet outil. Pas de panique si vous devez (et vous devrez) changer de vue, vous pouvez terminer la sélection en ré-appuyant sur C, bouger la vue puis remettre le mode de sélection sans perdre votre sélection. Passez bien partout, on a vite fait d'oublier une petite face par-ci par-là à cause d'un mauvais angle de vue.

Une fois terminé, désactivez l'outil de sélection C puis faites Ctrl-i pour inverser la sélection. Normalement, vous vous retrouvez avec toutes vos faces internes sélectionnées. Vérifiez bien qu'aucune face sélectionnée n'est visible de l'extérieur (aucun soucis si un des edge l'est) puis faites Delete/Faces.

Quand vous avez fini (ou avant même), c'est souvent une bonne idée quand on "nettoie" un modèle de faire un petit "Ctrl-V/Remove doubles" pour fusionner les vertex qui se chevaucheraient.

Insert face, pour créer une face dans une face


Déjà eu envie de faire quelque chose comme ça ?


Découper un carré dans une face carrée, un triangle dans une face triangle, etc...
C'est un peu de la base aussi mais j'ai utilisé Blender pas mal de temps sans le savoir. Il suffit de sélectionner la face dans laquelle on veut insérer notre nouvelle face et appuyer sur la touche 'i'. Bougez la souris pour régler la taille puis validez par un clic.

Appuyez une seconde fois sur "i" pendant le choix de la taille si vous voulez faire ça sur plusieurs faces à la fois (après avoir sélectionné les faces bien entendu).



Créer des groupes de vertex


En général, dans le jeu-vidéo, on souhaite n'avoir idéalement qu'un seul mesh, un seul objet, par fichier blender. Autrement dit, si je crée un chat, je préfère n'avoir qu'un objet chat plutôt qu'avoir un objet tête, un objet oreille_droite, etc...

Je fusionne donc mes objets mais que se passe-t-il ensuite si en travaillant sur ce chat, je souhaite ne sélectionner que la tête... Je vais m'amuser à chaque fois à sélectionner toutes les faces de la tête, en faisant gaffe de ne pas sélectionner de faces du corps ? Non.

A la place je peux créer des groupes de vertex. Ce qui se passe ici :


L'idée c'est que je vais créer un nouveau groupe, avec l'icone "+". Je peux double-cliquer sur le groupe qui vient d'être créé afin de lui donner un nom explicite, comme "tête".

Ensuite (ou avant, on est pas sectaire), je sélectionne toutes les faces de la tête de mon chat, puis dans Vertex Groups, je fais "Assign". Verrouiller le groupe avec le cadenas est une bonne idée pour éviter de modifier le groupe par accident.

A partir de maintenant je peux grâce au bouton "Select" ajouter la tête de mon chat à ma sélection à tout moment, sans galère^^

Conclusion


Et voilà, c'est tout pour aujourd'hui. C'est pas grand chose mais ça m'aurait fait gagner beaucoup de temps si j'avais su ça dès le début.

J'espère que ces astuces vous aideront et que vous ne venez pas de perdre 10 minutes de votre vie à me lire :)