Criar um sistema de diálogo no Godot com GDScript
No desenvolvimento de jogos, a jogabilidade envolvente e a narrativa cativante são fundamentais para criar experiências memoráveis. Uma ferramenta poderosa que pode ajudar a conseguir isto é um sistema de diálogo.
Um mecanismo de diálogo corretamente executado permite que as personagens conversem, troquem dados e se liguem aos jogadores, melhorando assim a riqueza e a qualidade imersiva da experiência de jogo.
Configurando seu jogo Godot
Inicie o processo de desenvolvimento construindo a estrutura fundamental do seu jogo. Neste caso, estabelece um cenário bidimensional básico com um avatar que pode navegar utilizando as teclas de setas.
O código-fonte utilizado nesta publicação pode ser acedido através de um repositório público no GitHub, que o disponibiliza gratuitamente para sua conveniência ao abrigo dos termos da licença MIT amplamente aceite.
Incorpore o trecho de código fornecido no Unity iniciando uma nova configuração para a presença do personagem do jogador. Introduza uma instância do objeto CharacterBody2D
e ligue-o à cena. Depois, anexa um componente CollisionShape2D
com uma forma retangular para determinar os limites dentro dos quais o jogador interage com outros objectos no mundo do jogo.
Incorpore a mobilidade e a interatividade da personagem com objectos baseados em plataformas, utilizando o GDScript para substituir o script predefinido do componente CharacterBody2D. O código fornecido é o seguinte:
extends CharacterBody2D
var speed = 300
func _physics_process(delta):
var input_dir = Vector2.ZERO
if Input.is_action_pressed("ui_left"):
input_dir.x -= 1
if Input.is_action_pressed("ui_right"):
input_dir.x \\+= 1
if Input.is_action_pressed("ui_up"):
input_dir.y -= 1
if Input.is_action_pressed("ui_down"):
input_dir.y \\+= 1
velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)
O presente código permite que o protagonista navegue através de comandos de teclas de setas, facilitando a sua progressão através de uma variedade de plataformas, tendo em conta quaisquer interacções ou colisões que possam ocorrer.
Adicionar a caixa de diálogo
Quando se inicia o desenvolvimento de um sistema de diálogo, a fase inicial envolve a incorporação de uma interface para mostrar texto após a interação entre a personagem do jogador e determinados objectos ou personagens não-jogadores (NPCs).
Para melhorar a funcionalidade do nosso guião CharacterBody2D
, devemos incorporar variáveis adicionais que nos permitam gerir eficazmente a caixa de diálogo e o seu conteúdo. Isto pode ser conseguido através da introdução de novas variáveis, tais como _dialogBox
, _previousLine
, e _currentLine
. O primeiro terá a referência ao objeto da caixa de diálogo, enquanto os dois últimos representarão a linha atual que está a ser escrita no campo de texto e a linha anterior, respetivamente. Ao utilizar estas variáveis, podemos implementar funcionalidades como a recuperação do histórico e a atualização em tempo real do campo de texto de entrada durante a digitação.
var dialogue_box: Label
var close_button: Button
var dialogue_lines: Array = ["Hello, adventurer!", "Welcome to our village."]
var current_line: int = 0
var line_timer: float = 0
A caixa de diálogo
foi concebida para exibir o conteúdo da conversa e o botão fechar
serve para que os utilizadores possam fechar a caixa de diálogo sempre que considerem necessário.
Na função ready
, vou criar e inicializar uma caixa de diálogo para a nossa aplicação. Esta caixa de diálogo é essencial para fornecer uma interface entre o utilizador e o programa, permitindo-lhe interagir com ele de uma forma significativa. A caixa de diálogo pode apresentar várias mensagens ou avisos, dependendo das acções que estão a ser executadas pelo utilizador ou pelo programa. Além disso, esta caixa de diálogo serve de contentor para outros componentes que adicionaremos mais tarde, como botões ou campos de texto, que permitirão aos utilizadores introduzir dados ou realizar tarefas específicas na aplicação.
func _ready():
dialogue_box = Label.new()
dialogue_box.visible = false
add_child(dialogue_box)
Apresentação do texto da caixa de diálogo
Pode agora concentrar-se na apresentação do conteúdo da caixa de diálogo. É possível estender o texto por várias linhas e ativar o scrolling, mostrando apenas uma linha de cada vez.
Para modificar a função de processo da física de modo a acomodar a apresentação de linhas de diálogo, siga estes passos:1. Adicione uma nova variável chamada “linhas de diálogo” para armazenar os dados de texto para cada linha de diálogo. Isto pode ser feito criando uma matriz vazia e atribuindo-a à chave “dialogueLines” no objeto ou script desejado.2. Actualize o ciclo de simulação para incluir o tratamento das linhas de diálogo. Dentro deste ciclo, recupere os dados de texto da matriz “dialogueLines” utilizando o valor do índice como identificador. Depois, actualize o posicionamento e a apresentação do balão de diálogo de acordo com as propriedades definidas no documento de design original.
if line_timer > 0:
line_timer -= delta
elif current_line < dialogue_lines.size():
show_next_dialogue_line()
O trecho de código apresentado avalia se o valor da variável line\_timer excede um determinado limiar. Caso esta condição seja verdadeira, o valor do temporizador é reduzido pelo valor delta especificado. Além disso, se o temporizador estiver inativo e ainda houver conteúdo de diálogo adicional a ser apresentado, é invocada a sub-rotina show\_next\_dialogue\_line.
Implementar a função show_next_dialogue_line da seguinte forma:
func show_next_dialogue_line():
dialogue_box.text = dialogue_lines[current_line]
current_line \\+= 1
# Display each line for 3 seconds
line_timer = 3.0
A função present-day modifica o texto contido no balão de diálogo com a expressão mais recente e aumenta o valor do contador de linhas atual. Um temporizador, designado por “line\_timer”, regula o tempo que cada frase permanece visível no ecrã antes de passar à mensagem seguinte.
Adicionar um botão Fechar
Agora pode dar aos jogadores a opção de fechar a janela de conversação e prosseguir com o jogo. Isto pode ser conseguido através da incorporação de um botão “fechar” na caixa de diálogo que, ao ser premido, oculta a referida janela e permite ao participante voltar a entrar na progressão do jogo.
Modificar a função existente ready
para gerar um botão de fechar com a funcionalidade correspondente, incorporando o código HTML necessário para o botão de fechar na função de escuta de eventos que abre a janela modal.
func _ready():
dialogue_box = Label.new()
dialogue_box.visible = false
add_child(dialogue_box)
close_button = Button.new()
close_button.text = "Close"
close_button.position = Vector2(50, 30)
close_button.visible = false
close_button.pressed.connect(_on_close_button_pressed)
add_child(close_button)
O código fornecido gera um objectoButton, adapta a sua apresentação visual e colocação e estabelece uma ligação entre o sinal do evento de premir e a função\_on\_close\_button\_pressed\*.
Incorpore um novo método chamado _on_close_button_pressed
na classe GameUIManager
. Nesta função, certifique-se de que tanto a visibilidade da caixa de diálogo como o seu botão de fechar estão definidos para false
. Ao fazê-lo, o utilizador deixa de poder ver ou interagir com a interface de diálogo.
Para recomeçar, é prudente repor o índice da linha atual no seu estado original de zero, de forma a garantir que o nosso discurso começa de novo em cada momento em que o participante solicita a comunicação:
func _on_close_button_pressed():
dialogue_box.visible = false
close_button.visible = false
current_line = 0
Através desta modificação, os participantes terão a possibilidade de participar numa conversa e de abandonar a caixa de diálogo quando assim o entenderem, permitindo-lhes retomar a navegação ou a interação com o ambiente digital, conforme desejarem.
Melhores práticas para o seu sistema de diálogo
Ao melhorar e aperfeiçoar progressivamente o seu modelo de conversação, concentrar-se nestas directrizes recomendadas pode facilitar o enriquecimento ideal da profundidade narrativa e da imersão dos seus jogadores.
A consistência é fundamental
A manutenção de uma abordagem linguística uniforme é crucial para fomentar uma ligação autêntica entre o jogador e as personagens do jogo, ao mesmo tempo que promove uma atmosfera coesa no ambiente virtual. Esta consistência inabalável permite estabelecer uma relação entre o jogador e a narrativa, melhorando assim a sua experiência global ao garantir uma aventura suave e absorvente.
Criar vozes de personagens
Para criar personagens autênticas e convincentes, é importante dar a cada indivíduo uma voz e um temperamento únicos que emanam da sua história, objectivos e sentimentos. Isto permitirá que os leitores ou espectadores compreendam melhor e se liguem a elas a um nível emocional.
A incorporação de padrões de discurso e maneirismos distintivos para cada personagem não só aumenta a sua individualidade, como também contribui para trocas memoráveis entre eles, uma vez que fornece um identificador único que distingue uma personalidade da outra. Felizmente, a implementação destas variações é simples no âmbito do Godot, permitindo aos programadores criar pistas de áudio diversas com um esforço mínimo.
Escolhas com significado
Incorporar resultados de escolha que tenham implicações significativas tanto para o enredo como para as interacções jogador-personagem. Ao afetar aspectos como o desenvolvimento do enredo, a dinâmica interpessoal ou as regras fundamentais do jogo, estas selecções consequentes motivam os utilizadores a participar ativamente nas sequências de conversação e promovem o compromisso emocional com as suas escolhas.
Teste e Iteração
Faça uma avaliação exaustiva das suas sequências de diálogo, verificando cuidadosamente se existem erros ortográficos, inconsistências gramaticais e desequilíbrios de ritmo. Utilize técnicas de teste de jogo para recolher informações dos jogadores e implementar as modificações necessárias para garantir uma interação perfeita e uma experiência de jogo melhorada através do sistema de diálogo.
Consistência da interface do utilizador
Ao conceber um sistema de diálogo para um jogo de vídeo, é importante garantir que o seu aspeto e disposição se alinham com a conceção mais ampla da interface do utilizador do jogo. Manter a consistência em termos de componentes visuais, como estilos de letra, esquemas de cores e outros elementos gráficos, pode ajudar a promover um ambiente de jogo envolvente, promovendo um aspeto unificado em todos os aspectos do jogo.
A adesão a estas abordagens recomendadas permite o desenvolvimento de um sistema baseado em diálogos que não só melhora a narrativa do jogo, como também promove um encontro inesquecível e envolvente para os jogadores.
Elevando os seus jogos Godot com sistemas de diálogo
A integração de um sistema baseado em diálogo nos seus jogos Godot tem o potencial de aumentar o envolvimento do jogador e transformar as técnicas narrativas. Ao facilitar a comunicação entre personagens, a expressão de emoções e a resposta às escolhas do jogador, é criado um ambiente de jogo cada vez mais envolvente e interligado.
Utilizando a plataforma intuitiva fornecida pelo Godot e aproveitando as capacidades da sua linguagem de script, o GDScript, os programadores estão equipados com os meios para criar sistemas de diálogo cativantes que mergulham efetivamente os jogadores numa narrativa convincente e elevam a sua experiência geral de jogo.