Construyendo Age of Empires 2 en React

Rate this content
Bookmark

¿Cómo mejor aprender sobre las capacidades de una tecnología que hacer algo para lo que expresamente no fue diseñada? ¿Qué podemos aprender sobre la clavija cuadrada mientras la empujamos sin piedad en el agujero triangular? En un intento de reconstruir Age of Empires 2 usando React, aprenderemos sobre las limitaciones y posibilidades de la herramienta que usamos todos los días.

22 min
24 Oct, 2022

Video Summary and Transcription

Esta charla discute el proceso de recrear Age of Empires II en React. El orador comparte su inspiración para el proyecto y explora diferentes enfoques para el desarrollo de juegos utilizando React. Demuestran cómo crear una cuadrícula isométrica, habilitar el desplazamiento y renderizar unidades. La charla también cubre el manejo de clics de unidad e implementa el movimiento con el botón derecho, así como técnicas para hacer que React renderice de manera más consistente. El orador concluye destacando el valor de explorar diferentes herramientas y enfoques en el desarrollo de software.

Available in English

1. Introducción a Age of Empires II en React

Short description:

Bienvenidos a la recreación de Age of Empires II en React. Soy Joe, un consultor de ingeniería web con experiencia en React y desarrollo front-end. También disfruto del stand-up comedy y la creación de videojuegos. Consulta mi Twitter y mi página de inicio para más detalles.

♪♪ Hola, y bienvenidos a la recreación de Age of Empires II en React o el otro subtítulo. ¿Por qué sigo haciendo esto a mí mismo? Si te estás preguntando quién soy, hola. Hola, soy Joe. Soy un consultor de ingeniería web. Anteriormente trabajé para lugares como la BBC, Monzo, Lego, haciendo todo tipo de cosas de React y front-end para la gente.

Hoy en día, ofrezco mis habilidades para cualquier cosa relacionada con la vista, relacionada con React, o cosas generales de la web. Y además de hacer ingeniería web, también hago muchas, muchas cosas tontas en mi tiempo libre, incluyendo stand-up comedy. También hago tontos videojuegos, e incluso los combino donde hago stand-up comedy donde también jugamos tontos videojuegos. Si quieres ver más detalles sobre eso, puedes consultar mi Twitter en joeheart, o puedes ir a mi encantadora página de inicio, joeheart.co.uk. Paso mucho tiempo estilizándola. Por favor, déjame saber lo que piensas de esos estilos cuando le eches un vistazo. Y si alguna vez quieres enviarme un correo electrónico por cualquier motivo para decirme cuánto no te gustó esta charla, por favor envíame un correo electrónico a joeheart.dev.

2. Estableciendo el Contexto: Módulos de Nodo Katamari

Short description:

Uno de mis juegos favoritos que hice para un evento de desarrolladores llamado Smush en su día se llamaba Módulos de Nodo Katamari, que es una versión de Katamari Damacy. Es un pequeño videojuego en el que juegas con una pequeña carpeta de módulos de nodo y te desplazas por el mundo. El objetivo del juego es llegar a ser lo más grande posible.

Ahora, para establecer el contexto de hacia dónde va esta charla, pensé que sería bueno hablar de un ejemplo de las cosas que he hecho en el pasado. Uno de mis juegos favoritos que hice para un evento de desarrolladores llamado Smush en su día se llamaba Módulos de Nodo Katamari, que es una versión de Katamari Damacy, que si has jugado, sabrás hacia dónde va esto donde es un pequeño juego de video en el que juegas con una pequeña carpeta de módulos de nodo y te desplazas por el mundo. Y a medida que lo haces, y a medida que te encuentras con cosas, las cosas se te pegan. Y el objetivo del juego es llegar a ser lo más grande posible. Así que para desplazarte por este pequeño mundo donde todos los objetos en él representan paquetes de NPM de varios tamaños, quieres obtener los paquetes de NPM más grandes posibles y simplemente hincharte tanto como puedas, al igual que nuestras carpetas de Módulos de Nodo reales hacen en nuestras máquinas de desarrollo todos los días. Así que eso es un poco el contexto.

3. Recreando Age of Empires II en React

Short description:

Esta parte discute cómo el orador tuvo la idea de recrear Age of Empires II en React y proporciona una breve introducción al juego. El orador explora diferentes enfoques para recrear el juego y comparte consejos para desarrollar un videojuego utilizando React.

