> 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-pt/scenes-sdk7/interatividade/eventos-de-botao/advanced-button-events.md).

# Eventos Avançados de Botão

Saiba como lidar com cliques de usuário na sua scene.

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

## O componente PointerEventsResult

Quando um evento de pointer é detetado pelo Engine, a Entity que foi clicada recebe um `PointerEventsResult` componente. Este componente contém todos os dados brutos sobre o evento de impacto e armazena dados históricos sobre eventos anteriores.

As funções auxiliares em `inputSystem`, como `inputSystem.isTriggered` ou `inputSystem.getInputCommand` são boas para a maioria dos cenários simples, mas, se precisar de obter mais detalhes sobre o evento de impacto, consulte os dados brutos no `PointerEventsResult`.

O `PointerEventsResult` o componente contém uma lista de eventos de pointer, contendo um objeto para cada evento. Armazena uma lista de até 100 eventos; os eventos mais recentes são armazenados no fim da lista. Quando a lista atinge um tamanho de 100, começa a descartar eventos antigos a cada novo evento que chega.

Cada evento da lista tem os seguintes dados:

* `analógico`: Número opcional, presente apenas em eventos de um input analógico (como um joystick), que guarda o valor analógico do input.
* `button`: Que id do 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* refere-se a `PointerEventType.PET_UP`, *1* como `PointerEventType.PET_DOWN`, *2* como `PointerEventType.PET_HOVER_ENTER`, *3* como `PointerEventType.PET_HOVER_LEAVE`, *4* como `PointerEventType.PET_PROXIMITY_ENTER`, *5* como `PointerEventType.PET_PROXIMITY_LEAVE`
* `timestamp`: Um [timestamp de Lamport](https://en.wikipedia.org/wiki/Lamport_timestamp) para identificar cada evento de botão.

  > Nota: este timestamp não é numerado com base na hora atual. Pense nele como um contador que começa em 0 e é incrementado em 1 para cada evento.
* `impacto`: Um objeto que contém os seguintes dados sobre o evento de impacto:
  * `entityId`: Número de identificação da Entity que foi atingida pelo raio.
  * `meshName`: *String* com o nome interno da malha específica no modelo 3D que foi atingida. Isso é útil quando um modelo 3D é composto por várias malhas.
  * `globalOrigin`: *Vector3* para a posição de onde o raio se origina (relativa à scene)
  * `direção`: *Vector3* com o vetor de direção do ray, em coordenadas globais
  * `position`: *Vector3* para a posição onde o raio se intersectou com a Entity atingida (relativa à scene)
  * `length`: Comprimento do raio desde sua origem até a posição em que ocorreu o impacto contra a Entity.
  * `normalHit`: *Vector3* com um vetor de direção normalizado, que descreve o ângulo da normal do impacto no espaço global.

```ts
import { engine, PointerEventsResult } from '@dcl/sdk/ecs'

function PointerReadingSystem() {
  for (const [entity] of engine.getEntitiesWith(PointerEventsResult)) {
    const events = PointerEventsResult.get(entity)
    for (const event of events) {
      console.log('POINTER EVENT DATA:', event)
    }
  }
}

engine.addSystem(PointerReadingSystem)
```

## Acompanhar movimentos do jogador

Em jogos multijogador em tempo real, em que o timing dos movimentos do jogador é crítico, pode querer acompanhar a posição de cada jogador usando um servidor de terceiros como a fonte de verdade. Pode melhorar o tempo de resposta ao escutar o botão com antecedência e prever os seus efeitos no seu servidor antes de o avatar mudar de posição.

Esta abordagem ajuda a compensar atrasos de rede, mas certamente resultará em discrepâncias, por isso também deve verificar regularmente a posição atual do jogador para fazer correções. Equilibrar estas previsões e correções pode exigir muitos ajustes finos.


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
