El desarrollador del juego VVVVVV en honor a su década hizo que el código fuente se abriera


¡Hoy es el décimo aniversario del lanzamiento de VVVVVV!

Aunque, quizás, mañana, estrictamente hablando, el juego estuvo disponible por primera vez a las 3 a.m. GMT del 11 de enero de 2010, después de un día muy largo de eliminar todos los errores que encontré, creando ensamblajes de último minuto e intentando cargar lentamente todo al servidor a través de un Internet extremadamente poco confiable Un compuesto que se estaba rompiendo constantemente. Pero siempre vivo con el lema " mañana no llegó hasta que te despertaste ", así que considero la verdadera fecha de lanzamiento el 10 de enero <3

Dios mío, diez años.

VVVVVV fue un juego tan importante para mí que ni siquiera sé por dónde empezar. Quería marcar esta fecha de alguna manera especial, ¡así que hoy estoy revelando el código fuente del juego!

[Código fuente VVVVVV en github]

El repositorio contiene dos versiones: la de escritorio , portada por Simon Roth a C ++ en 2011 , y la posterior, que fue actualizada y compatible con Ethan Lee , así como la versión móvil escrita en Actionscript para Adobe AIR, basada en la versión flash original del juego v1.0 .

Quiero agradecerle mucho a Ethan Lee , quien me ayudó mucho, incluso en la preparación del repositorio para la comunidad y la organización del anuncio de esto en AGDQ (¡hola, corredores de velocidad!). Gracias Ethan!


Una breve descripción del código fuente


Aquí será lógico hacer la pregunta: "¿Qué es interesante en el código fuente VVVVVV?" .

Creo que incluso un vistazo rápido al código fuente, ¡puedes entender rápidamente que técnicamente el juego VVVVVV no está muy bien pensado! Incluso para los estándares de los desarrolladores autodidactas independientes, el código es bastante caótico.

Notas / explicaciones potencialmente interesantes de por qué todo se ve exactamente como es:

  • La versión C ++ tiene un montón de cosas extrañas que se vuelven lógicas solo si recuerdas que el juego se creó primero en un flash y luego se transfirió directamente con todos sus defectos. Por ejemplo, probablemente mi peor hábito de programación es declarar variables temporales como i, j y k como miembros de cada clase para que no tengan que ser declaradas dentro de las funciones (lo cual es aburrido por una razón aburrida). Esto llevó a la aparición de varios errores desagradables y difíciles de atrapar, por decir lo menos. En particular, algunas funciones de cálculo de colisiones de entidades tienen una variable común i . Por lo tanto, los bucles infinitos son posibles.
  • Si está buscando textos de juegos, la mayoría de ellos (pero no todos) están en las clases Scripts.cpp y TerminalScripts.cpp . En esencia, estas funciones cargan datos en un analizador de script muy simple que controla la lógica de la escena. Un hecho curioso: hace muchos años, los modders hicieron ingeniería inversa de este " script interno " para hacer cosas increíbles con niveles caseros, cuya existencia ni siquiera podía imaginar.
  • En algún momento del proceso de desarrollo, decidí que dividir el código en entrada, lógica y renderizado era un buen hábito, y lo tomé muy en serio. La parte principal del código crítico del juego está en tres archivos: input.ccp , logic.cpp e incorrectamente llamado titlerender.cpp . Cada estado del juego está empaquetado en estos tres archivos bajo nombres de funciones como teleporterrender y towerlogic . Hay un montón de copiar y pegar.
  • Todos los niveles están codificados en las enormes matrices generadas en mi propio editor de archivos, que exporta los niveles al código fuente desde el que puedo leer. Así es como trabajé al crear un juego flash en 2009: el acceso a recursos de datos externos era una tarea difícil, por lo que en ese momento era más lógico compilarlos en el juego en sí. Todos los archivos realmente grandes (por ejemplo, Spacestation2.cpp, Finalclass.cpp, etc.) se crearon de esta manera. Para completar, cargué el código del editor aquí , pero para ser honesto, ahora no es particularmente aplicable (requiere compilación de Allegro y Mingw). Para cambiar el esquema de los últimos niveles, escribí una herramienta similar.
  • Cuando escribí el código, no entendí realmente cómo funcionan las clases estáticas y por qué su uso es una buena idea. Parece que leí en alguna parte que las clases estáticas y las variables globales son MALAS en flash, así que intenté evitarlas por completo. Cual es el resultado? Literalmente, cada función del juego pasa los siguientes argumentos: "Gráficos y dwgfx, Juego y juego, clase de mapa y mapa, clase de entidad y obj, Clase de utilidad y ayuda" .
  • De hecho, no hay objetos temporales en VVVVVV, y durante la primera inicialización del juego, llena todos sus conjuntos de entidades (y la mayoría de los otros conjuntos de datos) con cientos de entidades vacías. Hace esto porque leí en alguna parte que eliminar objetos en un instante provoca un frenado extraño, porque el recolector de basura entra y ralentiza todo, y esto es cierto en cierta medida. Continué adhiriéndome a este extraño hábito en nuevos proyectos hasta hace poco, en Dicey Dungeons finalmente lo abandoné.
  • Y una cosa más: junto con el analizador de escena, tuve otra forma de controlar la lógica del juego durante el pasaje: ¡una máquina de estado finito monolítico, que al final del proyecto estaba completamente fuera de control! Se puede encontrar en Game :: updatestate , y recomiendo leerlo, incluso si no desea leer ningún otro código. Maneja aspectos tales como desencadenar el inicio de escenas complejas, los puntos en los que los teletransportadores envían teletransportes, los tiempos de animación de finalización de nivel y muchas otras cosas que quería incluir rápidamente en el juego. Los estados están numerados y el más grande es 4099 (hay números no utilizados). Al desarrollar el juego, había un bloc de notas a mi lado, en el que estaban escritos los números más importantes: el número 1,000 comenzó la selección del "abalorio brillante", el número 3,040 comenzó la finalización de un nivel en particular, el número 3,500 comenzó el final del juego. Este estúpido sistema causó un excelente juego de speedran en 50.2 segundos en la categoría cualquier% .