Y luego, para explicar un poco cómo llegué aquí y hablando sobre Age of Empires II, como todas las buenas charlas, esto comenzó con un ajuste aleatorio porque estaba un poco aburrido en el trabajo donde estábamos hablando de bibliotecas de gráficos y mencioné en la reunión este gráfico de Age of Empires II, que ocurre al final del juego, que renderiza todo esto para ti, lo cual creo que es realmente hermoso sobre cómo divide estas cosas y te muestra cuándo ciertos eventos ocurrieron en el juego.

Y jugué, bromeé en Twitter por un tiempo, para algunas personas, y luego finalmente fue Lorenzo quien sugirió ¿por qué no presentas la CFP a React Advanced para esto? Y lo hice, y ahora estamos aquí. Ahora, cuando esto comenzó, supongo que necesito agregar un poco de contexto para lo que es Age of Empires II, para aquellos de ustedes que pueden no saber qué es. Era un juego de estrategia en tiempo real. Fue lanzado en 1999, creo. Lo jugué mucho cuando era niño. Y a menudo se jugaba en uno de estos, un gigantesco monitor CRT que hacía boom cuando lo jugabas.

Y era un juego en el que asumirías el mando de uno de los ejércitos más grandes de la cultura, y los evolucionarías desde la edad de piedra hasta la edad del castillo y la edad medieval y obtener más tecnología. Y extraerías recursos y construirías tu base y elegirías tus unidades y tus ejércitos con mucho cuidado, los compondrías, y luego irías a luchar contra el enemigo. Pero realmente solo enviarías caballeros. Eso sería principalmente lo que harías, y funcionaría increíblemente bien.

Así que empecé a pensar qué podría hacer en el contexto de Age of Empires II y React? ¿Qué sería una charla interesante para venir y armar sobre la tecnología React en Age of Empires II? Y había muchas formas diferentes de abordarlo. Age of Empires II tiene menús relativamente famosos en él. Son estos hermosos diseños esquemorfos. ¿Cómo sería intentar recrear eso y React? Y hay muchas cosas realmente interesantes allí Solo conseguir que las fuentes se rendericen exactamente así, porque eso es solo Georgia, pero en un sitio web modelo es un poco complicado. Tienes que desactivar cualquier tipo de suavizado de fuentes que esté ocurriendo en el navegador. E incluso el logotipo principal de Age of Empires, utiliza una versión particularmente antigua de la fuente Castellan, que es de 1997 y es realmente difícil de conseguir ahora.

Pensé que tal vez podría ir y crear un marco de broma para crear componentes de Age of Empires II, que sería como este aceite-aceite CSS y podría construir un generador de sitios web medieval increíble donde la gente pasaría todo su tiempo aprendiendo mi propio sistema de tokens de diseño personalizado en lugar de simplemente aprender CSS. Pero pensé que no lo haría, pensé que no sería tan divertido. En cambio, empecé a pensar en ¿qué pasaría si pudiera intentar hacer Age of Empires II? ¿Cuánto de Age of Empires II podría hacer usando React? ¿Recrear este juego en React tanto como sea posible? ¿Qué tan difícil sería, en general, recrear Age of Empires II? Y como, si alguna vez tienes la inclinación de Voy a ir y rehacer uno de los mejores juegos de estrategia de todos los tiempos, aquí hay algunos consejos de buenas formas de hacerlo. Estas serían buenas decisiones que tomar. Podrías usar un motor de videojuego. Esto siempre ha crecido cuando se hacen cosas de videojuegos porque tienen muchas funciones de ayuda y cosas de renderizado. Han resuelto muchos de esos problemas comunes de videojuegos una y otra vez, y eso simplemente te hará la vida mucho más fácil. Usa un lenguaje tipado, porque simplemente te dará mucha más previsibilidad sobre las cosas que se están actualizando, todos tus ciclos de eventos. Serías capaz de construir una cantidad considerable de tu aplicación de forma automática simplemente asegurándote de que las cosas se alinean en rojo en los lugares correctos. Y luego, si vas a desarrollar un videojuego, idealmente querrías estar usando un método de renderizado de estilo rasterizado. Entonces, si vas a hacerlo en la web, intenta usar algo como HTML 5 canvas donde puedes dibujar sprites e imágenes directamente en él. O incluso si eso es un poco demasiado bajo si usas algo como Three.js donde podrías hacer como una cosa pseudo 3D o incluso posiblemente como React 3D Fiber, React 3 Fiber sería algo genial para enganchar en cosas como la gestión de estado de React. Entonces, todas esas serían formas realmente buenas de abordar este proyecto.

4. Construyendo el MVP de Age of Empires 2

Short description:

