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.