Le développeur du jeu VVVVVV en l'honneur de sa décennie a rendu le code source ouvert


Aujourd'hui, c'est le 10e anniversaire de la sortie de VVVVVV!

Bien que, peut-être, demain, à proprement parler, le jeu soit devenu disponible à 3 heures du matin le 11 janvier 2010, après une très longue journée à éliminer tous les bugs que j'ai trouvés, à créer des assemblages de dernière minute et à essayer de tout télécharger lentement sur le serveur via un Internet extrêmement peu fiable. un composé qui se cassait constamment. Mais je vis toujours avec la devise " demain, il n'est pas venu jusqu'à ce que vous vous réveilliez ", donc je considère la vraie date de sortie le 10 janvier <3

Oh mon dieu, dix ans.

VVVVVV était un jeu tellement important pour moi que je ne sais même pas par où commencer. Je voulais marquer cette date d'une manière spéciale, alors aujourd'hui je dévoile le code source du jeu!

[Code source VVVVVV sur github]

Le référentiel contient deux versions - celle de bureau , portée par Simon Roth vers C ++ en 2011 , et la dernière, qui a été mise à jour et prise en charge par Ethan Lee , ainsi que la version mobile écrite en Actionscript pour Adobe AIR, basée sur la version flash originale du jeu v1.0 .

Je tiens à remercier beaucoup Ethan Lee , qui m'a beaucoup aidé, notamment en préparant le référentiel pour la communauté et en organisant l'annonce de cela sur AGDQ (bonjour, speed runners!)! Merci Ethan!


Un bref aperçu du code source


Ici, il sera logique de poser la question: "Qu'est-ce qui est intéressant dans le code source VVVVVV?" .

Je pense que même un rapide coup d'œil au code source, on comprend vite que techniquement le jeu VVVVVV n'est pas très bien pensé! Même selon les normes des développeurs autodidactes indépendants, le code est assez chaotique.