Pero decidí comenzar desde cero utilizando JavaScript y React para renderizar todo con elementos DOM. La principal razón de esto es hacer que el proyecto sea lo más doloroso posible, lo cual creo que es más entretenido y una forma de aprender sobre las herramientas. Queremos crear un MVP de Age of Empires 2 renderizando un fondo isométrico, permitiendo el desplazamiento, seleccionando unidades y edificios, y moviendo unidades haciendo clic con el botón derecho en el suelo. Renderizar el campo de batalla isométrico es fácil usando CSS. La cuadrícula se hace relativa, centrada, y cada fila es una fila flexible sin envoltura. Se utilizan variables CSS para el tamaño y el diseño de la cuadrícula. El código mostrado renderiza una cuadrícula, no una isométrica, pero es un punto de partida.

Pero decidí en su lugar comenzar completamente desde cero usar solo JavaScript y React y renderizar todo usando elementos DOM. Y la principal razón por la que decidí hacer esto es porque fundamentalmente, solo quería asegurarme de que este proyecto fuera lo más doloroso posible para mí. Principalmente porque creo que es más entretenido para ustedes. Y simplemente creo que puedes aprender mucho sobre una herramienta si la usas de las maneras equivocadas. Y eso es un poco lo que vamos a intentar hacer hoy.

Entonces, has ido a tu jefe de proyecto, has hablado sobre reconstruir Age of Empires 2 y React. Has obtenido la aprobación, ahora necesitas sacar el JIRA e intentar averiguar ¿qué es un MVP de Age of Empires 2? ¿Cuál es el mínimo viable de Age of Empires que podemos hacer? Y para mí creo que va a ser, queremos poder renderizar este fondo isométrico, este campo de batalla que está en marcha. No puedes ver necesariamente este isométrico aquí pero básicamente hay una cuadrícula de baldosas isométricas en las que todas las unidades pueden existir. Quieres poder desplazarte por el campo de batalla. Entonces, en el juego, cuando moverías tu cursor a la parte superior izquierda, se movería a la parte superior izquierda. Cuando te mueves a la parte superior derecha, se movería a la parte superior derecha. Quieres poder hacer clic en una unidad, un edificio, de una manera bastante genérica para que podamos seleccionar cosas alrededor del campo de batalla. Y luego queremos poder hacer clic con el botón derecho en el suelo para mover la unidad. Creo que si podemos empezar con eso, entonces podremos construir y construir el resto de Age of Empires.

Entonces, renderizar un campo de batalla isométrico, esto es sorprendentemente fácil usando CSS. Entonces, nuestro método de renderizado es muy simple. Solo vamos a tener un div al que le daremos una clase de cuadrículas. Y luego terminé creando dos matrices de índices para que podamos mapearlos, una para las filas, donde agregamos una fila anidada en cada una de ellas y columnas donde mapeamos y renderizamos baldosas. Además, probablemente debería señalar ahora, esto no es nada accesible. Pensé que tratar de hacer un DOM basado en Age of Empires 2 accesible sería un poco más doloroso de lo que estaba dispuesto a soportar esta vez. Y entonces nuestra cuadrícula, simplemente la vamos a hacer relativa. La vamos a colocar en la parte superior izquierda de la página y la centraremos un poco más. Cada fila será simplemente una fila flexible. Nos aseguraremos de que no haya envoltura en ella porque tuve un error extraño en el que, si accidentalmente encogías esto, no se encogería demasiado. Se vería como un fondo emergente. Terminas con esta cuadrícula dentada. Y simplemente usamos algunas variables CSS muy simples para asegurarnos de que cada bloque tenga el tamaño correcto y la cuadrícula correcta. Ahora, si estás mirando estos dos trozos de código, estás diciendo, Joe, eso solo renderiza una cuadrícula, no una isométrica, tendrías razón. Ese trozo de código que acabo de mostrarte renderizaría este tipo de cosa en el lado derecho. Es solo una pequeña cuadrícula como esa.

5. Creando una cuadrícula isométrica y habilitando el desplazamiento

Short description:

Usando unas pocas líneas de CSS y un método de renderizado, podemos crear una hermosa cuadrícula isométrica para Age of Empires 2. Para obtener las texturas del juego, descargué un software de modificación llamado Turtle Pack y extraje los archivos SLP y DRS. Después de exportar una baldosa de césped como un mapa de bits, lo ajusté en Photoshop para que se ajustara a la cuadrícula. Con la imagen de fondo establecida en las baldosas, rápidamente cumplimos nuestro primer requisito. A continuación, necesitábamos habilitar el desplazamiento en el campo de batalla. Utilizando los eventos de movimiento del mouse de React y una referencia conectada al div del contenedor, implementamos una función que desplaza la vista cuando el mouse está cerca del borde del contenedor.

