Fundamentos do desenvolvimento de jogos em Godot! | Thomas Yanuziello | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Fundamentos do desenvolvimento de jogos em Godot!

teacher avatar Thomas Yanuziello, Indie Game Developer

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução

      1:56

    • 2.

      Parar

      17:42

    • 3.

      Título

      15:59

    • 4.

      Transição

      14:18

    • 5.

      Autoload

      14:06

    • 6.

      Música

      15:09

    • 7.

      Configurações

      18:34

    • 8.

      Sair

      13:20

    • 9.

      Enter

      15:57

    • 10.

      Salve

      11:47

    • 11.

      Créditos

      11:41

    • 12.

      O que vem a seguir?

      1:40

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

67

Estudantes

1

Projetos

Sobre este curso

Este curso é uma continuação da introdução ao desenvolvimento de jogos 3D em Godot.

Clique no link do meu site no meu perfil para participar do nosso servidor de discord!

Neste curso, vamos abordar elementos essenciais que são comuns a quase qualquer jogo de qualquer gênero; paragem, menus, mudança de cenas, persistência de dados, música, configurações e mover um personagem entre diferentes áreas do seu jogo.

Você também vai aprender habilidades úteis para trabalhar com o motor de jogo Godot, organizar e projetar seus projetos para serem mais escaláveis.  Você vai aprender como codificar com GDscript, com tudo explicado em detalhes.  Nossos scripts serão escritos para serem altamente personalizáveis e reutilizáveis.  Todos os arquivos do projeto também estarão disponíveis no GitHub se você precisar revisar o projeto como estava depois de concluir cada aula.  Esses vídeos foram gravados usando a versão Godot 4.2.2.

Este curso vai fazer parte de uma série projetada para ensinar pedaços de desenvolvimento de jogos do tamanho de uma mordida que podem ser usados ​​de forma intercambiável uns com os outros.  Então, deixe-me saber quais tipos de jogos você é interessante em aprender como fazer e vou tentar incluí-los em futuros cursos desta série.

