<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Mailing list</title>
    <link>https://news.vertexludi.com.br</link>
    <description>Arquivo da lista de emails</description>
    <item>
      <title>Godot 4.5 foi lançada!</title>
      <link>https://news.vertexludi.com.br/archive/godot-4-5</link>
      <description></description>
      <content:encoded><![CDATA[<!doctype html>
<html>
    <head>
        <title>Godot 4.5 foi lançada!</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
        <base target="_blank">
        <style>
            body {
                background-color: #F0F1F3;
                font-family: 'Helvetica Neue', 'Segoe UI', Helvetica, sans-serif;
                font-size: 15px;
                line-height: 26px;
                margin: 0;
                color: #444;
            }

            pre {
                background: #f4f4f4f4;
                padding: 2px;
            }

            table {
                width: 100%;
                border: 1px solid #ddd;
            }
            table td {
                border-color: #ddd;
                padding: 5px;
            }

            .wrap {
                background-color: #fff;
                padding: 30px;
                max-width: 525px;
                margin: 0 auto;
                border-radius: 5px;
            }

            .button {
                background: #0055d4;
                border-radius: 3px;
                text-decoration: none !important;
                color: #fff !important;
                font-weight: bold;
                padding: 10px 30px;
                display: inline-block;
            }
            .button:hover {
                background: #111;
            }

            .footer {
                text-align: center;
                font-size: 12px;
                color: #888;
            }
                .footer a {
                    color: #888;
                    margin-right: 5px;
                }

            .gutter {
                padding: 30px;
            }

            img {
                max-width: 100%;
                height: auto;
            }

            a {
                color: #0055d4;
            }
                a:hover {
                    color: #111;
                }
            @media screen and (max-width: 600px) {
                .wrap {
                    max-width: auto;
                }
                .gutter {
                    padding: 10px;
                }
            }
        </style>
    </head>
<body style="background-color: #F0F1F3;font-family: 'Helvetica Neue', 'Segoe UI', Helvetica, sans-serif;font-size: 15px;line-height: 26px;margin: 0;color: #444;">
    <div class="gutter" style="padding: 30px;">&nbsp;</div>
    <div class="wrap" style="background-color: #fff;padding: 30px;max-width: 525px;margin: 0 auto;border-radius: 5px;">
      <div><a href="https://www.vertexludi.com.br?utm_source=newsletter"><img src="https://news.vertexludi.com.br/uploads/logo.png"/></a></div>
        <h1 id="godot-45-foi-lanada">Godot 4.5 foi lançada!</h1>
<p>Após seis meses de <del>espera</del> trabalho desde o lançamento da 4.4, a nova versão menor da Godot Engine está <a href="https://godotengine.org/download/archive/4.5-stable/">finalmente aqui</a>!</p>
<h2 id="destaques">Destaques</h2>
<p>Como sempre, uma nova versão do Godot traz novos recursos, melhorias e correções de bugs graças ao trabalho de muitos contribuidores incríveis (que superaram o número de 3000 nesta versão), entre voluntários, pessoas que trabalham para empresas de terceiros e pessoas contratadas pela Fundação Godot.</p>
<p>Com mais de 2000 <em>commits</em>, é impossível cobrir tudo aqui. Você pode conferir a lista completa usando o <a href="https://godotengine.github.io/godot-interactive-changelog/#4.5">registro de alterações interativo</a>. Vou listar aqui alguns dos pontos mais interessantes:</p>
<ul>
<li>Suporte para <strong>stencil buffers</strong> (<a href="https://github.com/godotengine/godot/pull/80710">PR</a>), permitindo muitos efeitos interessantes, como portais.</li>
<li>Geração de <strong>rastros de pilha</strong> (<em>backtraces</em>) de <em>scripts</em>, mesmo em projetos exportados (<a href="https://github.com/godotengine/godot/pull/91006">PR</a>), o que permite aos desenvolvedores de jogos registrar problemas quando são detectados. É uma grande ajuda para investigar registros (<em>logs</em>) fornecidos pelos jogadores, já que podem ter informações mais específicas sobre a falha.</li>
<li>Pré-visualização em tempo real para <strong>localização</strong> (<a href="https://github.com/godotengine/godot/pull/96921">PR</a>), um recurso que permite ver como a cena ficará em diferentes idiomas, sem sair do editor.
<ul>
<li>Da mesma forma, agora você também pode mudar o <strong>idioma do editor</strong> sem reiniciá-lo (<a href="https://github.com/godotengine/godot/pull/102562">PR</a>).</li>
</ul>
</li>
<li>Suporte para <strong>leitores de tela</strong> (<a href="https://github.com/godotengine/godot/pull/76829">PR</a>), permitindo que jogos e o editor sejam melhor usados por pessoas com deficiência visual e outras que precisam de assistência de leitura. Um grande avanço para a acessibilidade.</li>
<li><strong>Física de <em>tilemap</em></strong> por <em>chunks</em> (<a href="https://github.com/godotengine/godot/pull/102662">PR</a>), um novo sistema que agrupa células de <em>tilemap</em> em formas de colisão maiores, melhorando muito o desempenho.</li>
<li>Melhorias no <strong>gerador de perfil de compilação</strong> (<a href="https://github.com/godotengine/godot/pulls?q=is%253Apr+is%253Amerged+103719+104129">PRs</a>), um recurso subestimado que permite gerar um perfil de compilação que pode ser usado para compilar uma versão otimizada do Godot apenas com os recursos que você utiliza. Esta melhoria torna a detecção de uso muito melhor.</li>
<li>Recursos do GDScript como <strong>funções variádicas</strong> (<a href="https://github.com/godotengine/godot/pull/82808">PR</a>) e <strong>classes e métodos abstratos</strong> (<a href="https://github.com/godotengine/godot/pulls?q=is%3Apr+is%3Amerged+67777+106409+107717">PRs</a>).</li>
</ul>
<p>A lista é bem longa. Você pode ver esses e mais destaques na <a href="https://godotengine.org/releases/4.5/">página de lançamento</a>. Você já pode <a href="https://godotengine.org/download">baixar</a> o Godot 4.5 e, se gostar, não se esqueça de <a href="https://fund.godotengine.org/">fazer uma doação</a>.</p>

      <hr>
      <div><p><em>Se você precisa de suporte profissional para seu projeto Godot, contate <a href="https://www.vertexludi.com.br?utm_source=newsletter">Vertex Ludi</a>.</em></p></div>
    </div>
    
    <div class="footer" style="text-align: center;font-size: 12px;color: #888;">
        <p>
            <a href="https://news.vertexludi.com.br/subscription/ef6b7c94-16af-40ad-beb7-49c7d02e3990/" style="color: #888;">Cancelar assinatura</a>
            &nbsp;&nbsp;
            <a href="https://news.vertexludi.com.br/campaign/ef6b7c94-16af-40ad-beb7-49c7d02e3990/" style="color: #888;">Ver no Navegador</a>
        </p>
    </div>
    <div class="gutter" style="padding: 30px;">&nbsp;<img src="https://news.vertexludi.com.br/campaign/ef6b7c94-16af-40ad-beb7-49c7d02e3990/00000000-0000-0000-0000-000000000000/px.png" alt="" /></div>
</body>
</html>
]]></content:encoded>
      <pubDate>Sun, 14 Sep 2025 15:47:03 +0000</pubDate>
    </item>
    <item>
      <title>Bem-vindos ao nosso blog!</title>
      <link>https://news.vertexludi.com.br/archive/bem-vindo</link>
      <description></description>
      <content:encoded><![CDATA[<!doctype html>
<html>
    <head>
        <title>Bem-vindos ao nosso blog!</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
        <base target="_blank">
        <style>
            body {
                background-color: #F0F1F3;
                font-family: 'Helvetica Neue', 'Segoe UI', Helvetica, sans-serif;
                font-size: 15px;
                line-height: 26px;
                margin: 0;
                color: #444;
            }

            pre {
                background: #f4f4f4f4;
                padding: 2px;
            }

            table {
                width: 100%;
                border: 1px solid #ddd;
            }
            table td {
                border-color: #ddd;
                padding: 5px;
            }

            .wrap {
                background-color: #fff;
                padding: 30px;
                max-width: 525px;
                margin: 0 auto;
                border-radius: 5px;
            }

            .button {
                background: #0055d4;
                border-radius: 3px;
                text-decoration: none !important;
                color: #fff !important;
                font-weight: bold;
                padding: 10px 30px;
                display: inline-block;
            }
            .button:hover {
                background: #111;
            }

            .footer {
                text-align: center;
                font-size: 12px;
                color: #888;
            }
                .footer a {
                    color: #888;
                    margin-right: 5px;
                }

            .gutter {
                padding: 30px;
            }

            img {
                max-width: 100%;
                height: auto;
            }

            a {
                color: #0055d4;
            }
                a:hover {
                    color: #111;
                }
            @media screen and (max-width: 600px) {
                .wrap {
                    max-width: auto;
                }
                .gutter {
                    padding: 10px;
                }
            }
        </style>
    </head>
<body style="background-color: #F0F1F3;font-family: 'Helvetica Neue', 'Segoe UI', Helvetica, sans-serif;font-size: 15px;line-height: 26px;margin: 0;color: #444;">
    <div class="gutter" style="padding: 30px;">&nbsp;</div>
    <div class="wrap" style="background-color: #fff;padding: 30px;max-width: 525px;margin: 0 auto;border-radius: 5px;">
      <div><a href="https://www.vertexludi.com.br?utm_source=newsletter_archive"><img src="https://news.vertexludi.com.br/uploads/logo.png"/></a></div>
        <h1 id="bem-vindos-ao-nosso-blog">Bem-vindos ao nosso blog!</h1>
<p>Bem-vindos ao nosso novo blog Vertex Ludi! O nosso objetivo é compartilhar novidades sobre a Godot Engine e a Vertex Ludi, além de algumas dicas sobre como usar a Godot ou sobre desenvolvimento de jogos em geral.</p>
<p>Os posts serão publicadas com baixa frequência, com novas postagens saindo entre duas semanas e um mês após a anterior. Você pode acompanhar o feed RSS, se preferir. Também planejamos postar em nossas redes sociais sempre que um novo artigo estiver disponível, então não deixe de nos seguir! Os links estão no rodapé da página.</p>
<p>Para receber os posts em sua caixa de entrada antes de serem publicados no site, inscreva-se usando o formulário no final do artigo. Elas chegarão com a mesma frequência dos posts em si, mas poderemos eventualmente enviar posts exclusivos apenas para assinantes.</p>
<p>Entre em contato conosco se quiser sugerir conteúdo para o nosso blog. Temos interesse em saber o que você gostaria de ver aqui.</p>
<p>Embora pretendamos que a frequência seja baixa, o próximo post, com conteúdo relevante, deve sair em breve. Portanto, fique de olho por aqui.</p>
<p>Até logo!</p>

      <hr>
      <div><p><em>Se você precisa de suporte profissional para seu projeto Godot, contate <a href="https://www.vertexludi.com.br?utm_source=newsletter_archive">Vertex Ludi</a>.</em></p></div>
    </div>
    
    <div class="footer" style="text-align: center;font-size: 12px;color: #888;">
        <p>Desenvolvido por <a href="https://listmonk.app" target="_blank" rel="noreferrer" style="color: #888;">listmonk</a></p>
    </div>
    <script type="module" data-entity="news.vertexludi.com.br-archive" src="https://a.vertexludi.com/script.js"></script>
    <div class="gutter" style="padding: 30px;">&nbsp;<img src="https://news.vertexludi.com.br/campaign/887606ae-fd35-4b56-bf2a-2c2b1301b8aa/00000000-0000-0000-0000-000000000000/px.png" alt="" /></div>
</body>
</html>
]]></content:encoded>
      <pubDate>Sun, 22 Jun 2025 22:55:28 +0000</pubDate>
    </item>
    <item>
      <title>Gerenciador de Mensagens Global</title>
      <link>https://news.vertexludi.com.br/archive/00c4db1e-e4fa-432d-beee-6498e13c54f2</link>
      <description></description>
      <content:encoded><![CDATA[<!doctype html>
<html>
    <head>
        <title>Gerenciador de Mensagens Global</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
        <base target="_blank">
        <style>
            body {
                background-color: #F0F1F3;
                font-family: 'Helvetica Neue', 'Segoe UI', Helvetica, sans-serif;
                font-size: 15px;
                line-height: 26px;
                margin: 0;
                color: #444;
            }

            pre {
                background: #f4f4f4f4;
                padding: 2px;
            }

            table {
                width: 100%;
                border: 1px solid #ddd;
            }
            table td {
                border-color: #ddd;
                padding: 5px;
            }

            .wrap {
                background-color: #fff;
                padding: 30px;
                max-width: 525px;
                margin: 0 auto;
                border-radius: 5px;
            }

            .button {
                background: #0055d4;
                border-radius: 3px;
                text-decoration: none !important;
                color: #fff !important;
                font-weight: bold;
                padding: 10px 30px;
                display: inline-block;
            }
            .button:hover {
                background: #111;
            }

            .footer {
                text-align: center;
                font-size: 12px;
                color: #888;
            }
                .footer a {
                    color: #888;
                    margin-right: 5px;
                }

            .gutter {
                padding: 30px;
            }

            img {
                max-width: 100%;
                height: auto;
            }

            a {
                color: #0055d4;
            }
                a:hover {
                    color: #111;
                }
            @media screen and (max-width: 600px) {
                .wrap {
                    max-width: auto;
                }
                .gutter {
                    padding: 10px;
                }
            }
        </style>
    </head>
<body style="background-color: #F0F1F3;font-family: 'Helvetica Neue', 'Segoe UI', Helvetica, sans-serif;font-size: 15px;line-height: 26px;margin: 0;color: #444;">
    <div class="gutter" style="padding: 30px;">&nbsp;</div>
    <div class="wrap" style="background-color: #fff;padding: 30px;max-width: 525px;margin: 0 auto;border-radius: 5px;">
      <div><a href="https://www.vertexludi.com.br?utm_source=newsletter_archive"><img src="https://news.vertexludi.com.br/uploads/logo.png"/></a></div>
        <h1 id="gerenciador-de-mensagens-global">Gerenciador de Mensagens Global</h1>
<p>Sinais são um recurso poderoso do Godot. Eles permitem que mensagens sejam transmitidas sem que o emissor saiba quem realmente se inscreveu para recebê-las. No entanto, às vezes, o assinante também não sabe sobre o emissor. Manter uma referência ao objeto pode ser complicado e pode acoplar seu projeto de maneiras que você não deseja. É aí que um gerenciador de sinais global pode vir a calhar.</p>
<h2 id="padro-observer">Padrão Observer</h2>
<p>A palavra "global" às vezes soa como um monstro assustador no mundo da programação. Embora seja verdade que coisas globais possam se virar contra você de vez em quando, elas ainda são uma boa escolha para muitas coisas. Uma delas é o chamado <a href="https://gameprogrammingpatterns.com/observer.html">padrão <em>observer</em></a>.</p>
<p>O objetivo principal deste padrão é desacoplar o código que sabe sobre um evento do código que precisa tomar uma ação (não relacionada) quando isso acontece. Isso permite que os objetos se comuniquem sem necessariamente saberem uns dos outros. Acho que não consigo explicar isso melhor do que Bob Nystrom, então, para uma explicação mais aprofundada do padrão, clique no link anterior (o texto está em inglês, um tradutor automático é útil caso o idioma seja um problema).</p>
<h2 id="um-projeto-de-exemplo">Um projeto de exemplo</h2>
<p>Para demonstrar uma implementação do gerenciador de sinais, vamos construir um projeto bem simples. Faremos nosso clássico <em>icon.<del>png</del>svg</em> se mover para a esquerda ou direita de acordo com a tecla pressionado. Quando ele cair da plataforma, ele reaparecerá em um ponto específico.</p>
<p>Abra o Godot e crie um novo projeto em algum lugar. Vamos começar com o _ para resolver o problema. Vamos criar duas ações: <code>move_left</code> e <code>move_right</code>. Estou atribuindo as teclas <kbd>A</kbd> e <kbd>D</kbd> a elas, pois são comuns e facilmente acessíveis em um teclado comum. Por consistência com o projeto de demonstração, vamos manter os nomes em inglês.</p>
<p><img src="https://news.vertexludi.com.br/uploads/input-map.pt.png" alt="Configurações do mapa de entrada adicionando as ações &lsquo;move_left&rsquo; e &lsquo;move_right&rsquo;" /></p>
<p>Os passos aqui pressupõem que você já esteja familiarizado com o Godot. Se precisar de uma referência, você pode encontrar o projeto final em nosso <a href="https://news.vertexludi.com.br/link/90cd36d2-8cd8-4080-a084-21c9226c83c8/00c4db1e-e4fa-432d-beee-6498e13c54f2/00000000-0000-0000-0000-000000000000">GitHub</a>. Ele também não segue todas as práticas recomendadas para que possamos ter algo que se encaixe em um artigo.</p>
<h3 id="configurando-a-cena-de-exemplo">Configurando a cena de exemplo</h3>
<p>Vamos criar uma nova cena com um <code>Node2D</code> como raiz. Vou chamá-la de <code>Main</code>, pois é meu nome padrão para o nó raiz. Abaixo dela, crie um <code>StaticBody2D</code> para servir como plataforma. Para configurá-la, adicione um <code>CollisionShape2D</code> e defina um <code>RectangleShape2D</code> com um tamanho razoável, mas que não precise ultrapassar o <em>viewport</em>. Adicione um <code>Sprite2D</code> também para que possamos vê-lo e use o <code>icon.svg</code>, sem esquecer de esticá-lo para corresponder à forma da colisão.</p>
<p>Com o piso no lugar, vamos criar nosso personagem. Adicione um apropriadamente chamado <code>CharacterBody2D</code> ao nó raiz. Adicione <code>Sprite2D</code> como seu filho e defina o <code>icon.svg</code> como a textura. Assim como no piso, crie um <code>CollisionShape2D</code> e adicione um <code>RectangleShape2D</code> a ele. Faça com que a forma corresponda ao ícone, o que pode ser feito facilmente definindo ambas as dimensões para <code>128px</code>. Adicione também uma <code>Camera2D</code> ao nó do personagem para que a visualização o acompanhe. Mova o nó do personagem para um local acima do piso.</p>
<p>Em seguida, vamos criar uma área grande para detectar quando o personagem cai. Primeiro, crie um <code>Area2D</code> sob o nó raiz. Como já estamos acostumados, adicione um <code>CollisionShape2D</code> e configure um <code>RectangleShape2D</code>. Coloque a área bem abaixo do piso e torne-a grande o suficiente para sempre capturar o personagem.</p>
<p>Para configurar nosso ponto de spawn visualmente, adicione um nó <code>Marker2D</code> sob a raiz e posicione-o próximo ao personagem (não precisa ser exato). O importante é que o jogador reapareça sobre o piso.</p>
<p>Vamos nomear nossos nós para facilitar a referência. O nó do piso é chamado apenas de <code>Floor</code> e, portanto, o personagem também é chamado de <code>Character</code>. A área é chamada de <code>Catcher</code> porque captura o jogador. O <code>Marker2D</code> pode ser renomeado para <code>SpawnPoint</code>. Neste ponto, você deve ter uma cena semelhante a esta:</p>
<p><img src="https://news.vertexludi.com.br/uploads/scene-setup.pt.png" alt="Imagem de exemplo com a cena construída conforme descrito no texto" /></p>
<h3 id="movimento-do-personagem">Movimento do personagem</h3>
<p>Adicione um novo script ao nosso nó <code>Character</code>. Vamos aproveitar a física do Godot aqui para tornar o script de movimento bem simples. O código é o seguinte:</p>
<pre><code class="language-gdscript"># character.gd
extends CharacterBody2D

const SPEED := 250.0
const GRAVITY := 980.0

func _physics_process(_delta: float) -&gt; void:
	var direction := Input.get_axis(&quot;move_left&quot;, &quot;move_right&quot;)
	velocity.x = SPEED * direction
	velocity.y = GRAVITY
	move_and_slide()
</code></pre>
<p>Novamente, tomamos algumas liberdades aqui por uma questão de brevidade (como usar a gravidade como velocidade em vez de aceleração).</p>
<p>Se você reproduzir a cena neste momento, já poderá mover o personagem para a esquerda e para a direita. Se você ultrapassar as bordas do chão, o personagem cairá para sempre, pois não há nada para impedi-lo. Se você habilitar <code>Formas de Colisão Visíveis</code> no menu <code>Depuração</code>, poderá ver onde a área está.</p>
<h2 id="manipulador-de-mensagens">Manipulador de mensagens</h2>
<p>Antes de conectarmos as coisas, precisamos do nosso manipulador. Crie um novo script estendendo <code>Node</code> e chame-o de <code>message_handler.gd</code>. Para torná-lo global, vamos adicioná-lo como <code>Autoload</code> nas <code>Configurações do Projeto</code>. Aceite o nome padrão após selecionar o script (<code>MessageHandler</code>) e certifique-se de que a opção <code>Variável Global</code> esteja habilitada.</p>
<p>Estamos adicionando duas mensagens para este exemplo. Uma para quando um corpo é capturado pela área e outra para dizer ao personagem para reaparecer. Veja como fica:</p>
<pre><code class="language-gdscript"># message_handler.gd
extends Node

# Necessário porque não estamos usando os sinais neste script.
@warning_ignore_start(&quot;unused_signal&quot;)

sinal body_caught(corpo: PhysicsBody2D)
sinal respawn(para: Vector2)
</code></pre>
<p>Como você pode ver, estamos aproveitando o sistema de sinais embutido do Godot. Poderíamos criar uma abstração sobre ele para assinar e emitir eventos, mas esse é um trabalho desnecessário. Os sinais funcionam muito bem para isso e não precisamos substituí-los por outra coisa para justificar uma abstração.</p>
<h3 id="usando-o-gerenciador">Usando o gerenciador</h3>
<p>Agora podemos criar um script no nó <code>Main</code> (a raiz) para solicitar um respawn sempre que o personagem for capturado.</p>
<pre><code class="language-gdscript"># main.gd
extends Node2D

func _ready() -&gt; void:
	MessageHandler.body_caught.connect(_on_body_caught)

func _on_body_caught(_body: PhysicsBody2D) -&gt; void:
	MessageHandler.respawn.emit(($SpawnPoint as Marker2D).position)
</code></pre>
<p>Então, simplesmente conectamos um sinal e emitimos outro. A emissão é importante aqui porque o nó <code>Main</code> é quem conhece o <code>SpawnPoint</code>, então ele envia a posição dele.</p>
<p>O nó de área é responsável por emitir o outro sinal. Podemos fazer isso simplesmente com o seguinte script:</p>
<pre><code class="language-gdscript"># catcher.gd
extends Area2D

func _ready() -&gt; void:
	ody_entered.connect(_on_body_enter)

func _on_body_enter(body: PhysicsBody2D):
	MessageHandler.body_caught.emit(body)
</code></pre>
<p>Isso basicamente reemitirá seu próprio sinal <code>body_entered</code> com o sinal global. O interessante é que os observadores não precisarão encontrar o nó <code>Catcher</code> para se conectar a ele, já que podem usar o gerenciador global. Se você tiver uma conquista para quando o jogador cair 100 vezes, poderá colocar o contador em outro lugar e simplesmente se conectar ao sinal global.</p>
<p>Agora, o personagem precisa reagir ao sinal <code>respawn</code> e mudar sua própria posição. Podemos fazer isso adicionando duas funções ao script do personagem:</p>
<pre><code class="language-gdscript"># character.gd
extends CharacterBody2D

...

func _ready() -&gt; void:
	MessageHandler.respawn.connect(respawn)

func respawn(to: Vector2) -&gt; void:
	position = to
</code></pre>
<p>Primeiramente, conectamos ao sinal e, sempre que ele é disparado, simplesmente redefinimos a posição para onde o sinal aponta. Se você tiver vários checkpoints e quiser que o jogador reapareça em pontos diferentes dependendo da distância percorrida, o script do personagem não precisa saber disso, pois ele apenas reage ao sinal.</p>
<p>Se você reproduzir a cena agora e mover o personagem até que ele caia, verá que ele está reaparecendo de volta para onde o marcador está.</p>
<h3 id="um-uso-extra">Um uso extra</h3>
<p>O movimento é muito abrupto durante o respawn, então vamos adicionar uma mensagem para informar o jogador que isso aconteceu.</p>
<p>Começaremos adicionando uma <code>CanvasLayer</code> sob o nó raiz para termos uma camada limpa para a <abbr title="User Interface/Interface de Usuário">UI</abbr>. Em seguida, adicione uma <code>Label</code>, chame-a de <code>Respawned</code> e defina o texto para ser igual ao seu nome. Posicione-a no centro da tela, um pouco acima de onde o personagem está. Com a câmera seguindo o jogador, a posição do rótulo será sempre próxima ao mesmo local. Deixe o rótulo oculto por padrão.</p>
<p>Agora, vamos adicionar um script ao rótulo para que ele reaja à mensagem:</p>
<pre><code class="language-gdscript"># respawned.gd
extends Label

const SHOW_TIME := 2

func _ready() -&gt; void:
	MessageHandler.respawn.connect(_on_respawn)

func _on_respawn(_to: Vector2) -&gt; void:
	show()
	await get_tree().create_timer(SHOW_TIME).timeout
	hide()
</code></pre>
<p>Neste caso, não nos importamos com a posição, apenas que o respawn aconteça, mas ainda precisamos do parâmetro definido no <em>callback</em> para que ele possa ser chamado corretamente. Neste caso, ele simplesmente mostra a label (alterando sua propriedade <code>visible</code> para <code>true</code>), aguarda alguns segundos e a oculta novamente. Isso permite que o usuário veja que algo aconteceu além do movimento abrupto.</p>
<p>Observe que esta pode ser uma cena completamente separada e não precisa saber nada sobre o jogador ou o nível para exibir a mensagem. Esse é o principal benefício de usar um gerenciador de mensagens global.</p>
<h2 id="concluso">Conclusão</h2>
<p>Embora este exemplo simples não precise realmente de um gerenciador de mensagens global, sendo uma única cena e tal, serve como uma ilustração do poder de tal sistema. Em um projeto maior com múltiplas cenas, pode ser difícil e sujeito a erros conseguir referências dos nós para conectar sinais. À medida que o projeto cresce e as coisas se movem, essas conexões podem ser quebradas sem que alguém perceba.</p>
<p>Existem outras maneiras de lidar com casos como este, é claro. O sistema de sinais em Godot é poderoso, mas também simplista, então às vezes pode não ser suficiente. Um exemplo disso é quando você precisa implementar uma <a href="https://gameprogrammingpatterns.com/event-queue.html">fila de eventos</a>, que requer um pouco mais do que apenas conectar e emitir sinais. Se houver interesse, podemos incluir um artigo sobre como implementar uma fila de eventos em Godot. Informe-nos através de nosso e-mail <a href="mailto:contact@vertexludi.com">contact@vertexludi.com</a>.</p>
<p><em>Você pode acessar o projeto de demonstração construído neste artigo no seguinte repositório: <a href="https://news.vertexludi.com.br/link/90cd36d2-8cd8-4080-a084-21c9226c83c8/00c4db1e-e4fa-432d-beee-6498e13c54f2/00000000-0000-0000-0000-000000000000">https://github.com/vertexludi/godot-message-handler-demo</a></em>.</p>

      <hr>
      <div><p><em>Se você precisa de suporte profissional para seu projeto Godot, contate <a href="https://www.vertexludi.com.br?utm_source=newsletter_archive">Vertex Ludi</a>.</em></p></div>
    </div>
    
    <div class="footer" style="text-align: center;font-size: 12px;color: #888;">
        <p>Desenvolvido por <a href="https://listmonk.app" target="_blank" rel="noreferrer" style="color: #888;">listmonk</a></p>
    </div>
    <script type="module" data-entity="news.vertexludi.com.br-archive" src="https://a.vertexludi.com/script.js"></script>
    <div class="gutter" style="padding: 30px;">&nbsp;<img src="https://news.vertexludi.com.br/campaign/00c4db1e-e4fa-432d-beee-6498e13c54f2/00000000-0000-0000-0000-000000000000/px.png" alt="" /></div>
</body>
</html>
]]></content:encoded>
      <pubDate>Mon, 23 Jun 2025 11:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>