Pero luego, usando solo un poco de transformación, vamos a rotar todo en el eje X y luego en la tercera dimensión, vamos a rotar un poco el eje Z. Terminamos con esta hermosa cuadrícula isométrica, todo hecho con solo unas pocas líneas de CSS y un método de renderizado.

Ahora vas a mirar eso y decir, Joe, eso no se parece en nada a Age of Empires 2. Y yo diré, tienes razón. Esta es una captura de pantalla de Age of Empires 2 y mira este hermoso césped algo borroso en el que está parada esta unidad. Así que queremos poder obtener esas texturas.

Ahora bien, podría simplemente buscar en Google texturas para Age of Empires 2. Extrañamente, eran bastante difíciles de encontrar. Así que en su lugar terminé descargando este maravilloso software de modificación llamado Turtle Pack, que te permite extraer los archivos SLP y DRS, que eran archivos particulares. No sé si eran particulares para ese juego exacto, pero eso almacenaba todos estos datos. Así que fui a este encantador foro, que, por cierto, solo quiero decir cuánta alegría me dio ver un sitio web que hablaba de deshabilitar aceleradores de descarga y gestores de descargas, lo que me hizo sentir muy nostálgico por un sentido del tiempo. Así que logré descargar esta maravillosa pequeña herramienta, y arranqué mi CD, y puedes ver que dentro de cada uno de estos SLPs hay estos casi GIFs de almacenamiento de estas baldosas, donde es un solo archivo, pero hay todos estos diferentes que serían como una animación. Pero logré exportar uno de ellos como un mapa de bits. Ahí vamos, boom, tenemos nuestra baldosa de césped. Hay un total de seis píxeles allí, esto es increíble.

Ahora, el problema es que hemos hecho esa transformación en nuestra cuadrícula. Así que si ponemos eso como una imagen de fondo, va a sesgar eso de nuevo, lo cual es demasiado. Así que, un rápido salto a Photoshop, lo enderezamos un poco, lo que hace que parezca significativamente más embarrado, y luego podemos simplemente establecer la imagen de fondo en todas nuestras baldosas, boom, tenemos nuestra hermosa cuadrícula isométrica. Mira qué rápido hemos cumplido nuestro primer requisito, esto va realmente bien.

Ahora, también queremos poder desplazarnos por este campo de batalla. Esto va a ser un poco más complicado que nuestro anterior. Ahora, afortunadamente, React lo hace muy, muy fácil para engancharse a los eventos de movimiento del mouse. Así que podemos ir al evento onmousemove, tener un pequeño controlador, y el controlador simplemente va a almacenar el mouseX y el mouseY en un estado de React para que podamos usarlo básicamente como queramos. Y vamos a usar una referencia, y conectarla a ese div, para que podamos sacar propiedades de ese div, sobre cuán alto es, y cosas así. Y luego vamos a escribir esta función. Y digo, nosotros, quiero decir, yo hice esto, donde básicamente queremos hacer la lógica de, cuando el mouse se mueve, ¿está a 50px del borde del contenedor? Entonces desplázate un poco en esa dirección si lo está. Y la forma en que vamos a hacer esto es que hay este método de desplazamiento en los Elementos HTML, pero el método de desplazamiento no es ir y desplazarse un poco, es desplazarse a este punto exacto, porque eso es lo que quieren los documentos web, ¿verdad? Quieres poder desplazarte a un lugar, quieres desplazarte a una etiqueta o cosas así. Así que tenemos que hacer un poco de matemáticas para calcular dónde queremos que sea el desplazamiento a la izquierda y el desplazamiento superior, donde es bastante fácil donde vamos y obtenemos el ancho y la altura del contenedor actual. El margen de desplazamiento es como usarlo como la distancia de cuán cerca del borde de mi pantalla quiero empezar a desplazarme? Y luego la cantidad de desplazamiento es esencialmente la velocidad a la que vamos a desplazarnos. Vamos a obtener la posición de desplazamiento actual, eso es el desplazamiento a la izquierda y el desplazamiento superior.

6. Implementando el desplazamiento y la representación de las unidades

Short description:

Implementamos una función de desplazamiento que permite mover el campo de batalla cuando el ratón está cerca del borde del contenedor. Utilizando los eventos de movimiento del ratón de React y una referencia conectada al div del contenedor, podemos desplazar la vista en consecuencia. Luego movemos nuestro estado a un reducer para manejar la representación de las unidades y los edificios. Creamos un array de unidades y un objeto de interfaz de usuario para gestionar el estado. Añadimos un reducer para manejar la lógica de actualización de la posición del ratón. Representamos las unidades mapeando sobre las unidades en nuestro estado y estableciendo dinámicamente su posición como baldosas. También aplicamos transformaciones para mostrar correctamente la unidad de lancero. Finalmente, hacemos que las unidades sean interactivas añadiendo un controlador de clics para cada unidad.