Conheça seu professor

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Professor
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução: Bem-vindo ao meu curso sobre os fundamentos do desenvolvimento de jogos e do Gado Este curso é uma continuação da introdução ao desenvolvimento de três jogos em D e ao Gado, mas pode ser seguido e aplicado a qualquer projeto que contenha um personagem que o jogador possa controlar para passar por vários níveis Você está convidado a se juntar ao nosso servidor de discórdia para trabalhar neste curso ao lado de seus colegas Neste curso, abordaremos elementos essenciais que são comuns a quase todos os jogos de qualquer gênero. Crie uma cena de título, menus, faça uma transição suave entre as cenas, mova um personagem entre os diferentes níveis do jogo, música de fundo, configurações e persistência de dados entre cenas, níveis Quando terminar, você terá uma boa estrutura básica de um jogo que poderá ser desenvolvida ainda mais em algo de seu próprio design, de qualquer gênero. Você também aprenderá habilidades úteis para trabalhar com o motor de jogo Gada, organizando e projetando seus projetos para serem mais escaláveis Você aprenderá a codificar com script GD com tudo explicado em detalhes Aplicaremos princípios de design orientado a objetos em nossos scripts, herança, encapsulamento e abstração, para mantê-los organizados, personalizáveis e reutilizáveis Todos os arquivos do projeto também estarão disponíveis no GitHub, se você precisar revisar o projeto como estava depois de concluir cada lição Esses vídeos foram gravados usando o Gadot versão 4.2 0.2. O projeto começa com ativos dos Ka Kit Character e Dungeon pacotes remasterizados Ka Kit Character e Dungeon feitos por Kay Neste curso, também adicionarei recursos do Basic Guy Bundle feito pela Penzilla e músicas no pacote Barns Music feito por Eric the Funny Baron feito por Eric Todos estão disponíveis para download gratuito no H dot IO. 2. Pare: Olá, amigos. Antes de começarmos, você deve ter uma cena de jogo em seu projeto, que contenha um personagem que o jogador possa controlar e um nível em que ele possa andar. Você deve ter pelo menos duas ou três cenas de níveis diferentes prontas para se conectar quando o jogador ultrapassar um limite Ao longo deste curso, adicionaremos elementos essenciais a qualquer tipo de jogo que você possa imaginar, incluindo menus, transições de cena e nível, redução visual e do áudio, configurações, créditos e configurações, créditos Você pode usar seu próprio projeto para acompanhar este curso ou baixar um projeto inicial do meu Github intitulado Godot Essentials acompanhar este curso ou baixar um projeto inicial do meu Github intitulado Godot Essentials course Main branch. Seu projeto pode ser dois D ou três D e quase qualquer gênero de jogo que envolva mover um personagem entre cenas diferentes. Vamos começar permitindo que o jogador pause o jogo. Abrindo as configurações do projeto e alternando para a guia Mapa de entrada, podemos adicionar uma nova ação para pausar e clicar no botão Adicionar Rolando para baixo, encontrando nossa nova ação de pausa, podemos adicionar eventos que acionarão essa ação de pausa clicando no botão Mais Vou usar a tecla Escape e o botão Iniciar no meu controle. Estamos usando o nó do jogador para lidar com informações do nosso jogo por meio do script do jogador em anexo e retransmitir as informações apropriadas para mover o personagem ou o braço de mola e a câmera Como fizemos com os botões de correr e pular, podemos verificar se o botão de pausa foi pressionado Mas não queremos pausar o personagem ou a câmera. Queremos pausar toda a cena. Podemos obter uma referência ao nó raiz da cena exportando outra variável Vamos chamá-lo de underscore GM, abreviação de gerenciador de jogos Mas o valor dessa variável nunca deveria realmente precisar ser alterado. Deve ser sempre o nó raiz da cena do jogo. Em vez de at export, poderíamos usar at on ready para definir o valor de nossa variável GM como pai, já que o nó do jogador é filho do nó do jogo Mas talvez não queiramos confiar nessa estrutura exata para que nosso script funcione corretamente. Podemos, por exemplo, querer que o nó do jogador seja filho do nó do personagem por outros motivos. Portanto, para fazer com que essa referência sempre aponte diretamente para o nó raiz do Scenes, podemos usar a anotação do cifrão Iniciando o caminho do nó com barra raiz e barra, começaremos com a raiz das árvores de cena Mas é importante observar que esse ainda não é o nó da cena do jogo. Também precisamos adicionar o nome do nó raiz ao ganho de barra raiz do caminho do nó Se executarmos nossa cena atual e, em seguida, mudarmos para a visualização remota no painel de cena, podemos ver que o nó raiz das árvores de cena é chamado de raiz e, atualmente, o único nó filho da raiz é o nó do jogo. Agora que nosso nó de jogador tem uma referência direta ao nó raiz da cena, vamos chamar uma função nele que ainda não escrevemos , Toggle pause Anexando um novo script ao nosso node de jogo. Esse roteiro será responsável por gerenciar a cena como um todo. Vamos chamá-lo de gerente de jogo. Assim como um gerente em um local de trabalho, esse roteiro será abrir a cena quando ela começar. Certifique-se de que todos os funcionários ou nós secundários tenham tudo o que precisam para realizar seus trabalhos individuais e, em seguida, feche a cena quando ela terminar. Como nosso jogo simples tem apenas um modo de jogo, precisamos apenas de um gerente de jogo. Mas um jogo mais complexo com várias cenas de jogo pode ter um gerente de exploração, gerente batalha, gerenciador de quebra-cabeças e assim por diante, para diferentes cenas de jogo. Em nosso novo script de gerenciamento de jogos, podemos adicionar a função de alternância e pausa que chamamos do script do Pausar o jogo é, na verdade, bem simples. Começaremos obtendo uma referência para toda a árvore de cenas com uma função embutida, get tree. O tipo de retorno desse método é uma árvore de cena, que contém uma variável chamada paused que podemos acessar com p. O tipo da variável pausada é um booleano, que tem um valor padrão Definir o valor como verdadeiro faz uma pausa para ganhar. Podemos alternar o valor entre verdadeiro e falso toda vez que essa função de alternância de pausa é chamada usando o operador lógico zero, representado por um ponto de exclamação essa função de alternância de pausa é chamada usando o operador lógico zero, representado Definindo o valor de paused como zero, false na primeira vez e depois não verdadeiro na segunda e Se testarmos, podemos pausar o jogo, mas ainda não podemos retomá-lo mas ainda não podemos Isso ocorre porque o nó do jogador, que está tentando receber a entrada para retomar o jogo, também está pausado e não consegue receber ou Talvez não queiramos pausar alguns nós específicos enquanto o jogo está pausado Selecionando o nó do jogador na árvore da cena, examine o inspetor abaixo nó e expanda a seção do processo Atualmente, a propriedade do modo está configurada para herdar, o que significa que ela herdará o mesmo modo de processo que seu pai, o nó do jogo Como o nó do jogo está pausado, o nó do jogador também será pausado Podemos alterar esse valor para sempre, para que o nó do jogador sempre seja processado mesmo quando o jogo estiver pausado Observe que também podemos fazer com que alguns nós sejam processados apenas enquanto o jogo estiver pausado ou desativar completamente o processamento de determinados nós Agora, quando executamos a cena, podemos pausar e retomar o jogo, pois o nó do jogador está sempre Mas isso cria um novo problema. Se pausarmos o jogo e pressionarmos o botão de pular e, em seguida, retomarmos a pausa, o personagem Se não quisermos esse comportamento, precisamos retornar ao script do jogador. Vamos primeiro mover a verificação do botão de pausa para a parte superior da função de entrada Então, se a árvore estiver pausada, ignore quaisquer outras entradas retornando e faça o mesmo na função de processo para ignorar também os controles de movimento e câmera Agora, quando o jogo é pausado, a única entrada que o jogador pode dar é retomar o Todo o resto será ignorado. Por fim, gostaria de exibir um menu na tela com alguns botões enquanto o jogo está pausado Mas antes de fazermos qualquer coisa envolvendo a interface do usuário, devemos configurar o tamanho da janela do jogo. Abra as configurações do projeto e vá para a guia geral. Selecionando janela, podemos definir a propriedade de tamanho para definir o tamanho da janela do nosso jogo. O tamanho ideal da janela dependerá da plataforma de destino. Vou usar 12 80 por 720 pixels. Até agora, tudo em nossa árvore de cenas está sendo observado pela câmera para produzir uma imagem em dois D, que é o que vemos em nossa janela quando jogamos o jogo. Essa imagem em duas dimensões que está sendo renderizada pela nossa câmera é a camada zero da tela em duas dimensões Podemos adicionar camadas adicionais à tela do nosso jogo depois que a câmera terminar sua renderização usando um novo tipo de nó, um nó de camada Canvas A camada padrão de um nó de camada do Canvas é uma, então ela será desenhada sobre a camada zero. Se quisermos, podemos adicionar qualquer número de camadas para desenhar na frente ou atrás do nosso jogo. Vamos renomear o nó da camada Canvas para UY, abreviação de interface de usuário botão direito do mouse no nó da interface do usuário e selecione Adicionar nó filho. Vamos adicionar um nó de rótulo ao Canvass. Isso muda nossa visão para dois D. Até agora, trabalhamos apenas com nós padrão, como o nó do jogador e três nós D para todo o resto. Nosso Canvas usará uma família diferente de nós chamados nós de controle, que têm ícones verdes. Vou renomear esse nó para título e definir sua propriedade para dizer pausa Em seguida, vamos repetir o processo para adicionar um botão. E nomeie o botão continuar. Em seguida, edite o texto dos botões para dizer o mesmo. Amplie e faça uma panorâmica, para que você possa ver o retângulo azul à direita do eixo y verde e abaixo do eixo x vermelho Essa é a janela de exibição da janela do jogo. Nossos nós foram adicionados na origem da cena, então eles serão renderizados no canto superior esquerdo da tela se jogarmos o jogo, mas eles estão sobrepostos Vamos organizar esses nós usando outro nó de controle, um contêiner de caixa vertical. Na verdade, um contêiner de caixa vertical não desenha nada, mas organizaremos seus filhos para se alinharem verticalmente, tornando a organização mais rápida do que se posicionássemos manualmente cada Selecionando os nós de título e continuados, podemos clicar e arrastar para colocá-los nó da caixa vertical e ver se eles são reorganizados automaticamente Também vamos duplicar o botão contínuo para criar outro botão e nomear essa saída Em seguida, edite a propriedade de texto para que corresponda. A caixa vertical se ajustou automaticamente para acomodar o botão extra. Vamos renomear a caixa vertical para pausar o menu. Com o nó do menu de pausa selecionado, expanda a seção de layout O valor predefinido das âncoras está atualmente definido no canto superior esquerdo. Podemos facilmente ancorar o menu de pausa em qualquer canto ou no centro da As âncoras são representadas na pré-visualização por esses quatro pinos verdes, nos quais podemos clicar e arrastar individualmente pela tela As âncoras determinam a posição ou o tamanho das notas, em relação ao tamanho da janela que definimos nas configurações do projeto, expresso em porcentagem Também podemos usar âncoras personalizadas se quisermos, por exemplo, usar apenas os 10% superiores da tela para uma barra de menu ou talvez usar o terço médio da tela para exibir um placar Vou ancorar meu menu de pausa no centro da tela e também definir o alinhamento horizontal dos títulos para ser centralizado de acordo com Com o menu de pausa criado, vamos definir sua propriedade visible como falsa por padrão clicando no ícone ao lado dela na árvore da cena Em seguida, no script do gerenciador de jogos, podemos usar um menu pronto para obter uma referência ao menu Pausa Usando o sinal $1 para especificar o caminho de um nó, usando aspas porque o nome contém um espaço, passando pelo nó da interface do usuário para acessar o nó do menu de pausa Quando o jogo está pausado ou não pausado, podemos definir a propriedade visível do menu de pausa para corresponder ao valor pausado da árvore Agora temos um menu de pausa com botões, mas como sabemos quando os botões são pressionados e o que fazemos quando são pressionados Se selecionarmos o botão de saída na árvore da cena, podemos mudar a guia do inspetor para a guia do nó, que exibirá sinais por padrão Se os grupos forem exibidos, você poderá alternar para sinais clicando aqui. Aqui podemos ver uma variedade de sinais que esse nó emitirá sob diferentes condições O nó do botão emitirá um sinal quando for pressionado. Tudo o que precisamos fazer é conectar esse sinal a uma função, clicando duas vezes nele ou clicando com o botão direito do mouse e selecionando conectar. Na janela, podemos selecionar qualquer nó em nossa árvore de cena, onde escutaremos o sinal a ser emitido Se selecionarmos o nó do gerenciador de jogos, o campo do método receptor aparecerá em Sair pressionado, que é o nome da função que será criada para nós quando clicarmos em Conectar. Nossa visualização mudará automaticamente para script e exibirá o script do gerenciador de jogos, que agora contém a função ao sair pressionada. Essa função agora será chamada automaticamente quando o botão de saída for pressionado pelo player. Um ícone de conexão verde é exibido ao lado da definição da função para nos dizer que essa função está sendo chamada por um sinal, e o botão de saída na árvore da cena tem um ícone de sinal para nos dizer que esse nó pode emitir um sinal conectado a um receptor Por enquanto, vamos apenas imprimir na saída uma mensagem dizendo, retorne à cena do título. Tanto para sabermos que funciona quanto para nos lembrar de implementar esse recurso posteriormente. Selecionando o botão continuado, também podemos conectar o sinal pressionado ao nó do gerenciador de jogos. Mas desta vez, clique no botão de seleção e escolha a função de alternar pausa que escrevemos anteriormente Por fim, precisamos que esse nó seja processado enquanto o jogo está pausado Então, vamos mudar seu modo de processo para quando pausado. Vamos experimentá-lo. Podemos pausar o jogo, clicar no botão de saída exibe nossa mensagem e pressionando o botão Continuar, pausa o Depois que os botões do menu estiverem em foco, também podemos usar as teclas de seta para navegar entre os botões e a barra de espaço para pressioná-los. Vamos fazer isso funcionar também com nosso controlador de jogo com apenas mais algumas etapas simples. Abrindo as configurações do projeto, na guia Mapa de entrada, clique no botão Mostrar ações incorporadas para ver as ações que foram usadas O Controllers DP já está listado na interface do usuário à esquerda, à direita para cima e para baixo para navegar pelos menus Mas precisamos adicionar uma entrada do controlador à ação de aceitação da interface para poder pressionar os botões. Vou usar o botão de ação inferior, que é A no meu controle. Agora só precisamos que o menu capte o foco ao ser aberto. Adicionando um script ao nó do menu de pausa, vamos apenas chamá-lo de menu Exportaremos uma variável para conter o item do menu, que deve capturar o foco por padrão quando o menu for aberto com controle de tipo. Atribuirei o botão de continuação como o item de foco padrão no inspetor clicando e arrastando-o para o campo Criando uma função pública, vamos chamá-la de aberta. Podemos definir a propriedade visible como verdadeira e também fazer com que o item de foco padrão capture o foco. E outra função, fechar, fará com que a propriedade visível volte a cair. De volta ao script do gerenciador de jogos. Em vez de definir diretamente a propriedade visible do pause many, podemos chamar open ou closed com base no valor de paused, usando uma instrução if Executando a cena, usando apenas um controle, podemos pausar o jogo, navegar pelo menu e pressionar os botões Agora temos um menu de pausa que é apresentado ao jogador quando ele pressiona a pausa Na próxima lição, criaremos uma cena de título para nosso jogo. Te vejo na próxima aula. 3. Título: Olá, amigos. Na lição anterior, criamos um menu de pausa para nossa cena de jogo Nesta lição, criaremos uma cena do título que se conecta à cena do jogo. Para isso, precisaremos de uma imagem de fundo e de alguns recursos básicos de interface do usuário. Vou usar o pacote Guy básico feito por Penzila em Vamos começar criando uma nova cena. Você pode selecionar cena na barra de menu e, em seguida, nova cena. Use o atalho Control N ou Command N ou clique com o botão direito na guia Sistema de arquivos e selecione Criar nova cena Clicar com o botão direito em uma pasta específica criará a cena nessa pasta e nos permitirá dar um nome a ela imediatamente. Não importa se essa cena é dois D ou três D, já que estamos interessados apenas em UY para esta lição Vamos transformar o nó raiz dessa cena em um nó de controle escolhendo Interface do usuário E o nó raiz é renomeado automaticamente para corresponder ao nome do título da cena Se criarmos a cena por meio do menu, seremos solicitados a selecionar primeiro o tipo de nó raiz. Em seguida, nomeie-o e classifique-o em uma pasta na primeira vez em que for salvo. Selecionando o nó raiz, podemos ver que este é um nó de controle com suas predefinições de âncora definidas como totalmente destruídas, cobrindo toda a janela do jogo, mas sem desenhar nada Como na lição anterior, vamos adicionar um nó de rótulo e alguns botões. Vamos nomear o título da nota do rótulo e definir a propriedade de texto como o título do nosso jogo. Da mesma forma, nomeie nossos botões e edite suas propriedades de texto para um novo jogo. Continuar. Configurações, créditos e saída ou qualquer outro botão que você gostaria de ter na tela de título do seu jogo. Também vamos organizar esses botões usando um contêiner de caixa vertical como fizemos com o menu Pausa e renomeá-lo para botões de menu Podemos organizar esses itens de forma rápida e fácil em nossa tela usando âncoras. Por exemplo, eu gostaria que o título fosse centralizado horizontalmente na tela e um terço abaixo da parte superior da Com a nota do rótulo do título selecionada, expandindo a seção de layout, alterarei as predefinições de âncora para personalizadas As âncoras são definidas como números de 0 a 1, representando a porcentagem da largura ou altura dos pais Posicionar o título no meio da tela horizontalmente pode ser feito definindo a âncora esquerda em 0,5, e a âncora direita será atualizada automaticamente para corresponder, já que a âncora direita não pode ser Da mesma forma, posicionar o título a um terço da parte superior da tela significaria definir a âncora superior em 0,333 Ainda não está exatamente a posição que eu quero porque as âncoras estão no canto superior esquerdo da etiqueta O texto só é reproduzido à direita e abaixo do ponto de ancoragem Expandindo a subseção de direção de crescimento, podemos definir as direções de crescimento horizontal e vertical para ambas Dependendo da subseção de deslocamento da âncora, podemos redefini-las todas para zero, e agora as âncoras estão Também posicionarei o contêiner do botão da mesma maneira. Mas com sua âncora vertical dois terços abaixo, aparece abaixo do título do jogo Você também pode posicionar qualquer um dos seus nós de controle manualmente, mas lembre-se de que o uso de âncoras tornará seus layouts mais flexíveis e se ajustará a diferentes resoluções de tela Vamos adicionar um manuscrito ao nó dos botões Mini e atribuir um item de foco padrão no inspetor Assim como nossa cena de jogo tem um script de gerenciamento de jogo anexado ao nó raiz, também precisamos de um script de gerenciamento de títulos anexado ao nó raiz das cenas de título. E aqui podemos obter uma referência ao script dos botões de menu durante a fase de preparação usando o complemento pronto. Em seguida, diga aos botões do menu para abrirem na função pronta. O menu já estava visível, mas, ao pedir que ele abra, também diremos ao item de foco padrão que capture o foco. Selecionando cada um dos nós do botão, podemos adicionar uma chamada de função pressionada ao nosso script de gerenciamento de títulos para todos eles. Por enquanto, vamos nos preocupar apenas com o novo botão do jogo. O resto pode simplesmente imprimir sequências de caracteres para nos instruir a implementar esses recursos posteriormente O objetivo do novo botão do jogo será mudar nosso jogo da cena do título para a cena do jogo. Podemos fazer isso obtendo uma referência à árvore de cenas acessando um método chamado change scene to file. Esse método usa um argumento de string, que é um caminho de arquivo para a cena que queremos carregar. As sugestões contêm uma lista de todas as cenas do nosso projeto, para que possamos selecionar a cena do jogo aqui. Como alternativa, procurando na guia do sistema de arquivos, podemos encontrar a cena do jogo e clicar com o botão direito mouse, selecionar Copiar caminho e colá-lo como texto. Mas lembre-se de que as sequências de caracteres devem estar entre aspas Até agora, usamos o botão executar a cena atual para testar nosso jogo. Mas você provavelmente já pressionou acidentalmente o botão Executar projeto pelo menos uma vez, que exibirá a configuração da cena principal do nosso projeto Essa é a primeira cena que será carregada quando iniciarmos o jogo, que deveria ser essa cena, a cena do título. Se você ainda não definiu isso, pode clicar no botão selecionar atual para definir a cena do título como a cena principal do jogo. O novo botão do jogo captura o foco quando o jogo começa. Clicar em cada um dos botões imprime nossas declarações, e clicar no novo botão do jogo muda imediatamente para a cena do jogo. Também podemos editar a cena principal do projeto a qualquer momento nas configurações do projeto na guia geral em execução do aplicativo. Cena mínima. Nossa cena principal agora está funcional, mas não parece muito boa. Primeiro, podemos adicionar um plano de fundo inicial usando um nó de texto. Vamos chamá-lo de plano de fundo. Na seção de layout, definir as âncoras predefinidas como totalmente destruídas garantirá que o plano de fundo cubra toda a janela Podemos editar a propriedade da textura para exibir as duas imagens D que quisermos. Usando as propriedades do inspetor, podemos alterar a forma como a imagem é exibida, evitando que mantenha seu tamanho nativo ou se encaixe dentro dos pontos de ancoragem, seja por largura ou Também podemos especificar que a imagem deve manter sua proporção para evitar que a imagem seja esticada para caber na janela Por fim, vamos classificá-lo no topo das cenas, crianças, para que seja desenhado primeiro, atrás de todo o resto. A seguir, vamos dar uma olhada nas propriedades dos nós do rótulo de título. A maioria das configurações da etiqueta tem a ver com justificativa e embalagem, o que não é realmente relevante para nosso título As configurações que queremos alterar estão sob as propriedades herdadas do controle na seção de substituição do tema Aqui podemos ajustar a cor da fonte. Adicione uma sombra ou um contorno que também pode ser ajustado na subseção de constantes Podemos alterar o tamanho da fonte e também a própria fonte. Eu baixei algumas fontes gratuitas do dafont.com. Certifique-se de que todas as fontes que você usa em seus jogos sejam gratuitas. fonte Da exibe o licenciamento de suas fontes acima do botão de download Isso funciona bem para o título do nosso jogo, que deve se destacar, mas editar propriedades individuais dessa forma para tudo em nosso projeto seria entediante Para editar nossos botões de menu, devemos criar um tema comum para usar em todo o projeto do jogo. Selecionando o nó do contêiner do botão. Desta vez, expanda a seção temática. O campo do tema está vazio. Ao clicar nele, podemos selecionar novo tema para criar um novo recurso temático para o nosso projeto. Clicar no recurso do tema adicionará uma nova guia ao painel inferior da nossa janela, um editor de temas. O editor de temas contém uma prévia de uma variedade de nós de controle diferentes, um painel, jogáveis, diferentes tipos de botões, botões, botões suspensos, seletor de cores, campos de texto, barras de rolagem, separadores, guias Tudo usando o tema padrão fornecido pela Gadot. Analisando nosso recurso temático no painel do inspetor, podemos editar a fonte padrão e o tamanho da fonte para tudo em nosso tema Vamos mudar a fonte e ajustar o tamanho. Podemos ver os efeitos na pré-visualização e nos botões do menu de título. Isso não afeta o rótulo do título do jogo pois o tema não foi aplicado a esse nó. Ele só foi aplicado ao contêiner de botões do menu. Mesmo que o tema fosse aplicado ao nó do título, as substituições de tema que acabamos de aplicar seriam usadas Os botões herdam o tema de seus pais na árvore da cena No editor de temas, podemos adicionar novas configurações para qualquer nó de controle clicando no botão Mais. Como nosso menu contém apenas nós de botão, vamos adicionar configurações para nós de botão. Há várias configurações diferentes para ajustar cores da fonte e do ícone durante os diferentes estados do botão Padrão, desativado, focado, pairado, pressionado com mouse e pressionado, bem como uma cor bem como Antes de podermos ajustar qualquer uma dessas configurações, precisamos adicioná-las ao tema clicando no botão de adição ao lado delas. Ajustando qualquer uma dessas configurações, podemos ver seus efeitos na visualização, incluindo os estados de foco, foco e pressão, clicando nos botões Há configurações adicionais e outras guias para ajustar constantes, fontes e A fonte e o tamanho da fonte já foram definidos pelo próprio recurso do tema. Não precisamos ajustá-los aqui. Também podemos alterar a aparência do botão em si usando caixas de estilo. Cada um dos estados do botão pode ser atribuído a uma caixa de estilo diferente. Vamos começar com o normal. Ao clicar no botão de adição, podemos usar uma caixa de estilo simples para criar apenas um retângulo de cor plana para o botão, ou podemos usar uma caixa de estilo de textura para usar uma imagem importada em dois D. Clicar no recurso da caixa de estilo o abrirá no painel do inspetor, onde podemos preencher o campo de textura com um arquivo de imagem em dois D. Talvez você queira adicionar um pouco de preenchimento às bordas do botão, que o texto do botão não se sobreponha às bordas da imagem Expandindo a seção de margem de conteúdo, podemos ajustar o tamanho das margens para melhor ajustar o texto dentro da imagem Adicionando uma caixa de estilo pressionada, podemos alternar a textura usada para desenhar o botão. Copiar as mesmas configurações para a caixa de estilo normal, mas aumentando o preenchimento superior para fazer com que o texto se mova para baixo quando pressionado Adicionar mais caixas de estilo para estados de foco e foco desativados Você pode não ter texturas diferentes para todos os diferentes estados de botão Mas ainda podemos criar novas caixas de estilo para esses estados. Use a mesma textura e configurações normais, mas adicione modulação de cores para criar uma aparência diferente para o botão nesse estado Podemos multiplicar as cores das texturas por algo como amarelo para que pareça visivelmente diferente Ou podemos simplesmente usar outra imagem em uma cor diferente para enfatizar o foco. Quando desativado, podemos multiplicar as cores Alpha para adicionar alguma transparência Podemos testar todas essas caixas de estilos diferentes facilmente a partir da visualização prévia no editor de temas. Agora que o menu restante está melhor, vamos também editar o menu de pausa na cena do jogo para combinar Em vez de adicionar um novo tema ao menu Pausa e refazer todas as edições, podemos retornar à cena do título, encontrar o recurso e clicar no Selecione Salvar e salve o tema na pasta de recursos do nosso projeto. Agora, na cena do jogo, podemos atribuir esse tema ao menu de pausa, e os botões serão atualizados automaticamente para corresponder ao novo tema Abrindo o script do gerenciador de jogos. Quando o jogador pressiona o botão de saída, também podemos mudar para a cena do título Executando nosso jogo, começamos na cena do título. O novo botão do jogo muda para a cena do jogo. Pausar o jogo e selecionar sair retorna à cena do título Agora temos uma cena título e podemos alternar entre nossas duas cenas. Na próxima lição, suavizaremos a transição da cena ao escurecer Te vejo na próxima aula. 4. Transição: Olá, amigos. Na lição anterior, criamos uma cena do título e nos conectamos à cena do jogo. Nesta lição, tornamos a transição mais suave com um esmaecimento visual A maioria dos jogos começa com uma tela preta. Vamos adicionar um novo nó à nossa cena principal, um nó colorido destruído Vamos chamá-lo de Fade. No Inspetor, podemos definir a propriedade da cor como preta Em seguida, ajuste os precetos da âncora para totalmente destruídos para cobrir toda a janela Quando o jogo começa, podemos desbotar suavemente esse objeto para ficar totalmente transparente, revelando a cena do título por trás dele Mesmo quando um objeto em nossa cena é transparente, os eventos do mouse só serão acionados na primeira coisa que eles atingirem, que significa que mover o mouse ou clicar em nossos botões foi bloqueado pelo fade Nas propriedades herdadas do controle, na seção do mouse, podemos alterar as configurações de filtro do nosso fade para ignorar, que permitirá que os eventos do mouse passem pelo fade até os objetos Agora, os botões funcionam com o mouse novamente. Enquanto estamos trabalhando em nossa cena no editor, seria melhor poder ver todo o resto. Eu gostaria que o fade estivesse visível por padrão. Antes de anexarmos um script, vamos começar a organizar nossos scripts em pastas mais específicas criando uma subpasta chamada UI Podemos mover o manuscrito para a subpasta, pois ele é usado para controlar os elementos da interface Mas ao mover recursos dessa forma, certifique-se de que as cenas que os usam estejam abertas primeiro. Caso contrário, os arquivos de cena podem perdê-los de vista. Se isso acontecer, basta mover o recurso de volta para onde estava originalmente e garantir que as cenas usando o recurso estejam abertas antes de movê-lo. Agora, podemos anexar um script ao nó Fad e usar o navegador para classificá-lo na pasta de scripts de interface do usuário Ao contrário do nosso manuscrito, que pode ser relevante para qualquer nó de controle, pois estava afetando apenas a propriedade visível, que é herdada do Esse script FAD alterará a propriedade de cor do nó destruído de cores, portanto, só poderá ser usado por nós de cores ou por cores Vamos começar com a função pronta. Definir a propriedade visível do fa verdadeiro quando a cena começa, deixando a janela completamente preta. Então, podemos declarar uma função pública chamada para limpar. Diferentemente da maioria das funções na maioria dos scripts, isso é algo que precisará acontecer gradualmente ao longo do tempo, abrangendo vários quadros Podemos fazer isso com um novo tipo de variável, uma interpolação. Essa pode ser uma variável privada, aplicável apenas a esse script localmente, e vou chamá-la de tween para simplificar O nome dessa classe vem das palavras em inglês intermediárias, pois é mais frequentemente usada para encontrar pontos entre um ponto inicial e um ponto final. Podemos criar uma interpolação a qualquer momento chamando um método embutido, create tween chamando um método embutido, create Esse método retorna um objeto de interpolação, que podemos atribuir à nossa variável para armazená-la Uma interpolação é uma classe complexa com uma variedade de métodos, mas o que queremos usar é chamado de propriedade de interpolação, que requer vários argumentos O primeiro argumento é o nó que essa interpolação afetará, que é o mesmo nó ao qual esse script está anexado Podemos obter uma referência a esse nó usando a palavra-chave self. A próxima é a propriedade do nó que queremos alterar, um caminho de propriedade como uma string. Estaremos alterando a propriedade de cor desse nó. Se você não tiver certeza do caminho da propriedade, podemos consultar o inspetor Passar o mouse sobre qualquer propriedade nos mostrará o caminho da propriedade para acessá-la, ou podemos clicar com o botão direito do mouse para copiar o caminho da propriedade e colá-lo como O próximo argumento é o valor final para o qual queremos que essa propriedade seja definida após o término da interpolação Como a propriedade é uma cor, definiremos isso como uma cor personalizada que definiremos. Vamos deixar isso claro. E a última propriedade é a quantidade de tempo que a interpolação durará, medida em segundos, expressa como uma flutuação Vamos configurá-lo para 1 segundo por enquanto. O valor de clear será algo que podemos definir, mas nunca mudará. Em vez de declarar uma variável, podemos definir uma constante usando a palavra-chave constant Nomeie de forma clara a cor do tipo. É convencional nomear constantes em letras maiúsculas. Em seguida, atribua o valor dessa constante como uma cor. Escrever o nome da classe seguido de colchetes acessa um método construtor, permitindo construir a cor especificando todas as Uma cor é definida por quatro flutuadores, vermelho, verde, azul e Alpha para transparência A tem números de 0 a 1. Nossa cor clara será simplesmente zero, vermelho, zero, verde, zero, azul e zero Alpha, tornando-a preta, mas também completamente transparente. Chamar nossos dois métodos transparentes fará a transição da propriedade de cor de seu valor atual, que é preto, para claro, durante 1 segundo. Também podemos escrever outra função em preto para fazer o oposto. No entanto, não precisamos definir uma constante para preto, pois a classe de cores já tem uma. Podemos acessá-lo pelo nome da classe usando um ponto e podemos ver que há um grande número de cores predefinidas O que queremos agora é preto. Preto é definido como zero, vermelho, zero, verde, zero, azul, mas um Alfa. Vamos passar para o script do gerenciador de títulos por um momento e pegar uma referência ao FAD Noe durante a fase de preparação usando at ready Quando a cena começa, podemos mandar o bilhete para o Destino limpar. Então, antes de mudar para a cena do jogo, podemos fazer com que ela fique preta Mas o processo de escurecer leva tempo, e essa função será executada em um quadro, mudando imediatamente para a cena do jogo, então não veremos isso acontecer Podemos dizer a essa função que faça uma pausa e aguarde um sinal antes de continuar, usando uma nova palavra-chave, um peso Um peso requer um sinal de espera, que podemos retornar da função fade to black De volta ao script FAD, podemos especificar um tipo de retorno para nossas funções antes dos dois pontos adicionando um hífen e uma seta, seguida por um Nesse caso, queremos retornar um sinal. A classe de interpolação contém um sinal que é emitido automaticamente quando a interpolação termina, então podemos Agora, o gerenciador de títulos aguardará que o nó FAD fique preto antes de mudar de Butt também copia esse formato nas duas funções claras. Mesmo que esteja retornando um sinal, o gerente do título não precisa aceitar essa devolução nem fazer nada com ela. Nesse caso, a interpolação será iniciada e o restante da função prosseguirá imediatamente Podemos copiar esse nó FAD para a cena do jogo. Em seguida, edite o script do gerenciador de jogos para obter uma referência ao nó FAD durante a fase de preparação Esmaeça até ficar claro quando a cena começar e espere escurecer antes de mudar para a Mas essa função, ao pressionar a saída, está sendo chamada enquanto o jogo está pausado Portanto, o nó F também está pausado e, como resultado, não mudará sua cor Podemos permitir que o nó FAD sempre processe para se locomover Mas também seria uma boa ideia retomar o jogo antes de trocar de cena Vamos experimentá-lo. Agora, o jogo começa com uma tela preta desaparecendo na tela de título, pressionar o novo botão do jogo fica preto e muda para a cena do jogo, que volta para a cena do jogo. Pausando e pressionando o botão de saída, fica preto muda para a cena do título, que também volta a aparecer No entanto, há uma oscilação entre a troca de cenas. Podemos editar as configurações do projeto no ambiente de renderização e alterar a cor padrão para preto Essa é uma transição muito mais suave do que trocar de cena imediatamente, e se nosso jogo ficar grande o suficiente para exigir mais tempo de carregamento, podemos mudar isso para uma tela de carregamento. No entanto, pode haver alguns problemas iniciar uma interpolação antes que a anterior termine De volta ao script FAD, podemos verificar se a interpolação existe comparando-a com No script Godo, podemos fazer isso implicitamente com just if Se existir, verifique também se está em execução. Nesse caso, devemos matar a interpolação antes de criar uma nova Isso evitará qualquer chance de várias interpolações existirem e interferirem umas nas outras, já que a interpolação mais recente simplesmente assumirá Nossas duas funções claras e duas pretas são muito semelhantes, com apenas o valor da cor diferente entre elas. será uma boa prática Em vez disso, será uma boa prática declarar uma função privada aqui Vamos chamá-la de duas cores e aceitar uma cor como parâmetro. Então, podemos fazer tudo isso apenas uma vez. Passar a cor para o método da propriedade gêmea e, em vez disso, fazer com que as duas funções claras e duas pretas chamem essa função de duas cores. Passar o sinal de retorno pela cadeia ou os gerentes podem esperar por ele Dessa forma, fazer qualquer alteração nesse comportamento exigirá apenas a alteração de um bloco de código. Talvez você queira que o script seja mais adaptável. Vamos exportar uma variável para a duração da interpolação e atribuir a ela um valor padrão de 1 segundo Em seguida, substitua o argumento de 1 segundo pela nossa variável e agora o tempo do pode ser facilmente ajustado no inspetor Vamos ver como fica o FAD com a duração de 2 segundos. Podemos tornar isso ainda mais flexível, permitindo que as duas funções claras e as duas pretas aceitem um parâmetro opcional para substituir a duração especificada Vamos chamar a duração do parâmetro sem um sublinhado, tornando-o diferente da variável que tem um sublinhado E atribua a ele um valor padrão de nossa duração de sublinhado. Em seguida, precisamos passar esse valor para a função de duas cores. E adicione-o à lista de parâmetros. Em seguida, use o parâmetro no método da propriedade tween em vez da nossa variável Nossos scripts de gerenciamento ainda podem usar essas funções sem especificar uma duração Nesse caso, o valor exportado será. Mas eles também podem especificar uma duração diferente e usá-la em vez disso. Vamos fazer com que a duração exportada seja de 1 segundo, mas permita que o gerenciador de títulos a substitua e, em vez disso , desapareça por uma duração de 2 Agora temos uma transição visual mais suave entre nossas duas cenas. Na próxima lição, passaremos informações entre as cenas. Te vejo na próxima aula. 5. Carga automática: Olá, amigos. Na lição anterior, aumentamos e diminuímos nossas cenas para uma transição mais suave Nesta lição, adicionaremos nós extras à árvore de cena que podem ser acessados de qualquer cena. Se rodarmos nosso jogo e mudarmos para a árvore da cena remota. Podemos ver que a cena trees root tem apenas um filho, que é a cena título. Ao mudar para a cena do jogo, a cena do título é removida da árvore e substituída pela cena do jogo. Se quisermos passar informações entre as cenas, podemos adicionar filhos extras ao nó raiz da árvore de cenas, que permanecerão lá enquanto o jogo estiver em execução. Eles são chamados de carregamentos automáticos e podemos criá-los escrevendo scripts. Primeiro, vamos adicionar uma pasta especial dentro da pasta de scripts para armazenar nossos scripts de carregamento automático. Em seguida, clique com o botão direito do mouse nessa pasta para criar um novo script. O objetivo do script será economizar carga e fornecer acesso aos dados. Eu gostaria de nomear esse arquivo de script. Como isso não representa nada que precise ser desenhado, ele pode herdar do node Esse script terá duas variáveis contendo conjuntos separados de informações, as configurações atuais do jogo e o progresso atual do jogador no jogo. Talvez você queira ter uma terceira variável para armazenar informações de progresso associadas a uma conta de usuário, mas não vinculada a um espaço de salvamento específico, como desbloquear níveis de dificuldade ou conquistas Essas variáveis estarão acessíveis publicamente a qualquer outro script em nosso jogo em qualquer cena. Abrindo as configurações do projeto, mude para a guia de carregamento automático. Clique no ícone da pasta ao lado do campo do caminho para abrir um navegador e, em seguida, navegue até o script do arquivo. O campo do nome do nó será preenchido automaticamente para corresponder ao nome do script Clique no botão Adicionar para adicionar esse script à lista de carregamentos automáticos. Agora, quando executamos o jogo, podemos ver na árvore da cena remota que o nó raiz tem outro nó filho chamado file. Ao clicar nesse nó, podemos ver que ele tem duas variáveis chamadas configurações e progresso. Mudando para a cena do jogo, a cena do título é removida e substituída pela cena do jogo, mas o nó do arquivo permanece, o que significa que podemos usá-lo para passar informações entre as cenas. Mas eu não especifiquei um tipo para as variáveis porque queremos criar nossos próprios tipos para armazenar coleções complexas de informações. Vamos criar outra subpasta na pasta scripts e chamá-la de recursos personalizados Em seguida, clique com o botão direito para criar um novo script. Vamos chamá-la de configurações. Em vez de herdar de um tipo de nó, desta vez, o script herdará do recurso Então, podemos criar outro. Vamos chamar isso de progresso. Nos scripts de recursos, podemos adicionar qualquer número de variáveis de tipos diferentes, mas elas devem ser construídas em tipos, não em referências a outras coisas. Por exemplo, podemos armazenar uma variável booleana, que é verdadeira ou falsa, para definir se os controles da câmera no eixo x estão invertidos e outra no eixo Y. Os números podem ser armazenados como flutuadores, que permitem pontos decimais Você pode usar isso para salvar a configuração de volume do jogo como um número entre zero, silenciado ou um volume cheio Os números também podem ser armazenados como números inteiros, um número que não contém pontos decimais, mas pode ser positivo ou negativo Podemos usar isso no script de progresso para armazenar o dinheiro dos jogadores ou. Também podemos usar sequências de caracteres para armazenar sequências de personagens, talvez dando um nome ao espaço de salvamento ou ao protagonista do jogador espaço de salvamento ou ao protagonista Qualquer outro tipo embutido, como vetores ou cores, também pode ser usado Coleções de qualquer um desses tipos também podem ser armazenadas em uma matriz ou em um dicionário, como uma matriz de booleanos para conter se o jogador completou ou não cada nível Cada um desses tipos de variáveis tem um valor padrão. Os booleanos são falsos, os números inteiros e os números são zero. Sequências de caracteres, matrizes e dicionários estão todos vazios. Quando um recurso é criado, ele chamará automaticamente uma função incorporada nomeada nele. Abreviado de inicializar. Substituindo essa função, podemos especificar os valores padrão que quisermos para nossas variáveis Talvez iniciando nossa configuração de volume como 0,5 para um ou dando ao protagonista um nome padrão Para criar nosso recurso, precisamos especificar um nome de classe, o que é feito na parte superior do script. Geralmente na mesma linha da palavra-chave extends. Com o nome da classe de palavra-chave, podemos dar a essa classe de recurso um nome que será usado por outros scripts para se referir a essa classe como um tipo. Podemos nomear essas configurações de classe com S maiúsculo, e esta, progredir com P. Convencionalmente, progredir com P. Convencionalmente, as classes são nomeadas em maiúsculas e minúsculas com a primeira letra de cada De volta ao script do arquivo, agora podemos especificar os tipos de nossas variáveis como configurações e progresso. Por enquanto, podemos simplesmente criar esses recursos dentro da função ready. Usando o nome da classe seguido pelo ponto Neu. Isso também acionará a função init, inicializando as variáveis dentro do recurso Executando o jogo, podemos ver essas variáveis na árvore da cena remota. Clique neles, veja e edite os valores de suas propriedades. Vamos mudar seus valores. Mude para a cena do jogo e confirme se as mudanças permanecem durante a transição da cena. Qualquer script em nosso jogo pode acessar facilmente esses recursos graças ao carregamento automático do arquivo. Vamos abrir o script do braço de mola responsável por girar a câmera Seu comportamento atual está usando eixos x e y invertidos. Mas agora temos variáveis em nosso recurso de configurações que devem ativar ou desativar isso Observe que girar a câmera em torno do eixo x é uma rotação vertical, que os jogadores entenderão como rotação y, e girar em torno do eixo Y é a rotação horizontal ou rotação x. Podemos escrever uma declaração if antes de cada um desses cálculos para verificar as configurações de pontos do arquivo e ver se a variável invertida apropriada é verdadeira ou falsa Em seguida, multiplique a fórmula por menos um, se for falsa, para mudar o comportamento invertido para não Isso significa ter quase a mesma fórmula copiada duas vezes, com apenas uma pequena diferença de ser multiplicada por menos um ou Podemos fazer isso de forma mais eficiente usando uma reafirmação. Retornando primeiro ao formato original e depois multiplicando por um, entre colchetes, um, se as configurações do arquivo forem invertidas, menos um. E repetindo isso com a rotação horizontal, alterando y para x. As declarações rotativas são efetivas sempre que você quiser alterar um valor com base em uma condição simples Então, vamos experimentá-lo. Inclinando o manípulo analógico direito, a rotação x da câmera não é mais invertida por padrão, mas a rotação y Abrindo a árvore da cena remota, podemos acessar e editar as configurações. E voltando à simulação, os controles da câmera agora são opostos. Agora, criamos alguns de nossos scripts que herdam de diferentes tipos de notas e também de recursos Mas também podemos escrever scripts que herdam de nossas próprias classes personalizadas Dando uma olhada rápida no script FAD, combinamos o comportamento de duas claras e duas pretas em uma função combinada Podemos combinar comportamentos semelhantes de scripts diferentes de forma semelhante, criando uma superclasse e usando herança para permitir que scripts diferentes acessem o mesmo Vamos usar nossos scripts de gerenciamento como exemplo, já que ambos agora usam a transição do FAD Seria uma boa ideia colocá-los em uma pasta de scripts separada. Vamos chamá-lo de gerentes. Movendo o gerenciador de jogos e o gerenciador de títulos para essa pasta. Também podemos criar um novo terceiro script, vamos chamá-lo de Scene Manager. No script do Scene Manager, daremos ao script um nome de classe em maiúsculas e minúsculas. Sempre que você atribuir um nome de classe a um script, precisará salvá-lo antes que o mecanismo o reconheça Então, nos scripts Game Manager e Title Manager, podemos fazer com que eles estendam o comportamento da classe Scene Manager. Agora, tudo o que colocarmos no script do Scene Manager será usado tanto pelo gerente do jogo quanto pelo gerenciador do título. Vamos mover a variável FAD para o script do gerenciador de cenas Então, nos gerenciadores de jogos e títulos, como eles herdam a variável Fad da classe de gerenciador de cenas, eles não podem declarar outra variável com o Podemos excluir a variável, pois agora ela é herdada da classe de gerenciador de cenas Mas o caminho do nó é diferente entre a cena do jogo e a cena do título. Podemos contornar isso facilmente exportando a variável em vez de usar at on ready Precisaremos atribuir o valor de fade em ambas as cenas no painel do inspetor Se a variável não estiver aparecendo, talvez seja necessário fechar e reabrir Godot para que a herança da classe funcione As funções também são herdadas, mas as subclasses podem redefinir funções herdadas É por isso que cada classe que escrevemos com uma função re ou de processo tem um ícone azul ao lado, pois está substituindo a definição herdada que já existe na classe node Se nossa classe de gerenciador de cena tiver uma função pronta que diz que o fade deve desaparecer para claro, esse comportamento será herdado tanto pelo gerente do jogo quanto pelo gerenciador do Podemos remover essa função do gerenciador de jogos, mas o gerenciador de títulos também está abrindo o menu. Permitindo que o gerenciador de títulos substitua a definição de função pronta herdada do Scene Manager, não precisamos substituir tudo isso Nossas subclasses podem acessar a definição herdada de uma função usando a palavra-chave super Como o gerenciador de títulos é herdado do Scene Manager, Scene Manager é a superclasse Ao chamar super dot ready, estamos dizendo ao Fade que fade to clear Mas também pedimos que o menu seja aberto. A estrutura de superclasses e herança se tornará mais útil se tivermos mais gerenciadores de cena ou comportamentos mais comuns de todos os nossos gerentes de Não precisamos reescrever o mesmo código em vários scripts Agora temos um nó carregado automaticamente em nossa tentativa de cena que pode armazenar informações sobre as configurações e o progresso do jogo. Na próxima lição, adicionaremos música de fundo ao nosso jogo. Te vejo na próxima aula. 6. Música: Olá, amigos. Na lição anterior, criamos nós carregados automaticamente que podem ser usados para transmitir informações entre cenas diferentes. Nesta lição, adicionaremos música de fundo que pode mudar cada cena do nosso jogo. Para esta lição, usarei o pacote de música Barn feito por Eric the Funny Barn no itch Seja qual for a música de fundo que você escolher usar no seu jogo, certifique-se de que ela foi projetada para ser repetida. Como os arquivos de áudio geralmente são muito grandes, recomendo importá-los para o projeto somente quando você decidir implementá-los. Depois de importá-los e classificá-los em uma pasta de música, selecione uma e mude o painel de fraude para o painel de importação Talvez seja necessário editar as configurações de importação dos seus arquivos de áudio antes que eles possam ser repetidos. Dependendo do tipo de arquivo, a configuração do loop pode ser uma caixa de seleção ou uma lista suspensa com várias opções Nesse caso, convém alterá-lo para um loop linear. Vamos começar abrindo cena do título e adicionando um novo nó a ela. No nó do reprodutor de fluxo de áudio. Certifique-se de não usar as duas variantes d ou três D, pois elas servem para simular audição de sons em espaços de dois D ou três D. O nó normal do reprodutor de fluxo de áudio não será afetado pela proximidade ou por qualquer outra coisa na cena e apenas reproduzirá o áudio como está. Podemos definir a propriedade de fluxo de áudio no inspetor para uma de nossas músicas importadas Ao examinar as propriedades das notas do reprodutor de stream de áudio no inspetor, você notará que o volume é medido em decibéis, flutuando com um valor padrão de zero variando de menos zero variando de É importante observar que esse número não é escalado de forma linear. Aumentar de 1 decibel para 2 decibéis não é duas vezes mais alto Mas não se preocupe se você não entender como decibéis funcionam, pois não os usaremos diretamente. Podemos fazer com que o nó do reprodutor de streaming de áudio seja reproduzido automaticamente quando o jogo começar Executando o jogo, a música começa no volume máximo e, quando fazemos a transição para a cena do jogo, ela para repentinamente. Combinando o que aprendemos nas duas lições anteriores, podemos criar um reprodutor de áudio persistente para reproduzir música de fundo e também fazer com que a música apareça sem problemas Como a música de fundo geralmente é algo que os jogos têm em todas as cenas, faria sentido que houvesse um nó carregado automaticamente que pudesse permanecer permanentemente na árvore da cena para lidar com ela. Assim, podemos excluir o nó do player audiotrem em nossa árvore de cenas E crie um novo script na pasta auto lodes. Vamos chamar isso de música. Esse nó carregado automaticamente pode herdar do reprodutor de fluxo de áudio, dando ao nó de música acesso a todas as propriedades e métodos de um nó reprodutor de fluxo de áudio Como não podemos acessar as propriedades de um nó carregado automaticamente no inspetor, teremos que definir seus valores de propriedade padrão na função scripts ready Eu gostaria que o volume começasse no menor valor possível, que é menos 80 decibéis Mas também podemos usar o volume linear, se quisermos, o que é mais fácil para a maioria das pessoas entender. Usando uma função embutida, linear a dB, abreviação de decibéis, que converterá uma escala linear em escala de decibéis, permitindo definir o volume como zero em termos lineares, o que significa que Se você quiser que a música também toque enquanto o jogo estiver pausado, precisaremos alterar o modo de processo desse nó Usando as sugestões, podemos configurá-lo como node, dot, process always. Obrigada. OK. Pensando primeiro em como gostaríamos que esse nó fosse usado, provavelmente só precisamos de duas funções públicas. Um para tocar uma faixa de música e outro para apagá-la. faixa de reprodução usará uma faixa como parâmetro do tipo stream de áudio. Embora o fade out não exija nenhum parâmetro. Na função Reproduzir faixa, podemos acessar todas as propriedades herdadas do nó do reprodutor de fluxo de áudio, incluindo o fluxo que está sendo reproduzido no momento, que tem um valor padrão de nulo Podemos definir o valor do stream para a faixa que queremos tocar. Em seguida, diga ao reprodutor de streaming de áudio para tocar. Mas o volume está atualmente inaudível. Vamos usar uma interpolação, como fizemos com o desvanecimento visual, para ajustar gradualmente o volume ao longo do tempo, declarando uma nova variável de interpolação na parte superior do script Primeiro, verificaremos se a interpolação já existe e, se existe, verificaremos se já está em execução E se sim, mate-o. Podemos então criar uma nova interpolação. E entre uma propriedade Acessando esse nó em si, a propriedade de volume, alterando-o gradualmente para arquivo definindo o volume do ponto ao longo de 1 segundo. Mas lembre-se de que o volume não é escalonado linearmente, pois é medido em decibéis Em vez de interpolar a propriedade do volume diretamente, podemos interpolar um método método Tween não requer uma referência de nó, então podemos remover o primeiro argumento O caminho da propriedade agora é um método que pode ser chamado. Vamos escrever uma função chamada set linear volume, que usa um parâmetro flutuante do volume linear Essa função definirá a propriedade do volume após convertê-la de linear para decibéis Podemos usar isso em nossa função pronta para obter consistência. E também use isso como nosso método chamável na chamada do método de interpolação Observe que, ao usar um método como cabo, ele não tem colchetes na extremidade O método também precisa não apenas de um valor final, mas também de um valor inicial, pois isso não é mais uma propriedade do nó. Não tem como saber qual é o valor atual. Os valores inicial e final são, na verdade, um argumento que será passado para o método chamável, o volume linear Usando a função incorporada oposta, podemos converter decibéis em lineares para alterar o volume atual de decibéis em um volume linear como valor inicial Podemos especificar que o volume linear de nossa música será interpolado de qualquer volume atual até arquivar essa configuração de volume de parada em 1 segundo Vamos também retornar o sinal interpolado finalizado. Então, a função de fade out desejará fazer exatamente o oposto disso Tweetando o volume linear de qualquer valor para zero. Esperando o término da interpolação, impedindo a reprodução do nó e definindo a faixa de volta para nula Como fizemos com a cor Fade, podemos combiná-las em uma função privada Vamos chamar isso de volume. Tomando apenas o volume linear alvo como parâmetro. Entrelaçando o volume do que está atualmente até o volume alvo durante 1 segundo E agora, tanto o fading in quanto fading out usam a mesma função Abrindo as configurações do projeto, alternando para a guia de carregamento automático. Podemos adicionar o script de música à lista de nós carregados automaticamente. No script do gerenciador de cena, podemos exportar uma variável para conter a faixa de música de fundo para cada cena, já que cada gerenciador de cena herdará a variável e poderá atribuir seu próprio valor a ela Nosso script de gerenciador de cenas agora pode acessar facilmente o nó de carregamento automático de música usando o nome do nó, dizendo ao nó musical que reproduza a faixa desejada para essa cena. Vamos atribuir uma faixa musical diferente para cada uma das cenas do título e do jogo. E também certifique-se de diminuir a música sempre que mudarmos Vamos experimentá-lo. A música da cena do título aparece, pressionar o botão do novo jogo diminui a música e a cena do jogo reaparece com sua própria música Pausar e pressionar exit desvanece a música e a música-título volta a entrar Isso funciona bem, desde que toquemos apenas uma faixa de música por cena e sejamos cuidadosos em sempre desaparecer antes de solicitar uma Mas e se quiséssemos dizer ao music node que tocasse uma faixa diferente enquanto ele já está tocando ou até mesmo a mesma faixa? Seria uma boa ideia adicionar algumas condições extras à função de reprodução da faixa. Vamos começar verificando se o nó de música já está sendo reproduzido. Em seguida, verifique também se o que o node está tocando é o mesmo que queremos jogar. Se for esse o caso, não precisamos alterar a transmissão ou pedir que ela seja reproduzida. Podemos simplesmente retornar o sinal finalizado de interpolação que é retornado diminuindo o volume Se uma faixa diferente já estiver sendo reproduzida, devemos diminuí-la antes de mudar para esta Aguarde até que o gêmeo termine prossiga com o restante dessa função. Observe que agora isso executará duas execuções de volume de fad, cada uma com duração de 1 segundo Como resultado, serão necessários 2 segundos para mudar de faixa. Vamos tornar isso mais flexível exportando a duração, como fizemos com o FAD, e atribuindo a ela um valor padrão de 1 segundo Em seguida, permita que as funções play track e fade out aceitem um parâmetro de duração opcional com um valor padrão da variável exportada Passando o parâmetro de duração para a função de volume de atenuação Podemos usá-lo na chamada do método tween como argumento. Dando uma olhada nos scripts do gerenciador de jogos e títulos, O on new game pressed e on funções O on new game pressed e on exit pressionadas estão muito parecidas agora. Vamos escrever um método herdado para mudar cenas em nosso script de gerenciador de cenas Cenas de mudança nomeadas. Podemos fazer com que a música desapareça. Espere até que o Fade fique preto, retome o jogo se ele estiver pausado e, em seguida, mude a cena da Passando o caminho do arquivo como argumento. Para obter os resultados que esperamos, precisaremos garantir que o sinal aguardado seja aquele com maior duração A declaração de espera também deve ser a última se quisermos que todos os pré-adolescentes aconteçam em paralelo Se, por algum motivo, você precisar reorganizar a ordem dessas declarações para que o sinal aguardado não seja o retornado, você também pode armazená-lo em uma variável e aguardá-lo em uma Agora, o gerenciador de títulos pode fazer tudo isso chamando seu método herdado de mudança de cena, passando o caminho das cenas do jogo como argumento Da mesma forma, o gerente do jogo também pode fazer isso mudando para a cena do título. Além disso, não se esqueça de que as subclasses sempre podem substituir esses comportamentos se você quiser que uma cena específica se comporte de forma diferente Agora temos música de fundo que entra e desaparece suavemente em cada cena do nosso jogo Na próxima lição, adicionaremos um menu de configurações para alterar as configurações do jogo. Te vejo na próxima aula. 7. Configurações: Olá, amigos. Na lição anterior, adicionamos música de fundo que entra e desaparece suavemente. Nesta lição, adicionaremos um menu de configurações ao nosso jogo. Vamos começar na cena do título. Ao contrário dos botões e menus que criamos até agora, que estão flutuando na frente de tudo, eu preferiria que as configurações do jogo estivessem dentro de um painel Há duas notas de controle diferentes que podemos adicionar à nossa cena, que se comportam de forma diferente. Um painel é apenas uma janela básica que podemos redimensionar como quisermos e reorganizar seus filhos de qualquer forma Um contêiner de painel se redimensionará automaticamente para encapsular seus filhos, semelhante a um contêiner de caixa horizontal ou vertical Ambos têm vantagens e desvantagens. Gosto de usar um contêiner de painel para economizar tempo e esforço de dimensionar e reorganizar os nós secundários enquanto estou construindo minha interface de usuário Mas eu posso mudar para um painel se quiser mais flexibilidade quando se trata polir o projeto finalizado Como nossa classe de configurações tem algumas variáveis booleanas. Podemos adicionar uma caixa de seleção ou um botão de seleção para cada variável, permitindo que o jogador defina seu valor como verdadeiro ou falso adequadamente. Vamos adicionar um para câmera invertida x e outro para câmera invertida Vou adicionar um de cada, para que eu possa ver como eles são e decidir de qual deles eu gosto mais tarde. A configuração do volume é uma variável flutuante, que geralmente é controlada nos menus por um controle deslizante Já que um controle deslizante imporá inerentemente um valor mínimo e máximo Cada uma dessas configurações também precisará um nó de rótulo para dizer ao jogador para que servem. Assim como usamos contêineres de caixa horizontais e verticais para organizar os nós automaticamente. Também podemos usar um contêiner de grade para organizar automaticamente os nós em um padrão de grade. A propriedade exclusiva dos nós da grade é o número de colunas na grade. As linhas são adicionadas e removidas automaticamente do contêiner da grade para acomodar o número de filhos que ele tem. Definindo isso como dois, podemos organizar facilmente todos os nós do rótulo na coluna esquerda e os nós de controle interativos no lado direito O contêiner da grade comprimirá todos os seus filhos o máximo que puder Mas podemos especificar tamanhos mínimos para qualquer um deles. Eu darei ao controle deslizante de volume um valor mínimo de x de 100 pixels, que força a coluna direita do contêiner da grade a se expandir Agora, acho que as caixas de seleção ficariam melhor centralizadas na coluna Expandindo a seção de layout e a subseção de dimensionamento do contêiner, definirei o valor horizontal como centro de redução Agora, a caixa de seleção está centralizada horizontalmente na coluna E eu farei o mesmo com o botão de verificação. Agora que podemos ver nosso controle deslizante, vamos dar uma olhada em suas propriedades no inspetor Podemos definir seus valores mínimo e máximo, bem como o valor do passo, que é uma distância entre os valores nos quais o controle deslizante pode ser definido Usando nossas configurações de volume linear, o valor mínimo deve ser zero. Um valor máximo de um é bom, pois um em termos lineares equivale a 0 decibéis Mas também podemos permitir que o volume ultrapasse isso. Como sabemos que o valor máximo em decibéis do nó do reprodutor de fluxo de áudio é de 24 decibéis Na verdade, podemos digitar funções incorporadas nesse campo, usando db para linear, passando 24, obtemos 15.849 como o valor máximo real Mas isso pode causar uma diminuição na qualidade do áudio. Definir o volume linear máximo como um é adequado para a maioria dos casos. Algo tão fluido quanto o volume geralmente pode ser ajustado em um grau muito pequeno. Como meu controle deslizante tem 100 pixels, definirei o valor do passo 0,01, com cada pixel representando uma alteração de 1% no volume Também precisaremos de uma etiqueta de título para esse menu. E um botão que o fecha. Mas eles não pertencem como parte da rede. Podemos classificar o contêiner da grade de título e botão de fechar dentro de um contêiner de caixa vertical. A etiqueta do título e o botão fechado são esticados para caber na mesma largura do contêiner da grade Vou centralizar o título usando sua propriedade de alinhamento. O botão pode ser configurado para encolher começar a colocá-lo no canto inferior esquerdo Encolha o centro para o centro ou encolha a extremidade para colocá-lo no canto inferior direito Se você não quiser usar esses contêineres ou considerá-los muito restritivos, você sempre pode usar um painel normal e um manual posicionar cada um dos nós secundários para obter a organização desejada Podemos reutilizar o recurso do tema nosso menu de configurações, se quisermos, mas talvez você queira usar estilos de botão diferentes para diferentes partes do jogo Nesse caso, você pode criar facilmente um novo recurso temático. Vou apenas adicionar uma configuração de contêiner de painel aos existentes. Mude sua caixa de estilo para uma textura. E dê a ele algumas margens de conteúdo de 16 pixels. As caixas de seleção estão herdando seus estilos do botão, então podemos substituir isso adicionando uma caixa de seleção ao tema e substituindo todas as caixas de estilo Vou usar apenas caixas de estilo vazias. Em seguida, repita o processo para o botão de verificação. Ok. Acho que o título deveria ter um tamanho de fonte maior do que os outros rótulos. Vou substituir o tamanho da fonte na seção de substituição do tema Agora que vi a caixa de seleção e o botão de seleção e posso compará-los no contexto do menu Acho que prefiro a caixa de seleção e vou trocar o y invertido da câmera para Com o menu construído, vamos ancorá-lo no centro da tela Já escrevemos um script de menu que mostra e oculta um nó de controle e também pode dar foco quando um menu é aberto. Vamos anexar isso ao nó do menu de configurações. E defina seu item de foco padrão para o primeiro item do menu, a caixa de seleção X invertido da câmera Mas, para conectar os sinais de controle ao nosso script, ele precisará ser um script diferente dos usados por outro menu. Podemos dar ao manuscrito um nome de classe seguida, criar um novo script na pasta de scripts de interface do usuário, herdando do menu Vamos chamá-lo de menu de configurações. Arrastando esse script para o nó do menu de configurações, ele substitui o Mas precisaremos repreencher o item de foco padrão. Em nosso novo script, precisaremos inicializar cada um dos nossos nós de controle para corresponder aos valores que já estão dentro do recurso de configurações Portanto, precisaremos obter referências a cada um dos nossos nós de controle usando At on ready. Em seguida, na função ready, podemos definir os valores para a variável correspondente no recurso de configurações do arquivo. Com nossos controles de configuração classificados no menu e inicializados Agora podemos conectar sinais de cada nó de controle ao manuscrito de configurações Chamando uma função sempre uma configuração for alterada pelo player Os nós da caixa de seleção e do botão de seleção conectarão o sinal alternado, informando se ele está definido como verdadeiro ou falso E o controle deslizante conectará o sinal de valor alterado, fornecendo o novo valor para o qual ele acabou de ser definido Podemos definir os valores das variáveis dentro das configurações de pontos do nosso arquivo para corresponder a qualquer um dos valores que foram alterados usando os nós de controle. Uma vez que os controles da câmera estão lendo diretamente as configurações para determinar como elas funcionam. Nenhuma ação adicional é necessária para que essas configurações funcionem. Mas a configuração do volume não afetará automaticamente o nó musical. Precisaremos ajustar sua configuração de volume manualmente. Quando a configuração do volume muda, podemos chamar o volume linear passando um novo valor como argumento. Vamos executar essa cena e tentar ajustar a configuração do volume para ouvir a diferença imediata com a música tocando Um jogo completo provavelmente terá mais nós de áudio, cada um com sua própria configuração de volume. Talvez não queiramos ajustá-los todos individualmente a partir do menu de configurações. Para antecipar essa necessidade, podemos emitir um sinal aqui para dizer a toda a cena que a configuração do volume foi alterada Então, qualquer nó que esteja ouvindo a emissão desse sinal pode reagir a ele Na parte superior do script, podemos declarar sinais da mesma forma que declaramos variáveis, usando a palavra-chave signal Vamos alterar o volume do nome. É convencional nomear sinais no pretérito, informando ao que aconteceu e aos quais outros scripts deveriam reagir Semelhante a uma função, podemos adicionar colchetes ao final da declaração do sinal para adicionar parâmetros a ela Não podemos apenas emitir que o volume foi alterado, mas também emitir o novo valor do volume como um valor flutuante Ao conectar esse sinal a uma função, a função receptora deve aceitar um parâmetro flutuante que corresponda ao sinal Em seguida, vamos conectar o sinal pressionado dos botões fechados ao método fechado da classe de menu para fechar o menu. A maioria dos jogos permite alterar as configurações das cenas do título e do jogo. Vamos salvar a ramificação do menu de configurações como sua própria cena. Em seguida, copie o nó do menu de configurações e cole-o nas cenas do jogo I. É sempre uma boa ideia garantir que o nó de fade esteja na frente de todo o resto, então classificarei o menu de configurações acima dele e definirei sua propriedade visível como false Podemos adicionar facilmente um botão de configurações ao menu de pausa. Como as duas cenas têm o menu de configurações, assim como o Fade, podemos exportar uma variável do script do gerenciador de cenas, para que tanto o gerenciador de títulos quanto o gerenciador de ganhos possam usá-la E nas duas cenas, o menu de configurações é acessado a partir de outro menu. O menu principal das cenas do título ou o menu de pausa das cenas do jogo Podemos criar uma implementação muito simples do Breadcrumbs em nosso manuscrito, portanto, sempre que um menu for aberto a partir de outro menu, fechá-lo retornará automaticamente ao em nosso manuscrito, portanto, sempre que um menu for aberto a partir de outro menu, fechá-lo retornará automaticamente ao menu anterior. Em nosso manuscrito, podemos declarar outra variável. Vamos chamá-lo de underscore Breadcrumb do tipo menu. Em seguida, adicione um parâmetro opcional à função aberta, também chamada de Breadcrumb Se o breadcrumb for algo diferente de nulo quando o menu for aberto, devemos salvá-lo na variável e fechar esse menu antes Então, quando o menu for fechado, se o breadcrumb não for nulo, esse menu deverá ser aberto após o fechamento deste, então ele poderá ser redefinido como Os scripts do gerenciador de títulos e do gerenciador de jogos agora podem abrir o menu de configurações, passando os botões do menu ou o menu de pausa como migalha de pão Abrindo a cena do menu de configurações. Vamos garantir que o item de foco padrão esteja definido e que esses nós sejam processados sempre, mesmo quando o jogo estiver pausado Vamos tentar rodar o jogo. Alterar as configurações do jogo e mudar para a cena do jogo. Os controles de volume e câmera permanecem alterados e podemos alterá-los novamente no menu de pausa Agora temos um menu de configurações que pode alterar os controles de volume e câmera em tempo real. Na próxima lição, adicionaremos eventos de transição para mover nosso personagem entre diferentes níveis. Te vejo na próxima aula. 8. Saída: Olá, amigos. Na lição anterior, adicionamos um menu de configurações. Nesta lição, detectaremos quando o jogador entra em uma porta e nos prepararemos para fazer a transição para um nível diferente Vamos começar em qualquer nível que esteja atualmente carregado na cena do jogo Para mim, isso é um quarto três. Há duas portas que saem desta sala. Quando o jogador entra em qualquer uma dessas portas, ele deve fazer a transição para um nível diferente do meu jogo Da mesma forma que o corpo do nosso personagem está colidindo com o corpo estático do chão, podemos detectar colisões com espaço vazio para fazer com que algo aconteça O nó que faz isso é chamado de nó D da área três. E, assim como um corpo físico, ele requer uma forma de colisão antes de funcionar Vamos adicionar um nó D em forma de colisão e transformá-lo em uma caixa Para ajustá-lo ao tamanho dos meus ladrilhos, farei com 4 metros de comprimento, largura e altura. Vamos renomear o nó D da área três para fazer a transição. Em seguida, crie sua própria cena clicando e arrastando-a para a pasta de cenas na guia do sistema de arquivos Em seguida, abra a nova cena de transição para edição. Eu gostaria que a origem das transições estivesse claramente no chão Vamos mover a forma de colisão para cima ao longo do eixo y, metade de sua altura de 4 metros, que é 2 metros Para reagir às colisões com o jogador, o nó de transição precisará de um script Vamos criar um novo script clicando no ícone de rolagem. OK. Certifique-se de que ele esteja salvo na pasta de scripts. O nome padrão e a herança estão corretos. O nó D da área três tem vários sinais diferentes para reagir a colisões Como o corpo do nosso personagem se qualifica como um corpo físico e queremos reagir ao personagem entrar nessa área, o sinal que queremos é inserir o corpo Conectar esse sinal ao próprio nó de transição cria a função on body entered, que aceita o corpo que entrou nessa área como um parâmetro do tipo nó três D. Podemos ver os tipos dos parâmetros na lista de sinais. Por enquanto, vamos imprimir o corpo para ver nossa colisão funcionar. Executando a cena do jogo, entrando na área de transição, o nome do corpo do personagem, três notas D são impressas, mas também os nomes dos nós corporais estáticos em nossa cena. Não queremos que qualquer corpo físico entre nessa área para desencadear uma reação, apenas o personagem do jogador. Podemos verificar se o corpo é de uma determinada classe. Ou verifique o nome do nodo para ver se esse é o personagem do jogador. Mas essas soluções não são muito flexíveis. Um método mais fácil e limpo é garantir que apenas o personagem do jogador possa realmente colidir com essa área usando o mascaramento de colisão Primeiro, vamos abrir a cena do personagem e selecionar o nó D do corpo do personagem. Examinando as propriedades herdadas do objeto de colisão três D, expanda a seção de colisão Há dois conjuntos de números aqui indo até 32. Essas são camadas de colisão, que podemos usar para controlar quais objetos em nosso jogo podem colidir uns com os outros e quais Até agora, tudo em nosso jogo existe na camada um padrão e mascara ou colide apenas com a camada um Já que a camada um é a padrão e tudo colide com ela por padrão Vamos fazer com que a camada um seja o terreno do jogo. Da forma como essas camadas são exibidas em blocos de oito, gosto de pensar em cada bloco como camadas agrupadas As primeiras oito camadas do meu jogo podem ser reservadas para as camadas do mundo ou do ambiente. Nosso personagem pode existir em uma camada única diferente. Vamos usar a camada nove como exemplo. Dessa forma, todo o segundo bloco de camadas pode ser reservado para camadas de colisão relacionadas ao jogador Abrindo as configurações do projeto, na guia geral, abaixo dos nomes das camadas, podemos alterar os nomes de cada uma dessas 32 camadas que existem para três físicas D. Nomearei o terreno da camada um e o jogador da camada nove. Passar o mouse sobre as camadas no inspetor exibirá Na cena de transição, como nada precisa ser capaz detectar ou colidir com nossa área, na verdade ela não precisa existir em nenhuma camada sinta-se à vontade para reservar uma camada de colisão para transições, se isso ajudar você A transição só precisa ter uma máscara de colisão para detectar colisões com o jogador Desativando a camada um e mascarando apenas a camada nove, o player Podemos reforçar isso ainda mais alterando as propriedades do nó D da área três, ordenando que ele monitore outros corpos físicos, mas não seja monitorável por outros corpos físicos Agora, a única maneira possível essa área três D desencadear uma colisão é detectando um corpo físico na camada nove Ele não procurará nenhuma outra camada e ficará invisível para todo o resto. A área de transição pode ser posicionada para cobrir o espaço vazio além da entrada, impossibilitando que personagem do jogador saia dessa sala sem colidir com Abrindo todas as minhas cenas de diferentes níveis. Eu posso ver que essa transição destina a se conectar à Sala 1. Então, vamos chamá-lo de dois quartos um. Duplicar o nó renomeará automaticamente a duplicata para duas salas dois, e eu posso reposicioná-la na outra porta T Embora meus níveis sejam pequenos, cada um tem apenas duas transições. Você pode imaginar como um nível grande e complexo pode ter muitos outros que são difíceis de controlar. Portanto, devemos agrupar esses nós para classificá-los dentro da árvore de cenas. Vamos adicionar um novo nó, apenas um nó normal, e nomeá-lo como transições. Em seguida, reorganize os nós de transição para ele. Isso os tornará mais fáceis de encontrar e usar não apenas em nossa árvore de cenas no editor, mas também em nossos scripts posteriores. Podemos copiar e colar esses nós em nossas cenas de nível e reposicioná-los para cobrir todas as portas Renomeando-os para que saibamos aonde eles levam. Abrindo o script de progresso, podemos alterar as variáveis ou adicionar novas para armazenar o nome do nível em que o jogador está atualmente como uma string. Vou inicializá-lo para ser o quarto um. Para que esse método funcione, o valor dessa variável deve ser a grafia exata do nome da cena do nível na guia do sistema de arquivos No script de transição. Podemos então definir essa variável à medida que o jogador faz a transição entre os níveis Vamos exportar uma variável para conter o nome do nível ao qual essa transição leva como uma string. Então, quando o corpo do personagem entra nessa área, podemos definir o valor do nível do ponto de progresso do ponto do arquivo. Para ser o nome do nível. Em seguida, vamos pedir ao gerente do jogo que mude para esse nível. Como fizemos no script do jogador, sempre podemos acessar o nó raiz da cena iniciando o caminho do nó com a raiz de barra do cifrão e, em seguida, fazendo com que o gerente do jogo informe o jogo Vamos pedir ao gerente do jogo que chame uma função que ainda não escrevemos chamada Load level. Como o nome do nível já está armazenado no recurso de progresso, não há necessidade de passá-lo como argumento. Como a única vez que estamos tentando acessar o gerenciador de jogos é nessa única instância, não há necessidade de armazená-lo em uma variável ou usar o complemento pronto. Especialmente porque, logicamente, apenas um evento de transição pode acontecer por nível carregado no jogo Portanto, cada transição declarando a variável e acessando o gerenciador de jogos quando apenas um realmente precisa dela seria mais um desperdício No script do gerenciador de jogos, vamos primeiro pegar uma referência ao nível que já existe na cena. Podemos clicar e arrastar o nó o script para produzir automaticamente o caminho do nó ou até mesmo manter pressionada a tecla de controle ou comando enquanto soltamos o botão do mouse para armazená-lo automaticamente em uma variável. Vou renomear a variável para o nível atual. Em seguida, declare a função de nível de carga que chamamos no script de transição Primeiro, precisaremos saber se já existe um nível carregado verificando se essa variável contém um valor ou se é nula Se ele contiver um valor , primeiro devemos esperar f para preto Podemos então descarregar o nível atual da nossa cena de jogo usando a função incorporada Q. Vamos sobrecarregar a próxima cena na próxima Por enquanto, vamos esperar que o Fate resolva e experimente. Se o jogador entrar pela porta, a cena fica preta O nível atual é removido da árvore de cenas e, em seguida, voltamos para ver nosso personagem e a queda livre, já que não há mais nenhum nível Nosso painel de depuração está nos dando dois avisos. Declaramos uma variável que nunca foi usada no script e há um parâmetro não usado em nossa função de colisão Podemos prefixar parâmetros não utilizados com um sublinhado para sinalizá-los para o mecanismo, para que possam ser ignorados Ao mudar para o script de transição, o parâmetro body não é mais usado. Podemos adicionar o prefixo ao nome da variável para satisfazer esse aviso No script do gerenciador de cenas. Declaramos a variável settings manu neste script, mas ela não está sendo usada dentro desse script Fizemos isso de propósito porque as muitas variáveis de configurações são herdadas e usadas por todos os herdeiros dessa classe Não temos a intenção de realmente usar o script do gerenciador de cenas diretamente, mas o estamos usando para conter todas as propriedades e comportamentos semelhantes de um grupo de scripts relacionados. Em outras linguagens, isso seria conhecido como uma classe abstrata. Esse padrão de usar a herança dessa forma é conhecido na programação orientada a objetos como Podemos optar por ignorar qualquer aviso adicionando outra linha antes da linha que está acionando o aviso usando at warning Em seguida, especifique o aviso que queremos ignorar. Nesse caso, declaramos uma variável privada não utilizada Com os dois avisos de depuração resolvidos, a execução do jogo não apresentará mais nenhum Agora temos o nível atual descarregando quando o jogador entra em uma porta Na próxima lição, carregaremos o próximo nível e posicionaremos o jogador na porta correspondente do outro lado Te vejo na próxima aula. 9. Enter: Olá, amigos. Na lição anterior, fizemos com que o jogador saísse do nível por uma porta Nesta lição, carregaremos o próximo nível e posicionaremos o jogador dentro dele. Antes de carregar o próximo nível, primeiro verificamos se há um nível atual e, em caso afirmativo, estamos descarregando-o Podemos então atribuir um novo valor à variável de nível atual, pois agora ela está vazia. Usando um carregamento de função incorporado, podemos carregar qualquer recurso da nossa guia do sistema de arquivos, incluindo cenas, especificando um caminho de arquivo como uma string Para manter nossas cenas melhor organizadas, vamos criar uma subpasta dentro da pasta de cenas chamada levels Em seguida, coloque cada um dos níveis do jogo dentro dessa pasta. Selecionando qualquer uma das cenas de nível, podemos clicar e arrastar até os colchetes das funções de carregamento os colchetes das funções de carregamento para preenchê-la com o caminho do arquivo Como todos os níveis do nosso jogo estão localizados na pasta de níveis e todos terminam com a extensão TSCN de ponto, podemos separar essas partes da string usando o operador Append, o Em seguida, substitua o nome da cena do nível pelas armazenadas dentro do recurso de progresso. A função load retorna um recurso. Mas a variável de nível atual é um nó três d. Primeiro precisamos chamar uma função no recurso para transformá-la em um nó, instanciar pontos Em seguida, adicione-o à árvore de cenas com a função add child. Como esse é o script do gerenciador de jogos anexado ao nó raiz das cenas do jogo, o nó de nível será adicionado como filho do nó do jogo. Mas e quando o jogo começa? Ou se o player carregar um arquivo seguro? Podemos começar nossa cena de jogo sem um nó de nível. Excluindo o nó de nível da cena do jogo, podemos remover o complemento pronto da variável de nível atual Vamos substituir imediatamente a função pronta herdada do gerenciador de cenas e o nível de carga de chamadas Antes de executar a definição da superclasse do Scene Manager Isso nos permitirá carregar qualquer nível em nosso jogo, simplesmente definindo o nome do arquivo dentro recurso de progresso e chamando o nível de carregamento. Ela fará uma transição clara entre os níveis, primeiro ficando preta e descarregando a cena atual, depois carregando o próximo nível e voltando Se for a primeira vez que um nível está sendo carregado e não há nenhum nível atual, ele pulará essa etapa e carregará o nível imediatamente Mas precisaremos posicionar o jogador dentro do novo nível e também garantir que a posição esteja vinculada ao caminho pelo qual ele entrou no nível. Vamos começar na cena de transição, adicionando um novo nó que nada mais faz do que simplesmente marcar uma posição em três espaços D, um marcador em três nós D. A única diferença entre um marcador de três nós D e um nó três D é que o marcador desenhará um Gizmo e o editor mostrará Vamos renomear essa entrada do nó e movê-la para frente ao longo do eixo Z, para que fique fora do nó da área e longe o suficiente para que o personagem do jogador não colida com a No script de transição, podemos arrastar isso e segurar o controle ou comando para adicioná-lo como uma variável sem estar pronto. Essa será a posição em que o jogador será gerado no nível ao entrar nessa transição Em nossas cenas de nível, podemos girar qualquer uma de nossas transições para apontar o eixo Z e o marcador de entrada para um ponto apropriado dentro do Se, por algum motivo, você precisar mover um marcador de entrada individual sem afetar outras transições, você sempre pode clicar com o botão direito do mouse em um nó de transição e ativar os filhos editáveis Isso permitirá que você mova um marcador de entrada específico para considerar obstáculos ou variações na altura do piso, por exemplo Antes de descobrirmos como posicionar o jogador, precisaremos das cenas de nível para acompanhar suas transições com o script Vamos adicionar um novo script ao nó raiz dos níveis chamado level na pasta de scripts. Se arrastarmos o nó de transição, podemos armazená-lo em uma variável com a adição pronta. Mas não queremos esse nodo. Queremos todos os seus filhos. Usando uma função embutida get children, armazenaremos uma lista de todos os nós filhos desse nó de transição em uma matriz de nós. A ordem dos nós na matriz será a mesma da árvore da cena. Podemos acessar o conteúdo de uma matriz especificando um número de índice a partir de zero Vamos escrever uma função em nosso script de nível que fornece o número do índice de transições e retorna coordenadas onde o personagem do jogador deve ser colocado Vamos chamá-lo de get entry, aceitando o índice de transição como um parâmetro inteiro E retornando um vetor três, a posição em três espaços D para o caractere a ser colocado. Podemos acessar a matriz de transições, colocando o número do índice entre colchetes Se o número do índice for zero, isso nos dará o nó superior, seguido por um, dois, etc Em seguida, obteremos o marcador de entrada da transição e obteremos a propriedade de posição global do marcador de entrada com três nós D. Uma vez que a posição da nota é relativa à sua mãe. Queremos saber a posição global como ela existe em toda a cena, para que possamos devolver isso. Precisaremos anexar o script do nível à nota raiz de cada nível do nosso jogo. No entanto, também existe a possibilidade improvável de que, ao carregar o nível antes de reposicionar o personagem, o personagem simplesmente já esteja dentro de uma área de transição Na cena de transição, devemos desativar a propriedade de monitoramento por padrão. Então, no script de nível, quando um nível é carregado e o personagem está posicionado corretamente, podemos chamar uma função para ativar todas as transições Um recurso muito útil das matrizes é nossa capacidade de iterar em cada um de seus elementos usando um loop Começando com a palavra-chave quatro, podemos especificar um alias, que usaremos dentro do loop para nos referirmos ao elemento atual Seguido pela palavra-chave in, depois pelo nome da matriz e dois pontos Qualquer coisa que colocarmos dentro do bloco de loop será executada em cada elemento da matriz e podemos nos referir ao elemento atual usando o alias Para cada transição nas transições, podemos definir sua propriedade de monitoramento como verdadeira para ativar todas as transições nesse nível No script do gerenciador de jogos, podemos pegar uma referência ao personagem do jogador. Então, quando um nível é carregado, podemos posicionar o jogador na entrada dos níveis. Vamos usar zero como argumento por enquanto. Agora que o personagem foi posicionado, podemos ativar todas as transições no nível, pois sabemos que o personagem não está tocando em nenhuma delas Finalmente, precisamos definir os valores de cada transição em cada nível no inspetor, para que cada transição saiba a qual nível ela se conecta Executando a cena do jogo, o jogo agora começa na sala um e o jogador está posicionado em frente à porta O filho superior do nó de transições. Ao entrar em qualquer porta, o nível é descarregado e as cenas do jogo, que estão no nível correto Mas não importa por qual porta passemos, o jogador está sempre posicionado na frente da mesma Vamos adicionar outra variável ao recurso de progresso chamada ID de transição do tipo int. Em seguida, adicione também essa variável ao script de transição exportado Quando o personagem do jogador entra nessa transição, podemos definir o valor dentro do recurso de progresso para corresponder à variável exportada E no script do gerenciador de jogos, use isso como argumento para selecionar a transição em que o jogador será colocado. Começando na sala um, vamos dar uma olhada na transição para a sala dois, que agora tem uma variável de ID de transição com valor zero. Esse será o índice do nó de transição que retorna à cena da sala dois. Podemos ver que a transição para a Sala 1 é o nó secundário superior, que é o índice zero. Então, isso está correto. Dando uma olhada na transição da sala dois para a sala três. Vamos mudar para a cena da Sala três, e podemos ver que a transição da Sala três para a sala dois é o Índice um. Portanto, precisaremos alterar o ID de transição da sala dois para a sala três para uma. E as transições que saem da sala três também precisarão ser alteradas para uma Executando a cena do jogo, agora podemos correr entre todos os nossos níveis, tanto no sentido horário quanto no anti-horário, e o jogador está Se seus níveis tiverem muitas transições, recomendo definir uma convenção para seu jogo sobre como você organiza suas transições, como no sentido horário a partir do Norte Você também pode alterar o número do índice para uma string e organizar suas transições em um dicionário em vez de em uma matriz Também gostaria de ter certeza de que tanto o personagem quanto a câmera estejam apontados para longe da transição a partir da qual o jogador entra em um nível. No script de nível, assim como retornamos a posição global de entrada de uma função, também retornaremos a rotação das transições de outra função Agora, o script do gerenciador de jogos pode acessar essa função para determinar qual direção eles devem estar voltados. Podemos passar essas informações para o script do jogador e usá-las para girar tanto o personagem quanto a mola que segura a câmera, chamando de ficção, passando a rotação retornada como argumento Passe na direção, aceitando a rotação y como flutuando. Pode facilmente ajustar a rotação dos braços da mola para coincidir. Mas o braço da mola deve ser girado 180 graus para ficar atrás do personagem Como a rotação é medida em radianos, isso significa que podemos adicionar ou subtrair Pi desse valor para apontar a câmera na direção correta Podemos então passar esse valor de rotação pela cadeia para a classe de caracteres. E adicione outra função para girar o equipamento do personagem para ficar imediatamente voltado para a direção desejada Vamos experimentá-lo. Mesmo se posicionarmos o personagem e a câmera em ângulos estranhos antes de entrar pela porta, ambos estarão de costas para a porta do outro lado Isso ajudará o jogador a entender de onde ele veio. Agora temos o jogador capaz de fazer a transição entre os níveis e nossa cena de jogo. Na próxima lição, salvaremos e carregaremos o progresso dos jogadores. Te vejo na próxima aula. 10. Salve: Olá, amigos. Na lição anterior, concluímos nosso processo de transição de nível. Nesta lição, salvaremos e carregaremos o progresso dos jogadores no jogo. Nosso script de arquivo tem várias variáveis contendo recursos personalizados que usamos para acompanhar as configurações do jogo e o progresso dos jogadores. Vamos começar com o recurso de configurações. Na função ready, estamos criando um novo recurso de configurações, mas só devemos fazer isso se ainda não existir um que possamos carregar. A condição I verificará primeiro se o recurso ceti existe e, se existir, carregá-lo; caso contrário, criará um novo e o salvará imediatamente. Essa linha será, na verdade , o bloco else de uma instrução IF. Godo nos permite salvar e carregar qualquer recurso usando classes Singleton O carregador de recursos pode carregar nosso recurso, chamando o método load, passando um argumento de string, um caminho de arquivo Em vez de acessar um recurso em nosso projeto, desta vez, queremos carregar algo do sistema do usuário. O caminho do arquivo começa com a barra de dois pontos do usuário. O mecanismo Godo usará o atalho para encontrar um local apropriado em qualquer sistema para salvar e carregar arquivos exclusivos para cada usuário Vamos nomear as configurações do arquivo e atribuir a ele uma extensão de RS para recurso. Essa função de carregamento retorna um recurso, que podemos atribuir à nossa variável de configurações. Antes de carregar as configurações, podemos executar uma função semelhante para primeiro verificar se o arquivo existe. Como o caminho do arquivo agora é escrito duas vezes, também o usaremos mais, e esse é um valor que nunca deve ser alterado. Eu seria mais eficiente declará-lo como uma constante. Se o arquivo de configurações não existir , podemos criá-lo. E salve-o imediatamente usando a classe de economia de recursos, chamando o método save O método save requer um recurso para salvar, que é nosso recurso de configurações, e o caminho do arquivo para salvá-lo, que é o caminho das configurações. Agora, ao executar o jogo, se as configurações existirem para o usuário, elas serão carregadas e, caso contrário, serão criadas. Mas também precisamos fazer algumas alterações no menu de configurações. Todas as nossas configurações precisam ser definidas com os valores que foram carregados, que estão na função ready. Definimos a posição inicial do controle deslizante da configuração de volume usando os números armazenados no recurso de configurações Mas também precisamos definir o volume do nó musical e emitir o sinal aqui, como fizemos abaixo, em resposta à alteração do valor do controle deslizante Quando o player abre o menu de configurações, ajusta algumas configurações , seria uma boa ideia salvá-las quando o menu for fechado Podemos substituir nosso método de fechamento de classes de menu ; portanto, quando o menu de configurações for fechado, solicitaremos ao carregamento automático do arquivo que salve as configurações De volta ao carregamento automático do arquivo, podemos adicionar a função que salva as configurações. O recurso de progresso, por outro lado, não será tratado na função ready Podemos separar cada um desses métodos em funções públicas para acessar o recurso de progresso de várias maneiras. Verificando se ele existe, iniciando um novo jogo e carregando. Usando o mesmo formato de nossas configurações, podemos declarar uma constante de caminho de salvamento A função safe file exists, retornará um booleano, retornando o mesmo valor retornado pelo carregador de recursos do Passando o caminho de salvamento como argumento. Criação de um novo recurso de progresso quando um novo jogo é chamado. Salvando o recurso quando o jogo salvo é chamado e carregando o recurso quando o carregamento do jogo é chamado. Na cena do título, agora podemos criar facilmente um novo recurso de progresso quando um novo jogo é pressionado. E carregue o arquivo seguro existente se continuar for pressionado. Seria um bom design de interface de usuário ter o botão continuado desativado b e ativá-lo apenas se houver um arquivo seguro para carregar. Vamos pegar uma referência ao botão de continuação usando o complemento pronto. Na função ready, se existir um arquivo seguro, podemos ativar o botão de continuação definindo sua propriedade desativada como false . Em seguida, peça que ele capture o foco. Dessa forma, a opção padrão será novo jogo na primeira vez que o jogo for jogado e continuará sempre depois disso. Tudo o que precisamos fazer é decidir quando salvar o jogo. Como esse script de arquivo é um nó de carregamento automático, você pode facilmente chamar a função de salvamento para fazer isso no menu de pausa ou no objeto de ponto de salvamento em seu jogo Vou fazer com que meu jogo seja salvo automaticamente toda vez que o gerente de jogo descarregar um nível De volta ao script do gerenciador de títulos, vamos também completar a função de saída. Assim como quando o jogo começa, podemos esperar que fade to black antes de sair Sair do jogo é uma função incorporada da árvore de cenas, que podemos acessar com get tree e simplesmente chamar a função Q. Em nossos scripts de recursos personalizados, precisaremos adicionar uma exportação na frente de qualquer declaração de variável que desejamos que seja gravada no arquivo Safe Qualquer variável que não quisermos salvar pode simplesmente omitir a tag de exportação Se, por exemplo, você estiver usando o método de ponto seguro comum aos JRPGs, a variável salva no arquivo seguro seria um número de identificação associado ao ponto seguro, para que fosse Mas as variáveis contendo o nível atual e ID de transição não precisariam ser salvas no arquivo seguro, pois não são necessárias para carregar o jogo, mas ainda são necessárias para fazer a transição entre os níveis. Portanto, eles não precisariam ser exportados nesse caso. No meu jogo, precisarei exportar essas variáveis, pois estou salvando meu jogo automaticamente a cada transição de nível. Uma nota final no script de carregamento automático do arquivo. Usando a extensão dot RES, escreveremos um arquivo seguro como um arquivo binário, dificultando o acesso do usuário. Adicionando um T, tornando a extensão TreS para recurso de texto, escreveremos o arquivo seguro como um arquivo de texto comum, que pode ser visualizado e editado em qualquer software de edição de texto Ambos são formatos aceitáveis. Vou salvar as configurações como texto e o progresso como um arquivo binário. Vamos experimentá-lo. Ao executar o jogo, o botão continuar está desativado, mas podemos começar um novo jogo. Na cena do jogo, vou entrar em um nível diferente, o que deve salvar meu jogo. Ao pausar o jogo, alterarei algumas das configurações do jogo. Em seguida, saia do jogo, retornando à cena do título. Agora, o botão Continuar está ativo, pois o arquivo seguro existe para ser carregado. Mas vamos sair primeiro do jogo, que fica preto e fecha a janela do jogo Agora, estou executando o jogo novamente. Desta vez, o botão Continuar está ativado, pois nosso arquivo seguro persistiu entre as sessões de jogo Continuando nosso jogo existente, começamos no outro nível, e as configurações do jogo também são as mesmas que deixamos. R. Agora, vamos dar uma olhada nos arquivos que foram criados no meu disco rígido. O arquivo de configurações pode ser aberto no bloco de notas. Podemos ver as variáveis exportadas e seus valores clareza e até mesmo editá-las e salvar o arquivo Em seguida, vamos abrir o arquivo salvo contendo o progresso dos jogadores. A maioria dessas informações é. Mesmo se editássemos algo e salvássemos o arquivo, tentar carregar o arquivo saf travará o jogo, pois ele não está mais formatado corretamente Vamos rodar o jogo mais uma vez e ver se nosso arquivo de configurações, que editamos manualmente em um bloco de notas, está carregado e os valores estão corretos Portanto, economizar recursos em formato binário é mais seguro e os recursos de texto são editados com muita facilidade. Na minha opinião, geralmente é mais benéfico para os desenvolvedores de ND poderem solucionar problemas de edição de arquivos salvos com seus jogadores do que ocultar dados de progresso para evitar fraudes Agora temos o progresso, salvamento e carregamento dos jogadores entre as sessões de jogo. Na próxima lição, encerraremos com a exibição dos créditos do jogo. Te vejo na próxima aula. 11. Créditos: Olá, amigos. Na lição anterior, salvamos e carregamos o progresso dos jogadores. Nesta lição, exibiremos os créditos do jogo. Vamos começar criando uma nova cena, a cena de crédito. Como normalmente é apenas um fundo preto com texto branco, acho que um nó de interface de usuário faz mais sentido como nó raiz. Vamos dar um script à nota raiz e chamá-la de gerente de créditos. Herdando do Scene Manager e classificando-o na pasta de scripts do gerenciador Podemos copiar a nota F de qualquer outra cena e colá-la na cena de crédito. Em seguida, atribua-o ao inspetor, além de adicionar uma faixa de música para a cena de crédito No script do gerenciador de títulos, agora podemos definir o comportamento do botão de créditos no menu principal para mudar para a cena de crédito. Também devemos salvar a cena de crédito na pasta de cenas. Em seguida, no script do gerenciador de créditos, vamos adicionar uma função que retorna à cena do título. Na função de entrada. Podemos verificar se o jogador pressionou um botão específico. Vou apenas reutilizar o botão de pular e, em caso afirmativo, retornar à cena do título Nossas cenas agora estão conectadas e podem fazer a transição para frente e para trás. A maioria dos jogos que ainda estão em desenvolvimento terá os créditos acessíveis no menu principal, já que o final do jogo ainda não foi concluído. Portanto, não haverá como acessar a cena de crédito concluindo o jogo. Incluir sua cena de crédito durante todo o desenvolvimento do jogo também ajuda a acompanhar todos os que contribuem para ela durante todo o ciclo de vida. Falando nisso, os créditos geralmente são apenas uma série de rótulos de texto organizados verticalmente, rolando lentamente Então, adicionando um contêiner de caixa vertical à cena, vamos chamá-lo de scroll. E fixe-o na parte inferior da tela. Mas com o cenário amplo. Agora, as âncoras esquerdas estão na parte inferior esquerda da tela e as âncoras direitas estão na parte inferior direita da Normalmente, é daí que os créditos se originam. Os créditos geralmente são divididos em categorias ou cargos, seguidos por uma lista dos nomes dos colaboradores dessa categoria Então, dentro da nossa caixa vertical de todos os créditos, podemos adicionar mais caixas verticais para conter cada categoria. Vou chamar isso de design de jogo. Dentro da categoria, deve haver um rótulo para o título da categoria. E eu vou dizer design de jogos. Os créditos geralmente são alinhados ao centro. Vou deixar a fonte branca. Tamanho 64 e use a mais sofisticada das minhas duas fontes para títulos de categorias Vamos duplicar esse rótulo não para adicionar outro rótulo ao nosso nome Em seguida, reduza o tamanho da fonte e altere a fonte para uma com mais ênfase na legibilidade Agora estamos listados como designers de jogos em nossa cena de crédito de jogos. Mas os créditos começam dentro da janela do jogo. Eles devem começar na parte inferior da tela. Vamos voltar para a caixa vertical de rolagem e alterar suas predefinições de âncora para personalizadas Isso manterá as âncoras onde estão, mas nos permitirá alterar cada configuração individualmente Queremos que a direção de crescimento desse elemento de controle diminua, não suba, alterando a configuração de cima para baixo. Vamos reduzir e duplicar a categoria de design de jogos para criar nossa próxima categoria, desenvolvimento de jogos Como todas as configurações estão duplicadas, precisamos apenas alterar os nomes dos nós e as propriedades de texto dos nós do rótulo e também adicionar outros nomes a cada categoria, e também adicionar outros nomes conforme necessário E repita esse processo para continuar adicionando quantas categorias forem necessárias para seu jogo, a fim de garantir que todos os envolvidos sejam creditados. Também vou dar créditos ao artista que fez os modelos de personagens, animações e modelos de ambiente , K Laberg Penzila, que criou os recursos da interface do usuário, e Eric the Funny Baron, que produziu todas as músicas E, finalmente, termine com uma mensagem de agradecimento ao jogador. Também aumentarei a mensagem de agradecimento. Nossos créditos estão todos aqui, mas estão todos apertados e difíceis de ler Vamos adicionar alguma separação ao contêiner vertical da caixa para separar as categorias. Vou separar cada categoria com 256 pixels uma da outra para dar a elas muito espaço. E podemos ver que a rolagem de crédito ficará muito longa, muito rapidamente. A última coisa que quero fazer é garantir que a mensagem de agradecimento seja exibida sozinha no final. Portanto, atribuirei a ele um valor mínimo personalizado de tamanho y correspondente à configuração de tamanho da janela do meu jogo, 720 pixels, e centralizarei o texto verticalmente nesse espaço usando a propriedade de alinhamento vertical dos rótulos De volta ao script do gerenciador de créditos, vamos exportar uma variável para a velocidade de rolagem e atribuir a ela um valor padrão de algo como 32 pixels por segundo E pegue uma referência ao pergaminho usando o complemento pronto. Em seguida, na função de processo, que usa Delta como um parâmetro flutuante representando os segundos que passaram desde o último quadro, altere a posição y da rolagem, subtraindo a velocidade Já que, ao trabalhar em duas dimensões, zero está na parte superior da tela e mover algo para cima é se mover na direção negativa. Em seguida, precisamos interromper a rolagem quando a mensagem de agradecimento chegar à tela Olhando em nossa visualização em dois d, selecionando a rolagem e expondo o valor da posição de transformação no inspetor, podemos mover a rolagem para cima até atingir a posição desejada, onde somente a mensagem de agradecimento é exibida Observando a transformação no inspetor, podemos ver que a posição y do rolo agora é igual à parte y do tamanho, mas é um número negativo e mais a altura do tamanho da tela 720 De volta ao script, podemos verificar se a posição y da rolagem excedeu esse valor C verificando se é menor que o negativo do tamanho do ponto y mais a altura da janela de 720 pixels Podemos ser ainda mais precisos com esse cálculo acessando classe singleton do servidor de exibição solicitando o tamanho atual da janela e, em seguida, acessando o valor y. Se isso for verdade, o final da rolagem foi alcançado e a mensagem de agradecimento está no centro da tela. Neste ponto, gostaríamos que o pergaminho parasse de rolar Vamos criar uma variável booleana chamada, cujo padrão será false Podemos então defini-lo como verdadeiro quando o pergaminho atender essa condição e também definir a posição y para corresponder exatamente a esse valor , de forma que fique perfeitamente centralizado, caso ultrapasse a marca Como estamos realizando esse cálculo duas vezes, vamos transformá-lo em uma variável e calculá-lo usando add on ready. Então, na parte superior da função do processo, podemos verificar se a rolagem está no final e, em caso afirmativo, retornar, impedindo que o comportamento de rolagem aconteça Isso funciona, mas em vez de simplesmente sair quando o jogador pressiona o botão de pular, prefiro ter a velocidade de rolagem e só retornar à tela de título no final da Na função de entrada, se o jogador pressionar o botão de pular, verifique também se o final do pergaminho foi alcançado antes de mudar para a cena do título Exportando duas novas variáveis, vamos chamá-las de velocidade lenta e velocidade rápida, ambas como flutuadores com valores padrão de 32 e 512 pixels A velocidade de rolagem real não precisa mais ser exportada, mas, em vez disso, vamos configurá-la para a velocidade lenta usando o complemento Podemos então definir a velocidade de rolagem para a velocidade rápida se o jogador pressionar o botão de pular antes que a rolagem chegue ao fim E ajuste-o para uma velocidade lenta se eles soltarem o botão. R: Vamos experimentar. Clicando no botão de créditos, muda para a cena de crédito. Os créditos começam a rolar lentamente da parte inferior da tela Mas podemos acelerar pressionando o botão de pular. Assim que a mensagem de agradecimento for recebida, o jogo aguardará um novo toque no botão Jump para voltar à cena do título. E isso é tudo sobre o essencial do desenvolvimento de jogos. Agora você tem um projeto de esqueleto totalmente funcional que pode ser usado para desenvolver um jogo de qualquer gênero 12. O que vem a seguir?: Bem-vindo ao meu curso sobre sistemas de diálogo e eventos em Gado. Este curso é uma continuação dos fundamentos do desenvolvimento de jogos em Gado, mas pode ser seguido e aplicado a qualquer projeto que envolva um personagem que o jogador possa controlar para interagir com NPCs ou objetos pressionando um botão e exibindo um diálogo Você está convidado a se juntar ao nosso servidor de discórdia para trabalhar neste curso ao lado de seus colegas Neste curso, abordaremos a criação de caixas de diálogo, eventos e interações. Em seguida, junte-os com bandeiras de progresso, controles de câmera e animações de personagens Quando terminar, você terá um sistema abrangente de diálogos e eventos para seu jogo que pode ser usado para produzir cenas cortadas de alta qualidade e narrativas ramificadas complexas que reagem às escolhas dos jogadores e permitem que eles progridam no Você também aprenderá habilidades úteis para trabalhar com o motor de jogo Gada, organizando e projetando seus projetos para serem mais escaláveis Você aprenderá a codificar com script GD com tudo explicado em detalhes Aplicaremos princípios de design orientado a objetos em nossos scripts, herança, encapsulamento e abstração, juntamente com outros padrões de design de engenharia de software, juntamente com outros padrões de design de engenharia de software como o padrão Singleton e Composite, para mantê-los organizados, personalizáveis e reutilizáveis para personalizáveis Todos os arquivos do projeto também estão disponíveis no Github, se você precisar revisar o projeto como estava depois de concluir cada lição Esses vídeos foram gravados usando o Gadot versão 4.2 0.2. O projeto começa com ativos dos pacotes remasterizados K Kits Character and Dungeon feitos por K L auberg e do pacote Guy básico feito por Penzla feitos por K L auberg e do pacote Guy básico feito por Todos estão disponíveis para download gratuito no dot IO.