Cómo construir un juego simple en el navegador con Phaser 3 y TypeScript

Soy un defensor de los desarrolladores y un desarrollador de back-end, y mi experiencia en desarrollo frontend es relativamente débil. Hace un tiempo quería divertirme y hacer un juego en un navegador; Elegí Phaser 3 como marco (parece bastante popular en estos días) y TypeScript como lenguaje (porque prefiero la escritura estática a la dinámica). Resultó que necesitas hacer algunas cosas aburridas para que todo funcione, así que escribí este tutorial para ayudar a otras personas como yo a comenzar más rápido.
Preparando el medio ambiente
IDE
Elige tu entorno de desarrollo. Siempre puede usar el Bloc de notas antiguo si lo desea, pero sugeriría usar algo más útil. En cuanto a mí, prefiero desarrollar proyectos para mascotas en Emacs, por lo tanto, instalé Tide y seguí las instrucciones para configurarlo.
Nodo
Si estuviéramos desarrollando en JavaScript, estaríamos perfectamente bien para comenzar a codificar sin todos estos pasos de preparación. Sin embargo, como queremos usar TypeScript, tenemos que configurar la infraestructura para que el desarrollo futuro sea lo más rápido posible. Por lo tanto, necesitamos instalar node y npm.
Mientras escribo este tutorial, uso el nodo 10.13.0 y npm 6.4.1. Tenga en cuenta que las versiones en el mundo frontend se actualizan extremadamente rápido, por lo que simplemente tiene las últimas versiones estables. Recomiendo usar nvm en lugar de instalar node y npm manualmente; te ahorrará mucho tiempo y nervios.
Configurando el proyecto
Estructura del proyecto
Usaremos npm para construir el proyecto, así que para comenzar el proyecto vaya a una carpeta vacía y ejecute npm init. npm le hará varias preguntas sobre las propiedades de su proyecto y luego creará un archivo package.json. Se verá algo como esto:
{ "name": "Starfall", "versión": "0.1.0", "descripción": "Juego Starfall (Phaser 3 + TypeScript)", "main": "index.js", "guiones": { "prueba": "echo \" Error: no se especificó ninguna prueba \ "&& salida 1" }, "autor": "Mariya Davydova", "licencia": "MIT" }
Paquetes
Instale los paquetes que necesitamos con el siguiente comando:
npm install -D typecript webpack webpack-cli ts-loader phaser live-server
-D opción (a.k.a. --save-dev) hace que npm agregue estos paquetes a la lista de dependencias en package.json automáticamente:
"devDependencies": { "live-server": "^ 1.2.1", "phaser": "^ 3.15.1", "ts-loader": "^ 5.3.0", "typecript": "^ 3.1.6", "webpack": "^ 4.26.0", "webpack-cli": "^ 3.1.2" }
Paquete web
Webpack ejecutará el compilador TypeScript y recopilará el conjunto de archivos JS resultantes, así como las bibliotecas, en un JS minimizado para que podamos incluirlo en nuestra página.
Agregue webpack.config.js cerca de su project.json:
const path = require ('ruta');
module.exports = { entrada: './src/app.ts', módulo: { reglas: [ { prueba: /\.tsx?$/, uso: 'ts-loader', excluir: / node_modules / } ] }, resolver: { extensiones: ['.ts', '.tsx', '.js'] }, salida: { nombre de archivo: 'app.js', ruta: ruta.resolve (__ dirname, 'dist') }, modo: 'desarrollo' };
Aquí vemos que webpack tiene que obtener las fuentes a partir de src / app.ts (que agregaremos muy pronto) y recopilar todo en el archivo dist / app.js.
Mecanografiado
También necesitamos un pequeño archivo de configuración para el compilador TypeScript (tsconfig.json) donde explicamos en qué versión de JS queremos que se compilen las fuentes y dónde encontrar esas fuentes:
{ "compilerOptions": { "target": "es5" }, "incluir": [ "src / *" ] }
Definiciones de TypeScript
TypeScript es un lenguaje de tipo estático. Por lo tanto, requiere definiciones de tipo para la compilación. En el momento de escribir este tutorial, las definiciones de Phaser 3 aún no estaban disponibles como el paquete npm, por lo que es posible que deba descargarlas del repositorio oficial y colocar el archivo en el subdirectorio src de su proyecto.
Guiones
Casi hemos terminado la configuración del proyecto. En este momento, debería haber creado package.json, webpack.config.js y tsconfig.json, y agregado src / phaser.d.ts. Lo último que debemos hacer antes de comenzar a escribir código es explicar qué tiene que ver exactamente npm con el proyecto. Actualizamos la sección de scripts de package.json de la siguiente manera:
"guiones": { "build": "paquete web", "start": "webpack --watch & live-server --port = 8085" }
Cuando ejecutas la compilación npm, el archivo app.js se compilará de acuerdo con la configuración del paquete web. Y cuando ejecute npm start, no tendrá que preocuparse por el proceso de compilación: tan pronto como guarde cualquier fuente, webpack reconstruirá la aplicación y el servidor en vivo la volverá a cargar en su navegador predeterminado. La aplicación estará alojada en http://127.0.0.1:8085/.
Empezando
Ahora que hemos configurado la infraestructura (la parte que personalmente odio al comenzar un proyecto), finalmente podemos comenzar a codificar. En este paso haremos algo sencillo: dibujar un rectángulo azul oscuro en la ventana de nuestro navegador. Usar un gran marco de desarrollo de juegos para esto es un poco de ... hmmm ... exagerado. Aún así, lo necesitaremos en los próximos pasos.
Permítanme explicar brevemente los conceptos principales de Phaser 3. El juego es una instancia de la clase Phaser.Game (o su descendiente). Cada juego contiene una o más instancias de Phaser.Scene descendientes. Cada escena contiene varios objetos, estáticos o dinámicos, y representa una parte lógica del juego. Por ejemplo, nuestro juego trivial tendrá tres escenas: la pantalla de bienvenida, el juego en sí y la pantalla de puntuación.
Comencemos a codificar.
Primero, crea un contenedor HTML minimalista para el juego. Cree un archivo index.html que contenga el siguiente código:
Starfall