Y luego simplemente hacemos, si el ratón está más allá que el ancho del contenedor menos el margen, así que el ancho del contenedor menos el margen, justo allí, entonces añade un poco de desplazamiento a la izquierda. Y si es al revés, quita un poco de la izquierda, añade un poco a la parte superior, resta de la parte superior. Y luego podemos tomar este uso de callback, que he envuelto, he envuelto este método en uso de callback diciendo que depende del estado de mouseX y mouseY que definimos más arriba. Y ahora podemos poner eso dentro de un use effect. Y tenemos este bonito pequeño tipo de bucle de juego sucediendo aquí. Esta era realmente mi idea alrededor, quiero intentar jugar con React para video y cosas así porque el bucle use effect es muy similar a ese bucle de juego que los motores de juego o el software de juego tienen donde estás constantemente haciendo un poco de lógica. Y ahora cuando mueves tu cursor al borde de la pantalla, se va y se mueve a través. Tenemos nosotros mismos desplazándonos a través del campo de batalla. Esto es fantástico con un montón de registros de console también. Muy necesario, muy requerido.

Así que hemos avanzado muy rápidamente. Tenemos nuestro primer conjunto y nuestro segundo conjunto de requisitos hechos haciendo clic en unidades y edificios para seleccionarlos. Así que en primer lugar, para poder hacer clic en ellos, necesitamos poder representarlos. Así que vamos a mover nuestro estado que estábamos manteniendo en solo algunos ganchos de estado a un poco más de un reducer porque vamos a hacer mucho más. Si vamos a tener muchas unidades en el futuro, queremos poder acceder a todas ellas en un reducer. Así que vamos a crear un array de unidades, añadir una unidad allí por ahora, y luego mover todas nuestras otras cosas a un objeto de UI para que esté fuera del camino. Y por ahora solo vamos a añadir un reducer que haga las cosas de actualización de la posición del ratón. Así que la lógica que estábamos almacenando en el estado antes, pero ahora la estamos almacenando en un reducer.

Ahora, añadir una unidad y representarla, vamos a tomar un enfoque muy similar a lo que estábamos haciendo con la representación de las baldosas, donde simplemente vamos a añadir este div que existe dentro del elemento de la cuadrícula, y vamos a mapear sobre todas las unidades en nuestro estado. Les vamos a dar un div donde tendrán una clase de unidad, que les dará algunos atributos genéricos sobre su ancho y su altura. Y luego tienen cualquier tipo particular que sea. Así que para esto, él es un lancero, así que usa el fondo de lancero. Y luego vamos a establecer dinámicamente la posición como baldosas porque van a moverse más tarde en lugar de hacerlo en el CSS. Y eso significa que obtenemos esta maravillosa representación. Ahora, la razón por la que esto está sucediendo es porque la textura del lancero es un cuadrado y él está de pie, pero obviamente hemos hecho esta transformación para que esté un poco más abajo. Así que necesitamos encontrar una manera de esencialmente voltearlo de nuevo. Y la forma en que vamos a hacer eso es esencialmente desrotándolo un poco, donde vamos a hacer una rotación Z negativa, rotando el X, y luego también scale el Y un poco, y boom, tenemos a nuestro lancero de pie y está listo para la acción. Pero desplazarse por un campo de batalla con una unidad en el medio no es particularmente emocionante. Entonces, ¿cómo lo hacemos interactivo? Ahora, aquí es realmente donde React brilla porque los manejadores de clic son pan y mantequilla. Así que muy fácilmente para cada unidad que vamos a representar, le vamos a dar un manejo de clic en la unidad, donde vamos a pasar el ID de la unidad.

7. Manejo de clics en la unidad y movimiento con clic derecho

Short description:

Esta parte discute el manejo de los clics en la unidad e implementa la funcionalidad de clic derecho para el movimiento. Explica cómo se generan los métodos para cada unidad y cómo se despachan las acciones para seleccionar entidades. El texto también cubre el uso de la magia de CSS para mostrar la salud e implementar un movimiento suave utilizando variables de CSS. Aborda el problema del tiempo de transición y sugiere establecerlo dinámicamente en función de la distancia recorrida. Además, explora el comportamiento del desplazamiento y explica por qué el enfoque inicial de usar useEffect como un bucle de juego no es efectivo.

