Skip to main content
Tiempo estimado: 40 minutos En esta guía, repasaremos el proceso de integración de WebGL en un juego, aprovechando herramientas del Sequence Stack para ganar logros y usar ERC1155 personalizados para jugar dentro del juego.
Puede jugar una versión en vivo del juego aquíEl código completo de este juego se puede encontrar aquíY el código plantilla completo que usaremos para la guía se puede encontrar aquí
Estas herramientas le permitirán realizar:
  1. Configuración del Proyecto con Webpack: Habilite una estructura de proyecto con WebGL para ser compilada por Webpack
  2. Integrar Web SDK: Permita que todos los EOAs y Sequence Wallet autentiquen al usuario
  3. Desplegar un contrato de coleccionables: Cree su propio contrato de coleccionables
  4. Desplegar un Remote Minter y mintear tokens dentro del juego: Realice transacciones relay sin gas con Cloudflare workers
  5. Aproveche los ítems dentro del juego: Integre coleccionables en el juego usando Sequence Indexer
  6. Queme tokens de logros dentro del juego: Queme logros del juego con wagmi
  7. (Opcional) Integre Embedded Wallet en Web SDK: Permita una experiencia fluida sin el uso de mensajes firmados por el firmante

1. Configuración del proyecto con webpack

Clonar el repositorio

Primero comenzaremos clonando un proyecto plantilla, que incluye algunos componentes basados en WebGL creados con three, todos compilados usando webpack Plantilla WebGL JS Web SDK Starter Clona el repositorio anterior y accede a él con cd template-webgl-js-sequence-kit-starter.

Actualice .env

Cree un archivo .env (usando el .env.example) con las variables de entorno
Y ejecute los siguientes comandos para iniciar la aplicación
¡Listo! Debería ver un avión volando sobre el agua

2. Integrar Web SDK

Ahora que tenemos la estructura del proyecto lista, podemos integrar Web SDK

Configurar el componente App.jsx

Cree una carpeta dentro de src llamada react y cree 2 archivos: App.jsx y Login.jsx En App.jsx incluya el siguiente código
Luego, en el archivo Login.jsx agregue el siguiente código para crear un botón en la parte superior de la pantalla para iniciar sesión en la aplicación

Renderizar el componente en Javascript index.js

Finalmente, en index.js importe el componente App.jsx y renderícelo para que se agregue al elemento con id root en index.html
Crear un manejador de clic para llamar al modal de inicio de sesión
Agregue el siguiente código al componente Login.jsx
Y el siguiente código del manejador de clic en index.js
Y agregue estos elementos a su index.html
¡Listo! Ahora tendrá un botón que hace aparecer un modal

3. Implemente un contrato de coleccionables

Necesitará crear un coleccionable desde el Sequence Builder, lo cual puede lograr siguiendo esta guía Deberíamos crear 2 colecciones: una para los tokens de logros y otra para los aviones

4. Desplegar un Remote Minter y mintear tokens de logros dentro del juego

Luego, para enviar transacciones a la blockchain de manera fluida y sin gas, implemente un Cloudflare Worker para mintear ítems desde un contrato desplegado en el paso anterior, asegurándose de que la dirección del contrato de la API de transacciones esté ingresada como Minter Role Permitiremos que existan múltiples caminos para mintear coleccionables: un coleccionable de avión y un coleccionable de logro. Esto se logra en el código agregando una clave/valor isPlane al cuerpo de la solicitud normal de cloudflare, y creando un if/else adicional en el cloudflare worker. Puede ver el código para esto en este repositorio de github Para esta guía, ejecutaremos todo el código de cloudflare en un entorno de desarrollo local, esto se puede hacer iniciando el cloudflare worker en la carpeta del proyecto, así:

5. Aproveche los ítems dentro del juego

Esta sección se dividirá en 2 implementaciones para actualizar la UI según los cambios de propiedad de activos dentro del juego:
  • Mostrar cambios de avión según los activos del wallet
  • Mostrar cambios en la UI según los activos del wallet

Mostrar cambios de avión según los activos del wallet

Para implementar cambios en el juego según los activos que tiene el wallet, puede implementar un botón que mintea un token y luego, en la respuesta, verifica los cambios en el indexer En el index.js incluimos un botón conectado al atributo onclick del elemento en index.html
Donde callContract se encarga del minteo llamando a un fetch que está envuelto en un mutex para asegurar que solo ocurra un minteo a la vez, evitando clics repetidos, y se agrega a la clase SequenceController en /API/SequenceController.js
y fetchPlaneTokens hará polling del resultado hasta que haya un activo en su wallet, actualizando el plane color para representar un avión diferente. fetchPlaneTokens se implementa con el siguiente código, donde la condición de balance es mayor que 1, y el tokenID es igual al id buscado. Esta lógica condicional de la UI cambiaría según su aplicación

Mostrar cambios en la UI según los activos del wallet

A continuación, implementamos un cambio en la UI donde agregamos un botón de burn achievement, dependiendo de si el usuario tiene un logro o no Primero, implementar la lógica de manejador de clic HTML/JS similar a la anterior donde esta vez, el valor isPlane de callContract se establece en false
Nota: en un juego real, este minteo del token de logro ocurriría en base a algún evento disparador dentro del juego, pero para simplificar hemos incluido un botón
Esta vez, llamamos a fetchTokensFromAchievementMint que se agrega al SequenceController
Esto hace que solo si hay un balance devuelto por el indexer, el atributo display haga aparecer el botón

6. Quemar tokens de logro dentro del juego

Finalmente, para quemar el token de logro, ya no podemos usar un Cloudflare Worker para las acciones enviadas a la blockchain, porque cuando el minteo se realizó ‘en nombre de’ la dirección usando la API de transacciones (haciendo que el msg.sender en el contrato sea una de las direcciones del relayer), para esto, queremos asegurarnos de que el msg.sender en el contrato demuestre la propiedad del token y que la transacción sea enviada directamente por el usuario. Usaremos funciones frontend de wagmi y algo de composición de clases para lograrlo.
Donde burnToken es una función pasada desde nuestro componente react que usa un patrón similar de mutexes, y enviamos la transacción usando sendTransaction del paquete wagmi, esperando la actualización del hash de la transacción para devolver el callback
Y en nuestro SequenceController, llamamos a la función sendBurnToken envuelta en burnToken para hacer que la función de react sea accesible para el resto de la aplicación
Luego, para que el token quemado tenga un efecto en la UI, ocultamos el botón usado para quemar el token en el lugar inicial, lo cual se logra con el siguiente código en el SequenceController
¡Y listo! Puede ver un ejemplo completo del código aquí

7. (Opcional) Integre el Embedded Wallet en Web SDK

Si desea facilitar el recorrido del usuario para que no tenga que firmar transacciones en ningún momento, puede habilitar el Embedded Wallet actualizando la configuración de su componente react de Web SDK. Al hacer esto, reducimos los pop-ups al quemar tokens con wagmi, ya que la entrega de tokens de logro y el minteo de coleccionables se completan usando un Cloudflare Worker para transacciones sin gas. Esto se puede lograr agregando algunas variables de entorno y cambiando el tipo de conector que usamos. Primero actualice su archivo .env con los siguientes secretos de entorno
Luego pase estas variables a su conector de Web SDK en App.jsx
Y eso es todo, no se requiere más integración para completar los flujos de transacción
Para aprender más sobre Wallets dentro del juego, vea aquí