¿No sabes qué decir sobre esto? Era joven, y fue más interesante para mí crear algo en la pantalla que implementarlo correctamente. Probablemente el mejor en el código fuente VVVVVV: se ha convertido en una prueba de que puede crear algo usted mismo, incluso si no es un buen programador.

Mirando hacia atrás después de todos estos años, me parece muy divertido que, en su mayor parte, todo esto fuera una copia y pegado múltiple de las mismas partes con valores cambiados. Debido a esto, diez años después, el código es casi imposible de mantener, pero mientras estaba en su punto más grueso, pude realizar iteraciones muy rápidas y agregar nuevos elementos. Durante la última década, he desarrollado mejores hábitos, y definitivamente he crecido mucho como programador, pero ahora parece que trabajo más lentamente debido a esto.


¡Fiesta sorpresa de aniversario!


Mientras me preparaba para publicar el artículo, Sergio Kornaga anunció un atasco de juegos en honor a la década de VVVVVV.

¡El décimo cumpleaños de VVVVVV eVVVVVVent!

Estoy muy feliz por esto, jaja, y me encantan los gloriosos naufragios del sitio, que contenían mermeladas regulares de Klik of the Month, en las que participé constantemente en el momento del desarrollo de VVVVVV. ¡Parece perfecto para esta mermelada!

Estoy realmente ansioso por ver, después del final del atasco, lo que la gente inventará, y escribiré una gran publicación en mi blog que resuma el estilo de las publicaciones antiguas sobre los niveles de usuario VVVVVV que una vez escribí

Incluso antes de lanzar el código fuente del juego, ¡abrí el acceso gratuito a las herramientas para crear y completar los niveles de VVVVVV en la versión 2014 de Make and Play ! ¡Puedes descargarlo desde aquí! Si está interesado en crear niveles en el editor VVVVVV, ¡puede comenzar con este tema ! Buena suerte



Un poco de sentimentalismo


Ya he hablado sobre cómo evoca VVVVVV en mí: poco antes del primer aniversario, escribí lo que experimenté cuando salió el juego y cómo su éxito cambió mi vida . En el quinto aniversario, escribí que VVVVVV me pareció un proyecto que ocurre solo una vez en la vida , y que nada se ha acercado ni antes ni después.

Diez años después, sigo sintiendo lo mismo. Estoy increíblemente orgulloso de VVVVVV y estoy agradecido por todo. Quiero agradecer a todos los que me ayudaron en mi camino: Magnus por su increíble banda sonora, Ethan y Simon por todo su trabajo que hizo que el juego estuviera disponible para el público en general, Bennett por los nombres de las salas, Stephen por ayudar a crear el ensamblaje para Mac el día del lanzamiento. Este juego es especial para mí, gracias a todos los que lo jugaron y me apoyaron durante diez años. Significa mucho para mi. <3

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


All Articles