Este manejo de clic en la unidad en realidad va a generar un método para cada una de ellas. Por lo tanto, va a crear un método que será llamado cuando esté listo, donde simplemente despachará una acción para seleccionar la entidad, la acción de seleccionar entidad. Simplemente va a establecer un ID seleccionado de lo que sea que haya clicado en ese momento. Y hemos añadido un poco de estado inicial aquí para null, que debería estar bien.

Y ahora cuando hacemos clic en él, y con un poco de magia extra de CSS para mostrar un poco de health en una barra de selección, ahora podemos hacer clic en él y hacer clic fuera, y hacer clic en él, y hacer clic fuera. ¿Quién no jugaría eso durante varias horas? ¿No es eso fantástico?

Ahora, si queremos poder hacer clic derecho para movernos, esto es muy similar a lo que puedes hacer clic derecho, tener un manejador de clic derecho, que es lo que hace este método de menú de contexto. Este es esencialmente tu método de clic derecho, si tuviera otro nombre. Y vamos a hacer lo mismo que hicimos para la unidad, donde para cada baldosa, le vamos a dar un manejador, donde vamos a manejar el clic derecho. Vamos a generar un nuevo método a partir de la X y la Y, y despachar este método. Esto es un poco más complicado que el otro, pero eso es porque queremos ir y encontrar la unidad seleccionada actualmente, y luego básicamente decirle que se mueva tomando la posición de esta nueva que acabamos de admitir, hemos clicado en una baldosa, queremos movernos allí. Y luego vamos a pasar por las unidades, actualizarla, y resetear el estado.

Así que ahora clic, boom, movimiento. Oh, eso es un poco rápido. Realmente no, eso parece injusto, y no parece muy realista para la era medieval tener teleportación todavía. Pero, como estamos moviéndolo solo usando variables de CSS, podemos establecer la transición a lineal, y de repente tenemos esta unidad en movimiento. ¿No es eso fantástico? Oh, en realidad. Bueno, ahora el problema con esto es, que se está moviendo suavemente, pero independientemente de cuánto se mueva, va a tomar un segundo, que es un poco demasiado largo. Lo que significa que si se mueve muy lejos, es super rápido, y cerca, super lento. Entonces, ¿cómo podemos cambiar esto? Bueno, podríamos establecer dinámicamente ese tiempo de transición de distancia basado en cuánto se ha movido. Así que ahora, si haces clic muy, muy lejos, la distancia será bastante larga. Y si haces clic muy cerca, será un tiempo bastante corto. Así que aquí hay un ejemplo de eso funcionando, donde ahora se está moviendo super lejos, y es un poco lento, y se mueve un poco, y es mucho más rápido. Mucho más consistente en la cantidad de tiempo. Pero entonces, si empiezas a hacer clic un poco más rápido, no está funcionando demasiado, y de repente esto no es exactamente lo que queremos. Estás haciendo clic aquí, estás haciendo clic en uno de ellos, y está estableciendo la posición. Haces clic en el siguiente lugar, acelera la animation, pero la unidad no se ha movido tanto. Y también, en realidad, si volvemos a ese desplazamiento que estaba sucediendo, en realidad solo se está desplazando cuando mueves el ratón. Así que si mueves el ratón al borde del marco, y no lo mueves en absoluto, no seguirá desplazándose por ti. Este no es realmente el comportamiento que quieres. Y la razón por la que esto está sucediendo es porque esa idea que tenía de usar ese useEffect como un bucle de juego, no está funcionando realmente, porque el useEffect solo se está ejecutando cuando realmente mueves tu ratón.

8. Haciendo que React Renderice Más y Explorando Otras Herramientas

Short description:

Sería mucho más como un juego si se ejecutara todo el tiempo. Podemos hacer que React renderice más utilizando diversas técnicas como modificar variables, usar timeouts y el hook useAnimationFrame. Estos métodos permiten un renderizado más consistente y crean una experiencia más suave, similar a un bucle de juego. Como desarrolladores de React, es importante explorar los límites de lo que React puede hacer y considerar otras herramientas en nuestro kit de herramientas, como HTML5.

Y sería mucho más como un juego si se estuviera ejecutando todo el tiempo. Donde un bucle principal en un juego es usualmente, manejar un montón de entradas, renderizar un montón de elementos, y luego se llama a sí mismo, y simplemente sigue y sigue y sigue hasta que sales. Eso es fundamentalmente lo que es un bucle de juego.

