
Anunciando PYGJS (PyGame en su navegador/NodeWebkit)
Esto es parte de una serie más grande conocida como “PYGJS“
Cuando comencé mi aventura de programación de Python, era más un intento de dominar Python para poder enseñarlo plenamente a mi sobrino. Mi sobrino es, legítimamente, muy orientado a resultados, en el sentido de que le gustaría ver algo “sucediendo” mientras aprendía a programar en lugar de sólo bits esotéricos abstractos y bytes volando alrededor. Fue entonces cuando me presentaron a la biblioteca PyGame. Conocía vagamente a PyGame de proyectos como Ren’Py (el creador de novelas visuales) que yo sabía que estaban basados en la biblioteca (o algo así, la última vez que revisé …). Sin embargo, nunca me había metido tan profundamente en la biblioteca PyGame en términos de hacer algo con ella. Siempre asumí que era bastante complejo, en realidad, lo que es un poco gracioso.
Avance rápido a la enseñanza de mi sobrino Python, y kablam, estamos usando PyGame para crear juegos de computadora en su portátil de Windows de lujo (mucho más rápido que el mío). El primer juego que creó fue dos tanques girando alrededor en el mapa (visto desde arriba) que dispararon balas el uno al otro. Yo, por supuesto, en mi estilo habitual, revisado PyGame durante una semana y media, y encontró la biblioteca en realidad a ser bastante simple! Era tan fácil obtener imágenes de archivos y en la pantalla, e incluso escalarlos o rotarlos. Manejo de eventos fue bastante simple, así, PyGame abstraído lo que podría ser un montón de fangling alrededor de varios dispositivos en una simple lista de Python. Me quedé impresionado!
En realidad, compré a mi sobrino un libro sobre el desarrollo de juegos de arcade con Python y PyGame (se puede ver aquí), y empezamos a usarlo para repasar partes de Python en texto, en contraposición a la forma completamente verbal que estaba entregando. En esa nota, aquí están los libros que usé para aprender Python, y para aprender a programar con Python. (Sí, cada uno de esos fue de unas 1500 páginas, y sí, cada uno de los que he leído hasta el final.) Con este libro y el sitio web que acompaña, hemos desarrollado un simple desplazador lateral. Tenía un pequeño tipo Mega Man saltando y caminando sobre plataformas, recolectando gemas y robots voladores dentro, días realmente generales (aunque las lecciones eran (a) semana (s) aparte). Me quedé impresionado.
De hecho, estaba casi envidioso. Cuando aprendí a programar en mi TRS-80 Color Computer II 16k, hacer algo tan complejo y exigente como un scroller lateral habría requerido hacking de nivel de ensamblaje … pero mis manuales sólo explicaban BASIC. Aunque existían las funciones peek () y poke (), no tenía ni idea de hardware o procesadores, y la biblioteca elemental de la escuela que se puede imaginar era bastante carente de libros sobre cómo programar su computadora personal. (Después de visitar la biblioteca de la Universidad en la ciudad en la que vivo ahora, me hubiera gustado haber tenido acceso a ella cuando yo era pequeño, está lleno de todo! Mis bibliotecas que tenía acceso a cuando yo era poco pálido en comparación.)
Más tarde, me gradué a un Macintosh IIsi con el compilador QuickBASIC en él. Sí, todavía estaba programando en BASIC, pero, ¡era un BASIC más potente! Sin embargo, el intentar hacer cualquier cosa como un scroller lateral en él, ala Super Mario Bros. para el NES, era imposible … y créeme que lo intenté. Era demasiado exigente procesador sabiamente, gráficamente, y QuickBASIC no estaba realmente configurado para hacer algo como eso.
Entonces compré mi propio ordenador, un Quadra creo, y tenía CodeWarrior Professional en él. Sí, cuando yo estaba en octavo grado, conseguí mis manos en el libro de texto universitario de mi hermano mayor en C y C ++ y lo devoré. A partir de entonces, olvídate de estas cosas BASIC, vamos lleno de C + + hombre! Y lo hice, con diversos grados de éxito. Primero empecé a portar lo que hacía juegos Dinky I HAD en QuickBASIC a C y C + +, que era interesante.
Eventualmente, descubrí que sería genial si pudiera programar todas las necesidades gráficas intensivas en C ++, pero escribirlas conjuntamente usando QuickBASIC. El manual de QuickBASIC fue, por desgracia, increíblemente escaso sobre cómo crear bibliotecas vinculables para sus programas en idiomas como C, aunque era factible. Debido a este sparseness (y ningún Internet) nunca pude realizar totalmente mi sueño de programar funciones del hardcore en C y de secuenciarlas todos juntos en una hermosa sinfonía de un juego en QuickBASIC.
En general, nunca realmente compilado con éxito un lado de desplazamiento lateral. Ay. Entonces me interesé en programar otras cosas e ideas, como [redacted], y la programación de juegos tomó un poco de respaldo. Pero eso estaba bien, eso es cuando perfeccioné mis habilidades de ser un programador. ¿Sabías que nunca he tenido una clase de programación formal en mi vida, pero trabajé como programador profesional en una planta de impresión de estados financieros? Escribí programas C que accedían a una base de datos Oracle con SQL, y salida PostScript (sí, aprendí PostScript) a un spool de impresora, todo en los confines de un terminal ficticio de Linux utilizando Vi y GCC. Te digo lo que, después de usar el depurador en la línea de comandos que usted consigue realmente el amor IDE y sus depuradores visuales.
Sin embargo, me divago.
Me di cuenta, enseñando a PyGame (y Python) a mi sobrino que aquí había una biblioteca que abstraía todas las cosas hardcore C que quería, y lo conecté a un lenguaje de programación amistoso de alto nivel. No era QuickBASIC, era Python, pero realmente … ¡eso es mejor! (¿Quién quiere programar en QuickBASIC en estos días?) Aquí, como maestro, habíamos implementado lo que en realidad nunca cumplí cuando era un joven, un desplazador lateral que trabajaba. Cada vez que salía de una sesión de tutoría con él me sentía como yo podría ir a casa y en cuestión de días tienen todo tipo de juegos de Pygame powered whizzing alrededor en mi escritorio.
Por supuesto, los calambres creativos golpearon, y … No he hecho un juego de pygame todavía. Pero eso no me ha impedido ejercitar mis habilidades de programación. Me encantó la idea de que con un poco de Python podría crear juegos básicos que se ejecutan en su computadora como una consola de juegos de edad. Hice más investigación y poco a poco me fui familiarizando cada vez más con PyGame como una biblioteca (así como el lenguaje de programación de Python). La única queja que tuve sobre PyGame fue el envasado. Si programo un juego en PyGame, con el fin de empaquetarlo como un ejecutable tuve que básicamente “compilar” el juego para cualquier plataforma que elija. Y sólo se ejecuta en plataformas que soportan PyGame, que está bien para los escritorios, pero ¿qué pasa con las aplicaciones de teléfono? El uso de varias herramientas que podría encapsular un pygame en un ejecutable que contenía un intérprete python en él y así sucesivamente, pero que no era ideal para móviles …
Antes de que me familiarizara con PyGame (antes de que incluso enseñara a mi sobrino), había estado leyendo sobre la creación de juegos HTML5 usando JavaScript y los últimos navegadores. Pensé que éstos eran bastante ordenados porque teóricamente usted podría entonces funcionar un juego en cualquier cosa que apoyó un browser, tal como bien, un hojeador, o usted puede incorporarlos en apps del escritorio usando cosas como NodeWebkit, o incluso incorporarlas en aplicaciones descargables para su teléfono. Aprendí JavaScript de la guía definitiva en mi lector de Kindle. Pero la cosa sobre JavaScript es que … bueno, nunca capturó mi imaginación o sentido de la estética como Python o PyGame. Quiero decir, usted puede hacer algunas cosas bastante ordenado con JavaScript, pero los aros que tienes que saltar a través de todo tipo de otras cosas es extraño. La naturaleza pesada de la devolución de llamada de ella, incluso con cosas como RequireJS, apenas clase de me apagó. Quiero decir que me encantaron las ideas de Closures, pero, nada parecía tan limpio como Python.
Así que en este momento en el post ahora sabes que puedo programar en C, C ++, Python y Javascript (yo también había programado en muchas otras cosas, pero eso es lo que he cubierto aquí). Entonces algo mágico sucedió.
Entonces descubrí esta cosa fresca llamada Brython (por Pierre Quentel) era podría funcionar Python en el hojeador! Realmente era un intérprete compatible con Python 3 escrito en JavaScript. Pensé que era bastante fresco, como me gusta Python mejor que JavaScript (como se ha señalado). Lo mejor de todo, en mi opinión, era que podías interactuar con objetos JavaScript en código Python fácilmente, llamar y pasar argumentos básicos (nunca probé objetos) a sus funciones y traduciría automáticamente el JavaScript necesario. Llamar a una función de Brython de JavaScript no es imposible, pero no necesariamente AS simple (por lo que sé).
Así que tuve una idea extraña. ¿Qué pasa si puedo ejecutar PyGame usando Brython en el navegador? Comencé a mirar alrededor para los motores de juego 2D escritos en JavaScript para ver lo que podría ser capaz de utilizar que podría traducir PyGame construcciones en JavaScript llamadas. Bueno, por desgracia, muchos motores de juegos de JavaScript 2D vienen con todo tipo de campanas y silbatos de fantasía, lo cual es genial, pero no quería hacer mucho trabajo traduciendo PyGame.Surface por ejemplo a una construcción SceneGraph totalmente ajena. Eso es porque soy perezoso, como todos los buenos programadores (digo lengua-en-mejilla).
Entonces descubrí GameJS. Esta biblioteca en realidad tenía una sección en sus ejemplos que comparaba el código que escribiría en JavaScript usando GameJS a lo que podría escribir en PyGame equivalente. Esto se debe a GameJS virtualmente mapas a la construcción PyGame de la manera más hermosa. Tenía Superficies, al igual que PyGame, y Rects, un módulo de visualización, eventos, y así sucesivamente. Esto parecía ser la respuesta que estaba buscando.
Así que he descargado la última copia de NodeWebkit (por lo que podría probar en un entorno de escritorio, así como un navegador uno) y llegó a trabajar. Primero incluí la biblioteca estándar de Brython y Brython. A partir de ahí, necesitaba poder acceder al módulo de gamejs, así que lo exploré usando un archivo puente que establecía el resultado de la importación del módulo en una propiedad global disponible en la ventana. Entonces … comencé a escribir módulos de Python que imitaban los módulos de PyGame pero realmente envueltos alrededor de la funcionalidad de GameJS. Una semana y media, y 17.000 líneas de código más tarde (de acuerdo con GitHub, aunque parece un número alto), tuve PYGJS (github).
Ahora, he usado más de GameJS para lograr algunos de mis propósitos. Hubo veces GameJS acaba de ofrecer demasiado básico de funcionalidad, o ninguna funcionalidad. Me sorprendió gratamente aprender acerca de muchas API disponibles para los últimos navegadores en estos días, incluyendo APIs de Joystick y APIs de audio web. Para el sonido, he evitado gamejs.audio y en su lugar utiliza la excelente biblioteca Howler.js (con ligera modificación). Para hablar con gamepads, como mi controlador PS3, ya que PyGame tiene un módulo de joystick, usé gamepad.js de Priit Kallas (bifurcado aquí). Y para las fuentes, ya que PyGame cargado fuentes TrueType de los archivos, decidí que necesitaba algo más formidable que las funciones de lienzo simple envuelto por GameJS y utiliza el excelente opentype.js
También he modificado y aumentado GameJS con mi propio código para que pueda proporcionar alguna funcionalidad en JavaScript en el contexto de GameJS que está disponible en los archivos C de PyGame. Hay una serie de métodos, en particular en SurfArray o Máscara que son puertos directos de las funciones C del repositorio pygame. (Esto es donde el conocimiento de C fue útil!) Portando el C a JavaScript, y la modificación de GameJS, así como el uso de las bibliotecas adicionales que fue capaz de implementar MOST de PyGame hasta la versión de 1,8. Existen funciones que no son compatibles, pero no es necesariamente IMPOSIBLE conectarlas si tienes el know how.
En suma, es un borrador. El código no está completamente documentado porque en realidad, es portado desde otros lugares donde hay documentación (pygame, gamejs, etc.) dondequiera que las funciones / clases no actúen como su equivalente pygame debo hacer una nota de, sin embargo, que usted no está tropezado.
Espero que esto pueda arrancar algún interés en la ejecución de PyGame en el navegador / nodewebkit, y más desarrollo de juegos en el navegador con una biblioteca adicional para aquellos que ya están familiarizados con PyGame. El empaque se convierte entonces en una cuestión de empaquetar un proyecto NodeWebkit para el escritorio, o lo que tiene para una aplicación de teléfono.
Mi razón personal para hacer esto, además de la frescura de que era tal: Quiero hacer juego ‘editores’ para mis proyectos. Es decir, quiero crear programas que creen los datos necesarios para que un motor de juego determinado ejecute un juego. Por ejemplo, he estado interesado en portar algo como WinterMute a PyGame para que pueda crear juegos de aventura apuntar y hacer clic (o mi compañero podría crear algunos) que se ejecutaron en el motor PyGame. Desafortunadamente, PyGame no es tan bueno en las interfaces de usuario, y aunque puedes combinar PyGame y tkinter, es un gran dolor. Tampoco me gustó la idea de tener que aprender una nueva biblioteca como tkinter para la programación de la interfaz de usuario de escritorio. Además, no estaba seguro de lo bien que se traduciría a otras plataformas. Decidí que preferiría diseñar interfaces de usuario con herramientas que ya conozco: HTML, CSS y JavaScript. PYGJS ahora me permite ejecutar un juego “PyGame” dentro de un navegador donde puedo usar estas herramientas para completar mi interfaz de editor de juegos. También obtengo los beneficios que ofrecen los navegadores, incluyendo la posibilidad de usar otras bibliotecas de JavaScript y la funcionalidad del navegador.
De todos modos, he creado una nueva página dedicada a PYGJS en mi sección de Proyectos de programación de mi sitio. En este momento sólo tiene un enlace a este post y el README del proyecto github, pero espero elaborar sobre él a medida que pasa el tiempo.
También puede seguir el proyecto en devpost.
Esto es parte de una serie más grande conocida como “PYGJS“
Si usted aprecia este artículo usted puede ser que considere el apoyar de mi Patreon.
Pero si un compromiso mensual es un poco más, lo entiendo, podría considerar comprarme un café.