Stage 4, un petit bout de code devient grand (Partie 1)

On approche doucement du scope fixé pour en finir avec la beta. Tout de même, Super Tilt Bro v1.0, ça enverrait ! Il reste quelques petites choses à faire : améliorer quelques animations, rééquilibrer quelques mécaniques et faire une quatrième arène... Sans spoiler, cette dernière arène va s'avérer être un mini projet à part entière, les congés du mois de mai ne seront pas du luxe.

L'idée de départ est simple. Il existe une arène avec des plateformes mouvantes, mais cette arène est volontairement difficile, il s'agit de réussir à rester en équilibre au-dessus du vide. Du coup, les joueurs occasionnels l'évitent, se privant de plateformes mouvantes. Faisons une arène plus simple avec des plateformes mouvantes. Ce sera juste un nouvel arrangement de plateformes, réutilisant du code existant, tout se passera bien.

Quelques minutes passées sur Super Smash Bros sont suffisantes pour trouver un arrangement sympa à jouer. Il s'agit de l'arène Mute City de Super Smash Bros 4. Il dispose d'une plateforme principale plus petite que d'habitude et de deux plateformes mouvantes qui ajoutent de la largeur à l'arène. Il n'y a plus qu'à tenter de reproduire cette idée dans Super Tilt Bro. En plus, ça va aller vite, je dispose d'un merveilleux script qui prend du JSON en entrée et écrit l'assembleur tout seul.

MBvmSf6.png
De gauche à droite :
The Pit : l'arène qui fait peur !
Mute City : le pod en bas sert de plateforme stable, les plateformes mouvantes suivent les virages
Le script : à partir de la description des plateformes, il génère l'assembleur d'une arène

Le format JSON des arènes de Super Tilt Bro est simple, mais l'écrire à la main reste désagréable. (C'est là que tout commence à barrer en c*uilles.) C'est l'occasion idéale pour améliorer mes outils. Tiled étant la référence open source, aucune question à se poser, la première étape est de définir comment organiser les informations. Après quelques tâtonnements, l'organisation suivante est arrêtée:

Les emplacements spéciaux (comme les points de spawn) sont placés dans un calque d'objets nommé "spots". Les plateformes sont placées dans un calque d'objets nommé "platforms" et peuvent être de type "hard" (on ne peut pas passer au travers) ou "smooth" (on peut passer au travers). Les éléments esthétiques sont des images alignées sur la grille. Enfin, tout calque inconnu est ignoré, ce qui est pratique pour dessiner le résultat final même si le moteur n'en a pas besoin.

1FMfd9z.png
L'arène dans Tiled, les décors gris sont ignorés, les scripts les recalculeront.

Comme Tiled permet d'exporter ses cartes en JSON (et que j'adore le JSON), il y a juste à faire un nouveau script pour convertir les fichiers exportés par Tiled en fichier d'arène pour Super Tilt Bro. Le processus est donc: Dessiner la carte dans Tiled, lancer plein de scripts et pouf on obtient une ROM.

Hcw7BI5.png
Le résultat de tous ces scripts, une nouvelle arène \o/

C'est magique, c'est facile, ça va super vite... Et ça m'a pris la journée de coder tous ces outils.

Il n'y a plus qu'à ajouter les plateformes mouvantes, avec du code déjà prêt. Ça va être vite-fait... Non ?
avatar
Stage 4, un petit bout de code devient grand (Partie 2)

Changement d'idée ! Les plateformes mouvantes c'est du déjà-vu. Pour ce niveau il faut un bonus apparaissant régulièrement, flottant au-dessus des joueurs, celui qui arrive à le casser gagne des super-pouvoirs.

qptX2as.gif
The Hunt : quatre jours de code, et encore un niveau dont je suis fier !

Voyez comme les mouvements de l'orbe sont souples. On est loin de "un mouvement sinusoïdal ça semble vivant". Pour obtenir cet effet, on utilise une autre de mes techniques favorites : les steering behaviours. Aucune idée de comment ça se traduit, appelons les simplement steering behaviours.

Les steering behaviours nous viennent principalement des recherches sur l'IA. Ils permettent de déplacer des objets de façon naturelle tout en visant certains objectifs. Comme un orbe qui voudrait se positionner entre deux joueurs sans passer trop prêt de chacun d'eux.

Une fois par frame, on calcule le vecteur de déplacement idéal de l'objet pour chaque objectif, puis on additionne tous ces vecteurs à la vélocité de l'objet. Ça nous donne une nouvelle vélocité qui respecte au mieux chaque objectif en prenant en compte l'inertie de l'objet.

kYQn9H7.gif
Steering behaviours : le vecteur du succès !

Ce qui est génial avec ce système c'est qu'on obtient un mouvement fluide, et surtout qu'on peut penser chaque objectif séparément. On peut créer des comportements particulièrement complexes en implémentant trois ou quatre fonctions super simples. Enfin, comme chaque comportement est indépendant, il est facile d'en ajouter ou d'en supprimer pour essayer différentes combinaisons. L'exemple illustré est ce que j'avais en tête en commençant, puis j'ai remarqué que c'était plus sympa de ne pas fuir les joueurs, mais juste d'essayer de se placer au-dessus d'eux, un changement très simple.

Voilà, bilan la nouvelle arène est prête et m'aura coûté mes vacances. Si vous pouviez y jeter un œil et me remonter vos remarques/bugs avant la prochaine release, je vous en serais éternellement reconnaissant. Les points à avoir à l'œil sont : la fréquence d'apparition de l'orbe, la puissance du buff, le mouvement de l'orbe (est-ce amusant d'essayer de l'atteindre ?). Voici une ROM de test : http://blabla.wontfix.it/Super_Tilt_Bro_Playtest(E).nes
avatar
Merci pour les explications des steering behaviours !
Très intéressant et bien illustré.
Faut que je teste tout ça asap smile
avatar@originalfei
In pixels we trust.
ORE WO DARE DA TO OMOTTE YAGARU !