Entonces, esto nos lleva a la horrible pregunta que la mayoría de nosotros normalmente hacemos lo contrario, ¿cómo podemos hacer que React renderice más? Ahora he decidido revelar muchos de mis Secretos Oscuros donde podemos ir y leer nuestro libro de artes oscuras de React para encontrar todas las diversas formas de hacer renders adicionales. Podemos usar un set timeout para desencadenar un render modificando una variable que luego dispara nuestro use effect. Podemos actualizar una cantidad variable de estado. Estoy seguro de que muchos de ustedes han hecho esto accidentalmente como errores en su propio code donde tienen un user effect que se ejecuta al montar, pero dentro de ese user effect también cambian alguna variable que también está en el árbol de dependencias, y simplemente se ejecuta para siempre. Aunque eso causa más errores de desbordamiento de pila que cosas divertidas de renderizado.

O podríamos hacer una llamada, llamar al callback real dentro del user effect en sí. Entonces, haces ese use effect inicial y luego llamamos al callback allí. Pero el problema con estas cosas es que son formas de hacer que se renderice más, pero no necesariamente de hacer que se renderice de manera más consistente, lo que querríamos para más cosas de animation.

Entonces, para esto, podríamos usar la maravillosa API exclusiva de React window.requestAnimationFrame. Estoy bromeando. Por supuesto que no es una API de React. Es una browser API. Es una que ayuda con muchas cosas basadas en animación, pero podemos engancharla a React aquí. Y decidí robar este encantador hook de CSS Tricks, donde es useAnimationFrame. Y básicamente te permite analizar un callback, que luego será llamado por requestAnimationFrame, creando esta forma muy suave de renderizar cosas donde puedes hacerlo basado en el tiempo en lugar de solo en eventos que están sucediendo. Esto es mucho, mucho más cercano a ese bucle de juego del que estaba hablando.

Ahora, puedes tener solo esta función de animación donde te dan tiempo. Puedes hacer un montón de lógica. Puedes mover el ratón si está en el margen. Puedes mover las unidades. Puedes actualizar las animations de los sprites. Puedes hacer walla-la-la tu camino hacia la libertad. Y realmente, es en este punto que probablemente deberías haberte dado cuenta de que esto no es realmente acerca de reconstruir Age of Empires II y React. La razón por la que quería hablar sobre este tipo de cosas hoy, el tipo de cosas que aprendes cuando empiezas a jugar alrededor de los bordes de lo que React puede hacer y lo que React no puede hacer, es la verdadera pregunta a hacer es, ¿en qué es bueno React y qué otras herramientas tenemos? Creo que es bastante fácil para nosotros cuando estamos mirando cosas de React decir, debe estar en la API de React. Debe haber una solución de React para esto. Pero tenemos que recordar que, como desarrolladores de React, tenemos una gran cantidad de herramientas en nuestro kit de herramientas. Podemos construir cosas en HTML5.

9. Construyendo con CSS o Calaveras

Short description:

Podemos construir cosas solo con CSS o Calaveras. Las cosas que puedes aprender al hacer que algo haga cosas terribles pueden ser bastante útiles. Espero que hayas disfrutado de mi dolorosa experiencia de intentar reconstruir Age of Empires 2 en React. No lo recomiendo en absoluto. Pero espero que puedas encontrar algo divertido para hacer con React que sea completamente diferente. Si tienes algún comentario, por favor házmelo saber en Twitter. Gracias.

Podemos construir cosas solo con CSS o Calaveras, por alguna razón, porque no pude pensar en un cuarto elemento para agregar allí. Tal vez las Calaveras es testing, no lo sé. Pero creo que las cosas que puedes aprender al hacer que algo haga cosas terribles pueden ser bastante útiles.

Espero que hayas disfrutado de mi dolorosa experiencia de intentar reconstruir Age of Empires 2 en React, que fue horrible y terrible, y no lo recomiendo en absoluto. Pero espero que puedas encontrar algo divertido para hacer con React que sea completamente diferente de forms o SPAs o cualquiera de esas cosas en las que React es bueno. Ve y haz algo en lo que React sea terrible.

Soy Joe Hart. Si tienes algún comentario sobre cómo se desarrolló esto, por favor házmelo saber en Twitter. Visita mi sitio web o envíame un correo electrónico y ven a charlar. Ha sido un placer absoluto. Gracias. ♪♪

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

