> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/interactividad/eventos-de-boton/advanced-button-events.md).

# Eventos avanzados de Button

Si necesitas que la interacción en tu escena siga una lógica personalizada que no sea compatible con los [Registrar callback](/creator/content-creator-es/scenes-sdk7/interactividad/eventos-de-boton/register-callback.md) o el [Basados en System](/creator/content-creator-es/scenes-sdk7/interactividad/eventos-de-boton/system-based-events.md) enfoques, puedes trabajar directamente con los datos brutos del evento de input. Este enfoque es el más difícil, pero el más flexible.

## El componente PointerEventsResult

Cuando el Engine detecta un evento de pointer, a la Entity que se hizo click se le asigna un `PointerEventsResult` componente. Este componente contiene todos los datos brutos sobre el evento de hit y almacena datos históricos sobre eventos anteriores.

Los helpers en `Input`, como `inputSystem.wasJustClicked` o `inputSystem.getInputCommand` son buenos para la mayoría de los escenarios simples, pero si necesitas obtener más detalles sobre el evento de hit, revisa los datos brutos en el `PointerEventsResult`.

El `PointerEventsResult` almacena un `commands` array, que contiene un objeto por cada evento de pointer que almacena. Guarda una lista de hasta 30 eventos; los eventos más nuevos se almacenan al final del array. Una vez que la lista alcanza una longitud de 30, empieza a descartar los eventos antiguos por cada nuevo evento que llega.

Cada evento en el `commands` array tiene los siguientes datos:

* `analog`: Bandera para marcar si el evento proviene de un input analógico o digital. Los inputs digitales tienen un valor de *1*, los inputs analógicos (como un joystick) tienen un valor de *0*.
* `botón`: Qué id de botón se presionó. El número corresponde al `InputAction` enum, que enumera todos los botones disponibles.
* `state`: Tipo de evento de pointer, del enum `PointerEventType`. *0* se refiere a `PointerEventType.PET_DOWN`, *1* en `PointerEventType.PET_UP`, *2* en `PointerEventType.PET_HOVER_ENTER`, *3* en `PointerEventType.PET_HOVER_LEAVE`
* `timestamp`: Un [timestamp de Lamport](https://en.wikipedia.org/wiki/Lamport_timestamp) para identificar cada evento de botón.

  > Nota: Este timestamp no está numerado según la hora actual. Piénsalo como un contador que empieza en 0 y se incrementa en 1 por cada evento.
* `hit`: Un objeto que contiene los siguientes datos sobre el evento de hit:
  * `entityId`: Número de Id de la Entity que fue impactada por el rayo.
  * `meshName`: *String* con el nombre interno del mesh específico del modelo 3D que fue impactado. Esto es útil cuando un modelo 3D está compuesto por múltiples meshes.
  * `origin`: *Vector3* para la posición donde se origina el rayo (relativa a la Scene)
  * `position`: *Vector3* para la posición donde el rayo intersectó con la Entity impactada (relativa a la Scene)
  * `length`: Longitud del rayo desde su origen hasta la posición donde ocurrió el impacto contra la Entity.
  * `normalHit`: *Vector3* con un vector de dirección normalizado, que describe el ángulo de la normal del hit en el espacio mundial.

```ts
function PointerReadingSystem() {
  const clickedCubes = engine.getEntitiesWith(PointerEventsResult)
  for (const [entity] of clickedCubes) {

    const result = PointerEventsResult.getOrNull(entity)
    if(result){
      console.log("POINTER EVENT DATA:", result.commands)
    }
  }
}

engine.addSystem(PointerReadingSystem)
```

## Seguir los movimientos del jugador

En juegos multijugador en tiempo real donde el timing de los movimientos del jugador es crítico, puede que quieras hacer un seguimiento de la posición de cada jugador usando un servidor de terceros como fuente de verdad. Puedes mejorar el tiempo de respuesta escuchando el botón con anticipación y prediciendo sus efectos en tu servidor antes de que el avatar haya cambiado de posición.

Este enfoque ayuda a compensar los retrasos de red, pero seguramente dará lugar a discrepancias, así que también deberías consultar regularmente la posición actual del jugador para hacer correcciones. Equilibrar estas predicciones y correcciones puede requerir bastante ajuste fino.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/interactividad/eventos-de-boton/advanced-button-events.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
