Juego Aviator Web3 con WebGL
Aprenda cómo integrar WebGL en un juego usando herramientas del Sequence Stack para ganar logros y usar ERC1155 personalizados.
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.
Estas herramientas le permitirán realizar:
- Configuración del Proyecto con Webpack: Habilite una estructura de proyecto con WebGL para ser compilada por Webpack
- Integrar Web SDK: Permita que todos los EOAs y Sequence Wallet autentiquen al usuario
- Desplegar un contrato de coleccionables: Cree su propio contrato de coleccionables
- Desplegar un Remote Minter y mintear tokens dentro del juego: Realice transacciones relay sin gas con Cloudflare workers
- Aproveche los ítems dentro del juego: Integre coleccionables en el juego usando Sequence Indexer
- Queme tokens de logros dentro del juego: Queme logros del juego con wagmi
- (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í