React Advanced Conference 2022React Advanced Conference 2022
25 min
A Guide to React Rendering Behavior
Top Content
React is a library for "rendering" UI from components, but many users find themselves confused about how React rendering actually works. What do terms like "rendering", "reconciliation", "Fibers", and "committing" actually mean? When do renders happen? How does Context affect rendering, and how do libraries like Redux cause updates? In this talk, we'll clear up the confusion and provide a solid foundation for understanding when, why, and how React renders. We'll look at: - What "rendering" actually is - How React queues renders and the standard rendering behavior - How keys and component types are used in rendering - Techniques for optimizing render performance - How context usage affects rendering behavior| - How external libraries tie into React rendering
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Building Better Websites with Remix
Top Content
Remix is a new web framework from the creators of React Router that helps you build better, faster websites through a solid understanding of web fundamentals. Remix takes care of the heavy lifting like server rendering, code splitting, prefetching, and navigation and leaves you with the fun part: building something awesome!
React Advanced Conference 2023React Advanced Conference 2023
33 min
React Compiler - Understanding Idiomatic React (React Forget)
Top Content
React provides a contract to developers- uphold certain rules, and React can efficiently and correctly update the UI. In this talk we'll explore these rules in depth, understanding the reasoning behind them and how they unlock new directions such as automatic memoization. 
React Advanced Conference 2022React Advanced Conference 2022
30 min
Using useEffect Effectively
Top Content
Can useEffect affect your codebase negatively? From fetching data to fighting with imperative APIs, side effects are one of the biggest sources of frustration in web app development. And let’s be honest, putting everything in useEffect hooks doesn’t help much. In this talk, we'll demystify the useEffect hook and get a better understanding of when (and when not) to use it, as well as discover how declarative effects can make effect management more maintainable in even the most complex React apps.
React Summit 2022React Summit 2022
20 min
Routing in React 18 and Beyond
Top Content
Concurrent React and Server Components are changing the way we think about routing, rendering, and fetching in web applications. Next.js recently shared part of its vision to help developers adopt these new React features and take advantage of the benefits they unlock.In this talk, we’ll explore the past, present and future of routing in front-end applications and discuss how new features in React and Next.js can help us architect more performant and feature-rich applications.
React Advanced Conference 2021React Advanced Conference 2021
27 min
(Easier) Interactive Data Visualization in React
Top Content
If you’re building a dashboard, analytics platform, or any web app where you need to give your users insight into their data, you need beautiful, custom, interactive data visualizations in your React app. But building visualizations hand with a low-level library like D3 can be a huge headache, involving lots of wheel-reinventing. In this talk, we’ll see how data viz development can get so much easier thanks to tools like Plot, a high-level dataviz library for quick & easy charting, and Observable, a reactive dataviz prototyping environment, both from the creator of D3. Through live coding examples we’ll explore how React refs let us delegate DOM manipulation for our data visualizations, and how Observable’s embedding functionality lets us easily repurpose community-built visualizations for our own data & use cases. By the end of this talk we’ll know how to get a beautiful, customized, interactive data visualization into our apps with a fraction of the time & effort!

Workshops on related topic

React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Top Content
Featured WorkshopFree
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
React Advanced Conference 2021React Advanced Conference 2021
132 min
Concurrent Rendering Adventures in React 18
Top Content
Featured WorkshopFree
With the release of React 18 we finally get the long awaited concurrent rendering. But how is that going to affect your application? What are the benefits of concurrent rendering in React? What do you need to do to switch to concurrent rendering when you upgrade to React 18? And what if you don’t want or can’t use concurrent rendering yet?

There are some behavior changes you need to be aware of! In this workshop we will cover all of those subjects and more.

Join me with your laptop in this interactive workshop. You will see how easy it is to switch to concurrent rendering in your React application. You will learn all about concurrent rendering, SuspenseList, the startTransition API and more.
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
React Hooks Tips Only the Pros Know
Top Content
Featured Workshop
The addition of the hooks API to React was quite a major change. Before hooks most components had to be class based. Now, with hooks, these are often much simpler functional components. Hooks can be really simple to use. Almost deceptively simple. Because there are still plenty of ways you can mess up with hooks. And it often turns out there are many ways where you can improve your components a better understanding of how each React hook can be used.You will learn all about the pros and cons of the various hooks. You will learn when to use useState() versus useReducer(). We will look at using useContext() efficiently. You will see when to use useLayoutEffect() and when useEffect() is better.
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
React Advanced Conference 2021React Advanced Conference 2021
145 min
Web3 Workshop - Building Your First Dapp
Top Content
Featured WorkshopFree
In this workshop, you'll learn how to build your first full stack dapp on the Ethereum blockchain, reading and writing data to the network, and connecting a front end application to the contract you've deployed. By the end of the workshop, you'll understand how to set up a full stack development environment, run a local node, and interact with any smart contract using React, HardHat, and Ethers.js.
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn