# Eventos avançados de botão

Se você precisar que a interação na sua cena siga uma lógica personalizada que não seja compatível com os [Registrar callback](/creator/content-creator-pt/scenes-sdk7/interatividade/eventos-de-botao/register-callback.md) ou o [baseadas em System](/creator/content-creator-pt/scenes-sdk7/interatividade/eventos-de-botao/system-based-events.md) abordagens, você pode lidar diretamente com os dados brutos do evento de input. Essa abordagem é a mais difícil, mas a mais flexível.

## O componente PointerEventsResult

Quando um evento de pointer é detectado pelo engine, a entity que foi clicada recebe um `PointerEventsResult` componente. Esse componente contém todos os dados brutos sobre o evento de hit e armazena dados históricos sobre eventos anteriores.

Os helpers em `Input`, como `inputSystem.wasJustClicked` ou `inputSystem.getInputCommand` são bons para a maioria dos cenários simples, mas se você precisar obter mais detalhes sobre o evento de hit, verifique os dados brutos no `PointerEventsResult`.

O `PointerEventsResult` armazena um `commands` array, contendo um objeto para cada evento de pointer que ele armazena. Ele armazena uma lista de até 30 eventos, e os eventos mais recentes são armazenados no final do array. Quando a lista atinge um comprimento de 30, ela começa a descartar eventos antigos para cada novo evento que chega.

Cada evento no `commands` array tem os seguintes dados:

* `analog`: Flag para indicar se o evento vem de um input analógico ou digital. Inputs digitais têm um valor de *1*, inputs analógicos (como um joystick) têm um valor de *0*.
* `button`: Qual id de botão foi pressionado. O número corresponde ao `InputAction` enum, que lista todos os botões disponíveis.
* `state`: Tipo de evento de pointer, do enum `PointerEventType`. *0* se refere a `PointerEventType.PET_DOWN`, *1* // desenhar UI `PointerEventType.PET_UP`, *2* // desenhar UI `PointerEventType.PET_HOVER_ENTER`, *3* // desenhar UI `PointerEventType.PET_HOVER_LEAVE`
* `timestamp`: Um [timestamp lamport](https://en.wikipedia.org/wiki/Lamport_timestamp) para identificar cada evento de botão.

  > Nota: Esse timestamp não é numerado com base no horário atual. Pense nele como um contador que começa em 0 e é incrementado em 1 para cada evento.
* `hit`: Um objeto que contém os seguintes dados sobre o evento de hit:
  * `entityId`: Número de id da entity que foi atingida pelo ray.
  * `meshName`: *String* com o nome interno do mesh específico no modelo 3D que foi atingido. Isso é útil quando um modelo 3D é composto por vários meshes.
  * `origin`: *Vector3* para a posição onde o ray se origina (relativa à scene)
  * `position`: *Vector3* para a posição onde o ray intersectou a entity atingida (relativa à scene)
  * `length`: Comprimento do ray desde sua origem até a posição onde ocorreu o hit contra a entity.
  * `normalHit`: *Vector3* com um vetor de direção normalizado, descrevendo o ângulo da normal do hit no world space.

```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)
```

## Rastrear movimentos do jogador

Em jogos multiplayer em tempo real, em que o timing dos movimentos do jogador é crítico, você pode querer acompanhar a posição de cada jogador usando um servidor de terceiros como fonte da verdade. Você pode melhorar o tempo de resposta ouvindo o botão com antecedência e prevendo seus efeitos no seu servidor antes que o avatar tenha mudado de posição.

Essa abordagem ajuda a compensar atrasos de rede, mas certamente resultará em discrepâncias, então você também deve consultar regularmente a posição atual do jogador para fazer correções. Equilibrar essas previsões e correções pode exigir muito ajuste fino.


---

# Agent Instructions: 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:

```
GET https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/interatividade/eventos-de-botao/advanced-button-events.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
