Crear una incursión cooperativa contra un monstruo
Este ejemplo crea una incursión en tiempo real en la que varios miembros atacan al mismo monstruo y comparten los resultados hasta que su salud llega a cero. El procesador común shared-resource de Webspace gestiona en el servidor los ataques, los cambios de salud y las recompensas por acción.
Antes de empezar
- Necesita permiso para desplegar esquemas y API.
- Los miembros participantes deben disponer de los permisos en tiempo real
SendyReceive. - Limite a los administradores el uso de la API que crea el objetivo de la incursión.
Empezar con el esquema completo
Descargue el esquema del juego con recursos compartidos (.sfn). Incluye las columnas y los permisos de las tres tablas utilizadas en este documento, además de la configuración del procesador shared-resource. Todas las versiones de esta guía utilizan el mismo archivo, con las descripciones de tablas y columnas en inglés.
- Descargue el archivo, súbalo a una carpeta personal o de equipo y ábralo en el editor de esquemas.
- En la configuración de despliegue de
API Build, reviseDatabase identifier. Cambie el valor predeterminadoresource_gamepor un identificador nuevo, comomonster_raid_team_a, para evitar conflictos con una base de datos existente. - Revise los permisos y la configuración del procesador y despliegue el esquema.
Este archivo es un ejemplo de estructura de backend para un recurso compartido. Como includeClient es false, no genera automáticamente la interfaz del juego ni incluye los datos iniciales del monstruo. Cree por separado una interfaz que use las siguientes API y eventos WebSocket y cree también el objetivo de la incursión.
Separar los datos en tres tablas
La estructura de recursos compartidos separa tres tipos de datos.
| Tabla | Datos almacenados |
|---|---|
game_resources | Código del monstruo, estado, salud actual y máxima, versión y objeto de recompensa |
game_actions | ID de la acción, miembro que ataca, daño aplicado, salud resultante y cantidad de recompensa |
game_inventory | Objetos y cantidades acumuladas de cada miembro |
El ID de acción de game_actions permite identificar los reintentos. Aunque envíe de nuevo el mismo ID de acción, los cambios de salud y las recompensas no se aplicarán dos veces.
Configurar el procesador en tiempo real
Active la función en tiempo real y seleccione shared-resource como procesador de eventos. Si usa los nombres de tabla predeterminados, la configuración del procesador tendrá esta estructura:
{
"resourcesTable": "game_resources",
"actionsTable": "game_actions",
"inventoryTable": "game_inventory",
"actionPower": 1,
"rewardPerAction": 1,
"maxClientAmount": 1,
"broadcast": "namespace"
}
Cuando broadcast es namespace, todos los clientes conectados al mismo espacio de nombres en tiempo real de Webspace reciben el evento de resultado. Configúrelo como actor para enviar el resultado solo al miembro que realizó la acción.
Crear el objetivo de la incursión
Llame a game_resources/create con permisos de administrador para crear el monstruo.
{
"code": "RAID-1",
"kind": "monster",
"status": "active",
"current_value": 10000,
"max_value": 10000,
"version": 0,
"reward_item_code": "monster-core"
}
Al abrir la pantalla, consulte en la API de game_resources la salud y la versión actuales. Vuelva a consultarlas después de establecer o recuperar una conexión para sincronizar la interfaz con el estado actual del servidor.
Enviar un ataque mediante WebSocket
Después de que un miembro que haya iniciado sesión se suscriba a la conexión en tiempo real, envíe un evento resource-game.act.
{
"type": "webspace:send",
"data": {
"dbName": "monster_raid_team_a",
"event": "resource-game.act",
"payload": {
"actionId": "attack-00000001",
"resourceCode": "RAID-1",
"amount": 1
}
}
}
En dbName, use el valor de Database identifier elegido durante el despliegue.
Cree un actionId de entre 8 y 80 letras ASCII, números, guiones bajos o guiones. Si omite amount, su valor será 1; si lo incluye, use un número entero dentro del límite maxClientAmount del procesador.
El servidor envía resource-game.action-applied después de procesar la acción.
{
"actionId": "attack-00000001",
"resourceId": 1,
"currentValue": 9999,
"version": 1,
"rewardQuantity": 1,
"duplicate": false
}
Actualice la salud en la interfaz solo después de recibir este resultado. Se rechazarán las solicitudes del cliente que envíen directamente resource-game.action-applied.
Mostrar la salud y las recompensas
- Confirme que
resourceIdcorresponde al monstruo mostrado actualmente. - Confirme que
versiones posterior al resultado anterior. - Actualice la indicación de salud con
currentValue. - Cuando
currentValuellegue a 0, muestre el estado de derrota conjunta del monstruo. - Vuelva a consultar los objetos personales en
game_inventory/list.
Aplique permisos de lectura solo para el propietario a game_inventory, de modo que cada miembro pueda leer únicamente sus propios datos. No deduzca las existencias de otros miembros a partir del campo rewardQuantity de un evento compartido.
Información útil
- La fuerza de ataque y las recompensas se determinan mediante la configuración del procesador del servidor, no con valores del cliente.
- La modificación del recurso, el registro de la acción y la acumulación de la recompensa se procesan en una sola transacción.
- La estructura compartida actual ofrece recompensas por acción. Las clasificaciones por derrotar al monstruo y las recompensas exclusivas para quien lo derrote requieren un diseño aparte.
- No considere que una respuesta retrasada equivale a una operación correcta. Vuelva a comprobarla con el mismo
actionIdpara evitar que la acción se aplique dos veces.