Notes / explications potentiellement intéressantes sur la raison pour laquelle tout est exactement comme il est:

  • La version C ++ a un tas de choses étranges qui ne deviennent logiques que si vous vous souvenez que le jeu a d'abord été créé sur un flash puis porté directement avec tous ses défauts. Par exemple, ma pire habitude de programmation est probablement de déclarer des variables temporaires comme i, j et k en tant que membres de chaque classe afin qu'elles n'aient pas à être déclarées à l'intérieur des fonctions (ce qui est ennuyeux pour une raison ennuyeuse). Cela a conduit à l'apparition de plusieurs insectes méchants et difficiles à attraper, pour le moins. En particulier, certaines fonctions de calcul des collisions d'entités ont une variable commune i . Par conséquent, des boucles infinies sont possibles.
  • Si vous recherchez des textes de jeu, la plupart (mais pas tous) se trouvent dans les classes Scripts.cpp et TerminalScripts.cpp . En substance, ces fonctions chargent les données dans un analyseur de script très simple qui contrôle la logique de la cinématique. Un fait amusant: il y a de nombreuses années, les moddeurs ont procédé à une ingénierie inverse de ce " script interne " pour faire des choses incroyables avec des niveaux faits maison, dont je ne pouvais même pas imaginer l'existence.
  • À un moment donné du processus de développement, j'ai décidé que diviser le code en entrée, logique et rendu était une bonne habitude, et je l'ai pris à cœur. La partie principale du code critique du jeu est dans trois fichiers - input.ccp , logic.cpp et incorrectement nommé titlerender.cpp . Chaque état du jeu est regroupé dans ces trois fichiers sous des noms de fonction tels que teleporterrender et towerlogic . Il y a un tas de copier-coller.
  • Tous les niveaux sont codés en dur dans les énormes tableaux générés dans mon propre éditeur de fichiers, qui exporte les niveaux vers le code source à partir duquel je peux lire. C'est ainsi que j'ai travaillé lors de la création d'un jeu flash en 2009 - l'accès aux ressources de données externes était une tâche difficile, donc à l'époque il était plus logique de les compiler dans le jeu lui-même. Tous les fichiers vraiment volumineux (par exemple Spacestation2.cpp, Finalclass.cpp et ainsi de suite) ont été créés de cette manière. Pour être complet, j'ai téléchargé le code de l'éditeur ici , mais pour être honnête, il n'est pas particulièrement applicable maintenant (il nécessite la compilation d'Allegro et Mingw). Pour changer le schéma des derniers niveaux, j'ai écrit un outil similaire!
  • Quand j'ai écrit le code, je ne comprenais pas vraiment comment fonctionnaient les classes statiques et pourquoi leur utilisation était une bonne idée. Il semble que j'ai lu quelque part que les classes statiques et les variables globales sont MAUVAISES en flash, j'ai donc essayé de les éviter complètement. Quel est le résultat? Littéralement, chaque fonction du jeu passe les arguments suivants: «Graphiques et dwgfx, Jeu et jeu, mapclass et map, entityclass et obj, UtilityClass et aide» .
  • En fait, il n'y a pas d'objets temporaires dans VVVVVV, et lors de la première initialisation du jeu, il remplit tous ses tableaux d'entités (et la plupart des autres tableaux de données) avec des centaines d'entités vides. Il le fait parce que j'ai lu quelque part que la suppression d'objets en un éclair provoque un freinage étrange, car le garbage collector entre et ralentit tout, et cela est dans une certaine mesure vrai. J'ai continué à adhérer à cette étrange habitude dans de nouveaux projets jusqu'à récemment - dans Dicey Dungeons, je l'ai finalement abandonnée.
  • Et encore une chose: avec l'analyseur de la cinématique, j'avais une autre façon de contrôler la logique du jeu pendant le passage - une machine monolithique à états finis, qui à la fin du projet était complètement hors de contrôle! Il peut être trouvé dans Game :: updatestate , et je recommande de le lire, même si vous ne voulez pas lire d'autre code. Il gère des aspects tels que le déclenchement du démarrage de cinématiques complexes, les points auxquels les téléporteurs envoient des téléports, les minutages d'animation de fin de niveau et bien d'autres choses que je voulais intégrer rapidement dans le jeu. Les états sont numérotés et le plus grand est 4099 (il y a des nombres inutilisés). Lors du développement du jeu, il y avait un bloc-notes à côté de moi, dans lequel les chiffres les plus importants étaient écrits: le numéro 1000 a commencé la sélection du "bijou brillant", le numéro 3040 a commencé l'achèvement d'un niveau particulier, le numéro 3500 a commencé la fin du jeu. Ce système stupide a provoqué un formidable jeu de speedran en 50,2 secondes dans la catégorie tout% .

Vous ne savez pas quoi dire à ce sujet? J'étais jeune et c'était plus intéressant pour moi de créer quelque chose à l'écran que de l'implémenter correctement. Probablement le meilleur du code source VVVVVV - il est devenu une preuve que vous pouvez créer quelque chose vous-même, même si vous n'êtes pas un très bon programmeur.

En regardant en arrière après toutes ces années, je trouve très drôle que la plupart du temps, il s'agissait de plusieurs copier-coller des mêmes parties avec des valeurs modifiées. Pour cette raison, dix ans plus tard, le code est presque impossible à maintenir, mais pendant que j'étais dans son épaisseur, j'ai pu effectuer des itérations très rapides et ajouter de nouveaux éléments. Au cours de la dernière décennie, j'ai développé de meilleures habitudes et j'ai certainement beaucoup grandi en tant que programmeur, mais il semble maintenant que je travaille plus lentement à cause de cela.


Fête surprise d'anniversaire!


Alors que je me préparais à publier l'article, Sergio Kornaga a annoncé un jam de jeu en l'honneur de la décennie de VVVVVV!

10e anniversaire de VVVVVV eVVVVVVent!

Je suis tellement heureux de cela, haha, et j'adore le site glorieux épaves de train, qui contenait régulièrement des jams Klik du mois, auxquels j'ai constamment participé à l'époque du développement de VVVVVV. Il semble parfait pour cette confiture!

Je suis vraiment impatient de voir après la fin du jam ce que les gens trouveront, et j'écrirai un gros post sur mon blog résumant dans le style des anciens posts sur les niveaux d'utilisateurs VVVVVV que j'ai écrit une fois <3

Avant même de publier le code source du jeu, j'ai ouvert un accès gratuit aux outils pour créer et compléter les niveaux VVVVVV dans la version 2014 de Make and Play ! Vous pouvez le télécharger ici! Si vous souhaitez créer des niveaux dans l'éditeur VVVVVV, vous pouvez commencer par ce sujet ! Bonne chance



Un peu de sentimentalité


J'ai déjà parlé de la façon dont VVVVVV évoque en moi - peu de temps avant le premier anniversaire, j'ai écrit ce que j'ai vécu lorsque le jeu est sorti et comment son succès a changé ma vie . À l'occasion du cinquième anniversaire, j'ai écrit que VVVVVV me semblait être un projet qui ne se produit qu'une fois dans sa vie , et que rien ne s'en est approché ni avant ni après.

Dix ans plus tard, je ressens toujours la même chose. Je suis incroyablement fier VVVVVV et reconnaissant pour tout. Je tiens à remercier tous ceux qui m'ont aidé sur mon chemin - Magnus pour son incroyable bande sonore, Ethan et Simon pour tout leur travail qui a rendu le jeu accessible au grand public, Bennett pour les noms des salles, Stephen pour avoir aidé à créer l'assemblage pour Mac le jour de la sortie. Ce jeu est spécial pour moi, merci à tous ceux qui l'ont joué et qui m'ont soutenu pendant dix ans. Cela signifie beaucoup pour moi. <3

Source: https://habr.com/ru/post/fr483518/


All Articles