Transcrições
1. Introdução: Olá a todos, Chris aqui. E este curso eu vou estar apresentando o mecanismo de jogo gueto para todos vocês,
ajudando-os a criar um protótipo de jogo de plataforma 2D trabalhando a partir do zero. Um dos grandes focos do curso é criar uma plataforma, um controlador que pode lidar com muitas ações clássicas de plataformas como salto duplo enquanto salta e pula ataques. Para inimigos, podemos configurar padrões reutilizáveis
simples, como movimento de waypoint e ataques de projéteis. Manipulação de camadas físicas, colisões e gatilhos de área inserida ou esquerda é outra área de codificação importante para que os objetos certos dispare determinados eventos a ocorrer. Por exemplo, inimigo RB só dispara contra o jogador graças ao uso físico para construir níveis que ferramentas de mapa de mosaico e Godot são bastante úteis para nós. Você pode usar o mosaico automático para criar rapidamente níveis para teste. Em suma, eu tentei fazer o curso cobrir a maior parte do que poderia fazer tem para oferecer fora da caixa, incluindo sinais, criação de
IU, manipulação de árvores de animação, herança como uma patente de codificação e dados globais através de scripts de singletons. Então, se você quiser começar com o Desenvolvimento de Jogos, quer aprender um livre Mas atualmente em evolução motor de jogo, precisa de ajuda para construir um clássico jogo de plataforma 2D ou você só quer se divertir um pouco, então eu espero vê-lo no primeiro vídeo é meu curso onde vamos começar configurando nossas configurações de projeto e, em seguida, pulando para fazer mapas de mosaico.
2. Configurar o Godot e importe arte Pixel Adventure: Então, neste vídeo, vamos basicamente passar pelas etapas de configuração do Godot, agarrando nossos ativos e importando-os para o nosso novo projeto. Então, primeiro, se você ainda não tem Godot, pode pegar Godot no Godot Engine.org barra download. E você pode ver que há versões para Windows, Mac e Linux. Então basta ir em frente e baixar e instalar o Virgin que você precisa, como você faria com qualquer outro programa. Além disso, se você tem vapor, esse é outro lugar onde você pode obtê-lo, como você faria o download de um jogo no Steam. Você também pode instalar o Godot a partir daí. Então, só para apontar neste curso, vamos trabalhar com o Godot 3.3.3. E eu estou usando pessoalmente a versão universal de 64 bits do Godot no silício da Apple. Então, além disso, vamos precisar de alguma arte para o projeto. Então, uma ótima opção que podemos usar para criar um jogo de plataformas simples como vamos fazer é pixel adventure. Então você pode obter isso em cada ponto io se você procurar por pixel aventura, ou se você vai para um pixel sapo traço Ativos ponto, ponto barra, traço pixel, traço aventura um. Além disso, há também 20 personagens inimigos que você pode baixar com pixel adventure para, que é um segundo, e você pode pegar ambos em cada ponto io. Então, vou importar os dois para o projeto. É só para que saibas, de onde vamos buscar os nossos bens. Mas no final, isso é exatamente o que eu estou usando para demo para o curso. Você pode usar os nossos bens que você quiser no final, talvez você protótipo com a gente e depois colocá-lo em sua própria arte mais tarde. Então, quando você inicia a janela pela primeira vez, você pode ver alguns projetos, mas vamos criar um novo projeto. Então aqui à direita você tem um novo botão de projeto. Eu vou clicar nisso e então eu vou navegar para onde meu computador eu gostaria de criar esse projeto. Então aperte este pequeno botão Procurar aqui e eu vou estar usando, e eu vou estar usando este caminho para o meu projeto, mas você pode basicamente armazená-lo onde quiser. Agora note que aqui eu tenho meu projeto de referência, projetos de aventura de pixel. Então eu vou chamá-lo da mesma coisa e lançar um tutorial traço no final, vez que esta vai ser a versão seguinte do mesmo projeto. Então vamos em frente e selecionar a pasta atual. E agora precisamos dar-lhe um nome de projeto e criar uma pasta dentro deste diretório para o projeto. Então vamos chamá-lo de aventura de pixel, tutorial de traço do projeto. E eu vou fazer criar pasta. Pode chamá-lo do que quiser. E eu estou usando OpenGL ES 3 é o renderizador, não tive nenhum problema com ele até agora. Então vamos em frente e clique em criar e editar. E aqui está o que Qdot vai parecer na primeira vez que você inicializar seu projeto. E você notará que esta é obviamente uma visualização 3D. No topo, podemos realmente mudar para 2D, que é o que vamos usar para basicamente o resto do projeto. Portanto, antes de importar toda a arte para o jogo, devemos definir as configurações padrão para qualquer arte que importamos para o jogo para que ele seja exibido corretamente. Então, se eu fosse clicar neste ícone ponto PNG e cada projeto Godel que é devido um logotipo. Podemos ir até a guia de importação e podemos ver que isso está importando como uma textura. Portanto, queremos definir os padrões para textura para ser um pixel, nossa configuração padrão. Então, se clicarmos na predefinição aqui, você vai notar pixels 2D, uma das opções. Então, se você clicar lá, você verá que certas opções, como filtro vai ser desativado. Assim, o filtro normalmente faz com que suas imagens se desfoquem ao redor das bordas que você não visse os pixels como nítidos e tudo ficaria meio desfocado juntos. Portanto, não queremos que para o jogo em pixel que você deseja que cada um
dos pixels seja claramente reconhecível como a cor que ele foi colorido. E assim queremos o pixel 2D como o padrão para todas as imagens que trazemos para o jogo. Portanto, não precisamos pressionar V importante para este ícone em particular. Provavelmente não vai usá-lo como um recurso real aqui. Mas queremos alterar a pré-configuração na parte superior e, em seguida, definir como padrão para textura. Então isso vai significar que essas configurações que temos aqui apenas foram copiadas para os padrões que estão indo para carregar para cada imagem que trazemos para o jogo por padrão. E note que mesmo em um jogo de pixel art, pode
haver algumas imagens que você realmente não quer ter essas predefinições. Então eu iria apenas definir a predefinição como o que vai ser a maioria da sua arte. Nesse caso, isso será pixel 2D para pixel art, caracteres e conjuntos de mosaicos e tudo isso. Então vamos em frente e trazer nossos arquivos. E agora podemos querer adicionar uma pasta neste projeto para armazenar todos os ativos de arte. Então podemos criar um no sistema de arquivos inferior esquerdo
clicando com o botão direito do mouse nesta pasta de recursos, que é basicamente onde criamos nosso projeto e outro caminho para isso. Então vamos clicar com o botão direito do mouse lá e fazer uma nova pasta. E eu só vou chamar isso de arte e bater OK. Então agora podemos navegar para onde quer que tenhamos nossos recursos que queremos usar para o jogo. Eu já fui em frente e extraiu a aventura pixel 1 e pixel aventura Tupac nota que quando você extrair pixel aventura um, a pasta pode ser chamado livre. Eu renomeei isso para pixel adventure 1. E pixel adventure para é chamado isso por padrão. Então agora nós queremos basicamente copiar estes para o projeto para que possamos usá-los. Uma maneira seria arrastar e soltar do Explorador de Arquivos para o Godel. E você pode simplesmente arrastá-lo para aquela pasta lá, mas é possível colocá-lo no lugar errado por acidente. E sempre que você mover pastas e Godot, ele vai ter que reimportar. Todos esses são ativos que podem demorar um pouco, então é melhor colocá-lo no lugar correto e na primeira tentativa, então eu vou selecioná-los e eu vou copiá-los. Você pode simplesmente arrastar uma caixa e, em seguida, clicar com o botão direito do mouse e copiar, ou você pode selecioná-los e pressionar Control C Se você precisar. E vamos para a pasta do projeto Godot. Então eu tenho isso armazenado e esta pasta Tutoriais, e então nós temos o projeto aqui. Então podemos ver a pasta de arte que acabamos de criar. Eles vão para lá e então eu vou colar os novos ativos aqui. Então agora, assim que eu clicar de volta para Godel, podemos ver que ele vai reimportar. Estes são ativos que aplicam os padrões de como ele deve ser exibido e Godel, por exemplo. Então, se abrirmos arco e pixel aventura agora, podemos entrar em personagens principais. Vou usar o sapo Ninja como personagem principal para este curso. Então, se arrastarmos uma dessas planilhas para a tela agora, devemos ser capazes de vê-lo com as configurações adequadas para Pixar-lo. Então vamos arrastar este ocioso. Vou controlar roda do meio do mouse e zoom em um lote inteiro e certifica-se de que esses pixels estão exibindo nítido. Então, quando você está muito ampliado assim, você não deve ver nenhuma embaçada. Você deve ser capaz de dizer claramente a cada cor que esses pixels são e onde está o posicionamento de cada pixel. Esse é o olhar que você geralmente quer quando você está fazendo jogos de estilo pixel art. Então eu vou diminuir o zoom e nós também podemos confirmar que as configurações estão corretas porque se clicarmos em ocioso e se você for para a guia de importação no canto superior esquerdo, você pode ver que este ídolo, 32 por 32 PNG está sendo importado com filtro desligado? Agora, quando você cria o projeto e o Godel, isso está ativado por padrão. Então essa é uma maneira que sabemos que definimos o padrão para pixel 2D para importar imagens. Então, neste ponto, criamos um projeto e
trouxemos o pixel art com as configurações corretas de importação. Então, no próximo vídeo, vamos apenas fazer alguns requisitos de configuração para este projeto antes de começarmos a criar nossos níveis de jogo.
3. Projeto de pixel Art (tamanho (Stretching): Então, antes de começarmos a trabalhar nos níveis do nosso jogo, vamos precisar alterar algumas configurações sobre a janela do jogo para que quando estamos testando o jogo, ele seja exibido um pouco mais apropriadamente. Então, primeiro, vamos precisar criar
uma cena para que possamos carregar essa cena como ponto de partida para o jogo. Então agora eu tenho a imagem de sprite que acabamos de trazer para esta janela principal aqui. E você notará que na cena superior esquerda, que contém o sprite. Então uma cena vai ser qualquer nó e Godel mais todos os nós aninhados abaixo disso. Assim, um personagem pode ser uma cena, um nível pode ser uma cena, e cenas podem ter instâncias de outras cenas. Então você pode colocar um monte de cenas inimigas em um monte de personagens, cenas em uma cena de nível para fazer com que tudo se junte. E uma vez que você começa a usar, ele fica bastante intuitivo. Então nós vamos apenas pegar este brilhante e salvá-lo como uma cena para que possamos carregar isso como o ponto de partida para o nosso jogo. Então eu vou apertar Controle S ou Comando S. E nós vamos colocar isso como nível um, e eu vou criá-lo em uma nova pasta. Então, digamos Criar pasta no canto superior direito. E esta nova pasta vai ser mapas ou níveis, qualquer que seja a sua cabeça. Certo, e vamos salvar essa cena lá dentro. Então, por agora, isso não faz sentido como um nível dizendo, não se preocupe com isso. Mudaremos isso mais tarde. E vamos até o botão “play “no canto superior direito. Então você pode, então aqui em cima e podemos ir em frente e tocar no “Play the Project”. Mas se não definimos uma cena, podemos selecionar uma cena como ponto de partida para o nosso jogo. Então vamos selecionar o jogador uma cena. Então isso está no diretório Maps e eu estou apenas carregando este n. Você também pode subir um nível se você precisar selecionar a pasta certa. Então vamos clicar duas vezes nisso. Ok, e agora o jogo deve começar com essa cena. E nossa folha de sprite está sendo exibida aqui muito bem. A sensação de que não há desfocagem dos pixels. Então ainda é isso que queremos ver. Mas é bem pequeno o tamanho deste personagem. Então nós realmente queremos fazer com que pareça maior na tela. Agora que testamos, sabemos o problema. Vamos para o menu do projeto no canto superior esquerdo e as configurações do projeto. E podemos ir em frente e encontrar as configurações para isso. Então, como você pode ver, eu já estou aqui e janela de exibição. Mas se você não vê-lo imediatamente, você pode clicar na caixa de pesquisa aqui no canto superior esquerdo e digitar a janela que irá filtrar as categorias para baixo para que você tenha menos para escolher. Alternativamente, se você estiver aqui no aplicativo, basta rolar para baixo para exibir a janela. E aqui vamos ter as configurações que precisamos mudar. Então, por agora, vai estar pegando a largura e altura e definindo isso para 320 largura por 180 pixels de largura. Então isso pode parecer muito baixo porque eles acham que a maioria das pessoas vai ter telas que são pelo
menos 1920 por 1080 pixels hoje em dia, talvez maiores do que isso. Trata-se, portanto, de uma resolução muito baixa. Então o que você faz é que você realmente tem a largura e altura de teste, uma resolução mais alta. E então você pega essa largura e altura e a escala até a largura e altura do teste. E como temos as configurações de pixel 2D para nossas sprites importadas, apesar de estarmos ampliando, ela não deve estar desfocada ou distorcida ou algo assim. Então vamos pegar a largura e altura do teste e torná-lo 12, 80 e depois 720 pixels. Então este deve ser um tamanho de teste decente, janela de quatro horas. Então uma última configuração que precisamos mudar aqui embaixo na parte inferior é esticar. Aspecto está definido para ignorar. Está aqui em baixo sob estiramento. Portanto, o modo está definido como desativado. Queremos mudar isso para 2D. Então ele vai estar fazendo alongamento 2D padrão do nosso tamanho pequeno até o tamanho grande. Então, se fecharmos isso agora, aperte Control S para salvar tudo e vamos voltar ao botão Play novamente. Clique nisso. E quando carregarmos o jogo, desta vez, você verá que personagens são muito maiores. Acho que basicamente pegamos a imagem e aumentamos quatro vezes na tela. Então esta é uma janela de 1280 por 720 pixels, mas está basicamente exibindo o jogo real em quatro vezes o tamanho. Então, em um grande monitor, isso faz muito mais sentido. Então você pode realmente ver os personagens. Então essa deve ser a última configuração básica para o nosso projeto que vamos precisar. No próximo vídeo, podemos começar a trabalhar na construção de um fundo para o nível.
4. Criação de um fundo escrito de repetição: Então, neste vídeo, Vamos começar a criar o nosso nível começando com uma textura de fundo repetindo. Então, quando você vai usar uma imagem como uma textura de fundo repetida, há um sinalizador que você precisa ativar para esse trabalho artístico. Então, se entrarmos no diretório de arte e pixel aventura um ou onde quer que você tenha salvo. E então vamos para o fundo, você verá algumas texturas diferentes que podemos usar para fundo. Eu posso trazer um aqui e você pode ver que este azulejo só vai se repetir uma e outra vez. Então o que queremos fazer para esta imagem e todas
as diferentes versões de cores da imagem
indo para amarelo é ir para a aba de importação. E aqui podemos ver ler sobre filtro. Há uma caixa de seleção para repetição. Queremos transformar isso em habilitado. E quando fazemos isso, esta bandeira é verificada automaticamente para que possamos reimportar esses ativos. Então, agora estas funcionarão como texturas repetíveis. Então, a fim de obter uma textura para repetir em toda a tela, você tem que clicar na textura. Então você vai para a região, e então nós vamos querer habilitar a região aqui. Então isso agora basicamente vai pegar a telha de textura e esticá-la em uma região. E como o sinalizador de repetição está ativado para essas texturas, ele vai amarrá-lo em vez de apenas esticar. Então agora só precisamos definir um tamanho para o fundo. Então largura e altura aqui à direita, W e H. E vamos dar um tamanho que deve ser bom o suficiente para o nosso nível. Tão grande quanto quiser, está tudo bem. Poderíamos fazer 1000 por 1000 pixels. E eles são basicamente, você tem uma base de fundo repetida que você pode usar para o seu nível. Então agora nós apenas arrastamos isso para qualquer posição que precisamos e nós estaremos praticamente prontos para ir. Uma coisa a observar sobre a criação do plano de fundo desta forma é que você não deseja usar as ferramentas de escala se você precisar expandir o plano de fundo ainda mais. Se você agarrar na balança, na borda deste sprite e
esticá-lo, ele ainda vai esticar a imagem. Então, se você precisa de uma longa carreira, você deve vir aqui para região e adicionar alguns pixels extras aqui. Então 1200 com, você pode ver o expandido sem ter qualquer alongamento. Ele só adiciona mais peças e qual é o que queremos. Então vamos limpar o nível um pouco mais. Então, em seguida, vou clicar com o botão direito do mouse no sprite inicial, que vamos remover em um minuto e adicionar um nó filho. E este nó filho só vai ser tão simples nó 2D. Então este é basicamente um nó genérico e podemos usar isso como a raiz da nossa cena. Então tudo o que realmente entra na cena seria apenas aninhado abaixo dela. Vamos criar isso. E agora podemos pegar esse nó e realmente torná-lo a raiz dessa cena de nível. Então eu vou clicar com o botão direito aqui e eu vou criar a raiz da cena. Então agora essa imagem de sprite do ídolo está aninhada abaixo do nó 2D e o fundo azul está aninhado abaixo disso. Então eu vou pegar o fundo azul. Vou clicar com o botão esquerdo do mouse e arrastá-lo e colocar isso acima do nó 2D. Então agora não há filhos desta folha de ídolo. E podemos remover isso clicando com o botão direito do mouse sobre ele e fazendo recortar ou excluir nós. Então vamos em frente e nos livrar disso. E agora, finalmente, podemos pegar o nó 2D e eu só vou renomear isso para o nível 1 para corresponder ao nome do arquivo salvo. E talvez o fundo. Eu só vou renomear este plano de fundo para que praticamente nos deixa configurado para o ponto em que podemos começar a adicionar em algum terreno real para um personagem para ficar em pé e plataformas e todas essas coisas. Então vamos em frente e aperte o controle ou comando S, salve o nível, e será isso para este vídeo. E no próximo estará construindo o chão onde os personagens podem ficar.
5. Tilemaps e tilesets para construção nível: Neste vídeo, vamos trabalhar com mapas de azulejos e conjuntos
de cauda para criar o terreno onde nosso personagem vai ficar. Então dentro de nossa cena de nível um, no canto superior esquerdo, vou clicar com o botão direito do mouse aqui e adicionar um novo nó filho. Este vai ser chamado de mapa de mosaico. Então você pode apenas digitar o mapa de mosaico para encontrar isso e clicar em Criar. Então este mapa de mosaico é, podemos ver no lado direito, vai precisar de um conjunto de mosaicos. Então o conjunto de cauda vai ser criado a partir de imagens em nosso projeto, e isso vai ser especificamente as imagens de tamanho de bloco. Então há o arquivo de título que existe aqui e Godel. E então é a imagem real de onde o conjunto de cauda está puxando fora de suas telhas. Então, vamos clicar na seção vazia para azulejo certo hit novo Tulsa. Então isso podemos clicar, e quando o fizermos, há uma nova janela aqui na parte inferior chamada conjunto de azulejos. Então precisamos adicionar uma imagem aqui, a fim de começar a escolher os azulejos daquela cauda. Então imagem, para que possamos encontrar as imagens adequadas para criar as telhas da categoria terreno dentro do nosso pixel aventura um pacote. Então podemos ver a partir da miniatura que há realmente um monte de terrenos diferentes que podemos usar aqui. E existem em uma única imagem. Vamos continuar e clicar com o botão esquerdo e arrastar isso para a lista do nosso conjunto de mosaicos. Quando fizermos isso, veremos que a imagem se expande um pouco mais aqui. E você pode manter o controle pressionado e rolar a roda do meio do mouse para ampliar e reduzir o zoom. Claro, ele também pode ampliar e diminuir o zoom ali à direita. Então queremos que isso seja um grande o suficiente na tela para que
possamos identificar claramente os blocos com os quais estamos trabalhando. Portanto, há três tipos de telhas que podemos criar para o nosso conjunto de telhas. Há o novo bloco único, que vai basicamente definir uma região aqui,
que é um bloco que você pode clicar com o botão esquerdo
do mouse aqui quando você estiver pintando seus azulejos e, em seguida, basta clicar com o botão esquerdo do mouse e colocá-lo no mapa. Então essa é a opção mais simples. Há também nova arte ou azulejo vai estar trabalhando com isso neste vídeo. Assim, o bloco automático, você pode basicamente definir um conjunto de blocos. E, em seguida, você pode criar uma máscara de bits para esses blocos
no BitMask determina quais blocos devem fazer fronteira com os outros blocos. Então, em certo sentido, você pode fazê-lo para que este aqui à esquerda, você pode ver que este é obviamente um bloco de extremidade esquerda. Então você pode fazê-lo para que este seja o que está sempre no final configurando máscaras de bits, que é basicamente criar as regras para como esses blocos devem estar próximos um do outro. E há também um novo Atlas, que você pode definir um monte de peças. E então você terá uma lista aqui à direita. Você pode simplesmente selecionar o que você deseja. Antes de começarmos a fazer isso, vamos clicar no mapa de mosaico. Então, na cena da esquerda. E queremos ir vender e ter certeza de que o tamanho da célula está definido para 16 por 16, já que esse é o tamanho dos nossos azulejos e do jogo. Então, definimos o 16 por 16 aqui para corresponder
ao tamanho do bloco projetado da obra de arte para que tudo corresponda corretamente. Então podemos clicar de volta no conjunto de azulejos e podemos realmente ver que ele meio perdeu sua referência ao terreno aqui desde que nós não exatamente salvá-lo. Então, uma idéia decente pode realmente ser clicar no mapa de mosaico aqui. E, em seguida, com este bloco definido à direita, podemos clicar neste pequeno menu suspenso e salvar o conjunto de blocos em um arquivo. Então isso fará com que você possa referenciá-lo em qualquer mapa de mosaico. E os dados serão basicamente gravados dentro do projeto. Então eu vou continuar e salvar isso aqui. E acho que vou colocá-lo na categoria de mapas. E eu vou em frente e chamar este terreno de aventura de pixel. Então vamos ver que o nome disso mudou para o nome
do arquivo salvo como um ponto aqui, extensão IaaS. Então ainda podemos abrir isso e editá-lo. E eu acho que se você entrar na pasta de mapas, você também pode apenas clicar duas vezes sobre ela aqui para abrir a mesma coisa. Então, basicamente, o lado da cauda é salvo em seu próprio local agora e ele não está mais incorporado no mapa de mosaico diretamente. Então podemos adicionar o terreno aqui. Eu só vou arrastar isso e novamente, e desta vez vamos em frente e bater novo bloco automático. Então, vamos ter que definir uma região para este são um
dos recursos realmente úteis é isso habilitar Snap aqui. Então podemos ver que isso nos permitirá encaixar na grade. Então, se clicarmos com o botão esquerdo aqui uma vez, isso vai definir uma região, e então podemos alterar as configurações para que possamos realmente obter os tamanhos desejados. Então, à direita, temos opções instantâneas aqui. Então Este é o número de pixels que você deseja encaixar em termos de etapas que você pode fazer isso 16 por 16. Acho que vou te mostrar, vamos dizer quatro por quatro desta vez. Então você pode ver que a cauda é basicamente quebrada nesta pequena grade de pixels. E sempre que precisamos fazer ajustes, como, por exemplo, criar as formas de colisão mais tarde,
ele pode encaixar em qualquer uma dessas interseções nesta grade de quatro por quatro pixels. Então eu acho que vai funcionar muito bem. E, em seguida, selecionamos azulejo. Queremos alterar o tamanho das legendas para 16 por 16 aqui. Eu também notei o modo OTA ou bitmask, modo que eu não tenho um modo bitmask vai ser importante quando você está determinando. Basicamente, quando você quebra seu bloco, quantos cantos estão lá que você pode atribuir uma máscara de bit no valor dois ou desligado. Então, se você tiver dois por dois, isso significa que cada bloco é dividido em quatro BitMask potenciais. E há também três por 33 por três no mínimo, o que você poderia imaginar oferece nove legendas de bitmask por bloco real. Então, para estes, vamos trabalhar com um dois-por-dois. Estes são azulejos mais simples aqui. E eu acredito que estes também são. Mas quando chegarmos aqui à direita, eles vão precisar, eu acho que três por três no mínimo, mas vou verificar isso mais tarde. Então agora precisamos redefinir a região quatro, nossa primeira. Então agora precisamos redefinir a região para os nossos primeiros mosaicos automáticos. Então podemos ver aqui que temos quatro quadrados aqui, e eles têm o tamanho certo, 16 por 16, graças ao tamanho das legendas. Mas, na verdade, vamos precisar clicar com o botão esquerdo aqui no topo e depois arrastar isto por toda a nossa região de blocos de pedra. Então eu vou ampliar um pouco, certifique-se de que todos os cantos coincidam para que você possa ver o que é definido como a região porque é essa linha verde que descreve tudo. Seus azulejos são basicamente onde quer que essas linhas verdes se cruzem. E deve ser assim que parece agora. Então estamos fazendo um BitMask dois-por-dois. Então vai ser muito simples. Então eu vou entrar no modo de máscara de bits e isso irá configurar o mosaico automático. Então, para este azulejo, vamos precisar dele para ficar assim. Assim, você pode simplesmente clicar com o botão esquerdo e segurar e arrastar a caixa vermelha para onde você precisa que ela esteja. Então, meu entendimento da máscara de bits no Godel é que onde você tem uma máscara de bits habilitada com o quadrado vermelho vai ser determinar onde este bloco blocos para outros blocos para ver se ele corresponde à máscara de bits, a fim de determinar se há deve ser o azulejo que é escolhido. Então, neste caso, sendo um canto superior esquerdo, ele tem um para o canto inferior direito. Então ele vai estar olhando para a direita e para baixo para ver se há telhas lá. Então, nesse caso, se corresponder tanto para baixo quanto para a direita, então pode ser uma telha de canto nesta peça. Então, neste caso, se ele encontrar um bloco para baixo e para a direita, então ele pode ser registrado como o bloco correto para ser selecionado automaticamente. Mas há também as áreas onde o BitMask está desligado que precisam ser levadas em consideração. Então, neste caso, ele só seria selecionado se para baixo e para a direita metade de uma telha. Mas também neste caso que não há nada à esquerda. Como você vê, a máscara de bits no canto superior esquerdo e no canto inferior esquerdo estão desativados e também nada acima. Então, se tivermos máscaras de dois bits habilitadas em uma direção para uma máscara de bits de dois por dois, então isso significa que vai olhar diretamente para baixo em vez de para a direita e para baixo. E se você tiver todas as máscaras de quatro bits habilitadas, então esta onda quadrada basicamente tem um fundo preto só será selecionado se ele estiver cercado em todas as direções por outros blocos deste título automático específico. Portanto, somente os blocos selecionados a partir deste bloco automático serão
considerados para selecionar qual bloco será selecionado. Então, se mais tarde você colocar, vamos dizer uma dessas peças ao lado dele, que é uma telha automática totalmente diferente. Não vai ter qualquer influência sobre estes blocos sendo selecionados. Apenas estes mosaicos influenciaram os outros mosaicos deste mosaico automático. Assim, para esses blocos à direita, você pode ver que três
dos quatro pontos BitMask estão marcados e apenas um está desativado. Então, neste caso, você estaria procurando por lá para haver telhas
adjacentes desta cauda automática à esquerda e acima. E eu acho que também no canto superior esquerdo, se você está indo cantos diagonalmente como este, mas não haveria um para baixo e para a direita neste caso porque este azulejo está desligado. Então, para resumir, quando você é adulto Heil desenha em seu mapa de jogo, ele vai selecionar o melhor ajuste a partir desta configuração auto mosaicos. Então, idealmente, quando você está trabalhando com BitMask, então você teria apenas uma configuração de bitmask para cada possibilidade dentro de cada máscara de bits. Observe que, embora quatro desses blocos tenham um em cada quatro do BitMask em que eles estão em todas as direções diferentes para que você nunca
terá qualquer sobreposição com este bloco automático simples. Então, por último, se você for para o modo de máscara de bits adulto-criança, você notará que há três por três mínimo e três por três como outra opção. Então, ambos terão nove pontos de máscara de bits por bloco,
já que são três por três, multiplicamos que você obtém nove BitMask, para que você possa ter um no meio. E vamos usá-los mais tarde para estas peças de terreno aqui. E, na verdade, bem como essas pequenas plataformas. Então, se clicarmos no mapa de mosaico agora, veremos que nosso bloco de terreno está aqui para ser colocado no script. Então podemos ir em frente e colocar alguns azulejos. Mas o que você vai notar é que, a menos que você tenha pelo menos um dois por dois, a máscara de bits dois por dois não pode funcionar. Então, se você está indo direto para baixo e alinhando assim, você só vai ter um bloco selecionado. Então, para que a máscara de bits dois-por-dois funcione, você realmente precisa ter pelo menos um quadrado de dois por dois. Então podemos ver como eu começo a construir isso, ele só saiu funciona perfeitamente e o centro é preenchido. Assim, com outros ladrilhos, torna-se realmente fácil criar formas diferentes sem ter que se preocupar com exatamente qual cauda vai para onde. Então, se você conseguir configurá-lo para você mesmo, é muito útil trabalhar com e meio que mostrar isso. Outros azulejos, eu vou apenas remover um par desses pontos internos aqui e você pode apenas vê-lo. Apenas meio que funciona. Então vamos voltar ao ladrilho sentado e criar algumas peças extras. Então, basicamente precisamos repetir a mesma coisa para aqui embaixo, este, este, este, e este aqui. Então podemos copiar e colar seis vezes. Então, de volta ao conjunto de peças, vá para o modo de região, a fim de ver os nomes de cada um desses mosaicos automáticos, eu vou clicar neste pequeno botão de informação no lado direito. Então você pode ver que este é o terreno 16 por 16 azulejo. Então o que precisamos fazer é criar um novo bloco automático e vamos
definir a mesma caixa que a região. Então, novo auto, clique no canto superior esquerdo, segure-o e arraste uma caixa ao redor desta área para a nossa segunda telha automática. Agora, podemos ir para o modo bitmask e definir tudo. Mais uma vez, não seria difícil para este, mas ainda mais rápido, podemos apenas clicar aqui nesta telha automática e apertar o botão Copiar para o BitMask, e depois clicar aqui para este e apenas apertar o botão colar, ok, mas não precisa ser 16 por 16 tamanho das legendas primeiro. Então, para encontrar isso aqui à direita para cada uma das regiões que você criar, Vamos fazer um novo bloco automático. Eu vou ter que diminuir um pouco para que possamos vê-lo
aqui e arrastar uma caixa em torno desta. Certifique-se de que o tamanho das legendas está definido para 16 por 16. Agora podemos ir para BitMask e colá-lo, já que já temos o deste copiado para o buffer. Então, são três mosaicos automáticos criados. Vamos auto mosaico, continue repetindo o processo. Então 16 por 16 bits Modo de máscara, colá-lo em. Novo bloco automático, 16 bits, 16 bitmask, colá-lo e você praticamente obter a idéia. Então vamos terminar este último aqui em baixo. Então eu vou colá-lo. E sim, às vezes 16 por 16, e isso deve ser bom para eles. Agora, a mesma máscara de bits não vai funcionar para estes. Você pode ver que estes são um pouco diferentes e essas pequenas plataformas de barra também, eu acho que este realmente tem o mesmo ladrilhos ADL. Então vamos criar mais um aqui para isso. Então podemos testar isso e ter certeza que funciona ainda. Então vamos colar o BitMask, e lá vamos nós. Então, agora, se clicarmos no mapa de azulejos, podemos ver que temos sete terrenos diferentes. Então, selecione a partir de. Então vamos começar a desenhar um. E você pode ver que cada um deles, porque eles são definidos como sua própria cauda ADL, eles trabalham independentemente um do outro. Então, ter um título automático ao lado de outro não vai afetar nada. Nós temos. Podemos colocar esse tijolo lá fora. E assim também podemos desenhar alguns outros terranes aqui. Então vamos fazer um dois-por-dois. E lá temos um terreno de terra. Está bem. Então vamos em frente e preparar mais algumas máscaras. Então, de volta ao conjunto de títulos, precisamos definir as outras regiões de mosaico para essas áreas. Então vamos arrastar uma caixa em torno dela chamada de modo bitmask. E desta vez vamos realmente usar uma máscara de três por três bits, que fará sentido quando você realmente olhar para ela. Então mude o modo de máscara de bits do pneu automático para três por três. E acredite que queremos 16 por 16 como os sites de legendas para o BitMask. Então, se ampliarmos um pouco, podemos começar a desenhar isso. Então vai parecer para a parte de cima. Assim, podemos ver que esta primeira telha tem um quadrado no centro e depois um à direita. E, claro, isso nos dá 9 quadrados bitmask total dentro de um único bloco. Então, se chamarmos o centro, um, basicamente significa lá, ele está procurando por si mesmo para ser um bloco e o SAT, e então também o BitMask direita significa que ele também vai estar olhando para os quatro blocos certos. Então, se for no final, vai contar para o meio. E então, se houver uma cauda para a direita, vai combinar com isso. E então isso pode basicamente permitir que você crie um papel
deste tipo de azulejo apenas tendo essas peças próximas umas das outras. E então este seria o fim, e este será o fim e este seria o meio porque ele está olhando para a esquerda para um bloco e para a direita para um título também. Então temos este aqui em baixo, só um único ponto. Então este será o azulejo quando não houver outros azulejos ao redor, assim como um único ladrilho. E então podemos arrastar 16 quadrados no meio aqui, para que os de fora não tenham nada. Então você pode basicamente usar essa forma para criar o que você vê aqui. Basicamente, apenas criando um bloco de título dois por dois. E então para uma plataformas de cima para baixo, nós temos isso. Então tipo de direção inversa para este aqui. Vá para o mapa de mosaico. Podemos ver isso em jogo. Se eu arrastar até aqui, podemos criar uma pequena plataforma. Nós também podemos criar um dois por dois para ter esse tipo de bloco. Os individuais serão apenas estes pequenos quadrados. E então, claro, podemos fazer de cima para baixo também. Então, para esses propósitos, basicamente, você pode ver que na imagem do conjunto de azulejos, ele funcionará muito bem para isso. Mas criando coisas como esta, eu não acho que essas peças são realmente projetadas para isso, mas se você sabe diferente, sinta-se livre para colocar um comentário e eu posso me corrigir sobre isso. Mas basicamente, foi assim que consegui configurá-lo para aquela parte específica do mapa de mosaico. Mas isso é basicamente como ele foi capaz de obter a configuração para aquela parte específica do conjunto de mosaicos. Então vamos voltar aqui para o terreno definido de mosaicos e podemos copiar esta máscara de bits para os outros blocos. Então, nova telha automática. É criado aqui em baixo, 16 por 16 no modo de três por três bitmask. E nós vamos subir aqui, copiar este e colá-lo no abaixo dele, e apenas repetir o processo para os outros dois. Vamos criar essa máscara de bits, colá-la e certificar-se de três por três e 16 por 16, as informações devem sobrepor corretamente. Novo mosaico automático, arraste a região, mas o Modo Máscara, cole para eles, alterou o modo de três por três 16 por 16 legendas. E isso basicamente define isso. Então agora há estes últimos três blocos de plataforma. Vamos precisar desenhar uma região em torno deles. Então vamos em frente e fazer isso. Certifique-se de que, embora a altura da plataforma aqui é apenas cerca de 45 pixels, que você realmente faz o total 16 pixels porque ele
ainda vai ser azulado 16 pixels por 16 pixels com o resto do jogo. Ou pelo menos é assim que vou fazer de qualquer maneira. Então pegamos o modo de máscara de bits de telha automática e colocamos em 3 por 3 mínimo. E o tamanho das legendas 16 por 16. E então bitmask vai se parecer basicamente com isso. Eu acredito. Então. Vamos em frente e testá-lo no mapa de mosaico. Podemos clicar na plataforma e seu desenhar uma linha. Então note que as extremidades dizem em seu lugar, se eu adicionar outra peça, o fim se move para a direita. Então é isso que queremos. E isso funcionará desde que você não coloque outra plataforma que esteja bem abaixo dela, assim. Enquanto não estiver fazendo
isso, deve funcionar corretamente. Então eu acho que isso será suficiente para nossos propósitos aqui. Agora, vamos voltar àquele mapa de mosaico. Vou clicar duas vezes nele e a pasta de mapas terreno. E vamos apenas copiar essa máscara de bits para mais dois novos mosaicos automáticos. Então, novo título automático e selecionamos uma caixa por aqui, vamos para três mínimo de 16 por 16. E depois bitmask, vamos copiá-lo daqui para aqui. Então eles são basicamente os mesmos. E, finalmente, a versão de metal. Vamos criar que três por 31616 bitmask colar. Então essa vai ser a configuração automática de mosaico para todas essas telhas de terreno. Agora você pode chegar à parte divertida onde se você clicar no mapa do bloco, você tem todas essas peças automáticas que você pode usar para construir seu próprio nível de jogo com. Então, por exemplo, se eu quiser algumas plataformas e talvez isso possa ser usado para uma plataforma que você pode meio que saltar para baixo. Se você quisesse, só pensando à frente. Se você quiser criar alguns blocos longos, você tem que, alguns altos, você pode fazê-lo dessa maneira. E então essas outras peças podem ser usadas para configurar o terreno de base para o seu personagem. Estes só tem que ser pelo menos um bloco de dois por dois para auto telha corretamente, assim. E você deve estar pronto para ir. Então você pode apenas construir o que você quiser testar para fora agora. E, nos próximos vídeos, começaremos a criar uma plataforma ou personagem simples que podemos usar para testar esse nível. Então eu vou dizer por agora e até o próximo vídeo, eu vou te ver então.
6. Como configurar animações para jogadores: Então, neste vídeo, vamos começar a criar um personagem de jogador e uma câmera. Então a primeira coisa que vamos precisar fazer aqui é criar uma nova cena e começar com um corpo cinemático 2D. Então eu vou adicionar isso a uma nova guia cena aqui no topo. E eu vou clicar em outro nó porque eu quero que a raiz seja um corpo cinemático 2D. Então, se você ainda não sabe, um corpo cinemático 2D é basicamente um personagem de física que se
moverá com base nas regras que você programar para o código de script. Em outras palavras, muito de como seu personagem se move vai ser manual. A outra opção seria criar um corpo rígido 2D. E aqueles que trabalham tendo forças agem sobre o corpo vez de controlar diretamente o movimento do personagem dentro de seu roteiro. Então, para jogos e jogos de quebra-cabeça baseados em física como, digamos Angry Birds, o corpo rígido faria muito sentido lá desde que você quer forças para agir sobre o personagem. Mas se você está tentando criar um jogo de plataformas, corpo
cinemático 2D geralmente é o que você vai querer. Então vamos em frente e começar criando com este corpo cinemático 2D. A primeira coisa que vou fazer é mudar o nome para jogador. E então vamos criar uma pasta para que os personagens se encaixem. Então isso incluiria o personagem principal. Inimigos podem ser NPCs, tudo o que você precisar. Então, vou clicar com o botão direito do mouse aqui no sistema de arquivos e criar uma pasta chamada caracteres. E agora vou apertar Command ou Control S
para salvar o jogador visto dentro da pasta do personagem. Então vamos em frente e guarde isso aí dentro. Agora, você notará que há um ponto de exclamação aqui e aviso de configuração de
nó que esse nó
não tem formas para que ele não possa colidir ou interagir com outros objetos. Então temos que adicionar uma forma de colisão muito profunda a este jogador para que ele possa realmente colidir com, digamos, o chão ou outros inimigos, assim por diante e assim por diante dentro do jogo. Então, vou clicar com o botão direito do mouse aqui e adicionar um nó filho. Então queremos uma forma de colisão 2D. Então vou adicionar isso. E ele também percebe aqui que a forma de colisão realmente requer que criemos um tipo de forma. Para que isso funcione. Faremos isso em um minuto. Então a próxima coisa que vamos querer é um sprite. Então, vou clicar com o botão direito do mouse aqui. Vou adicionar um nó filho. E para este personagem específico, vamos com um sprite animado. E a razão para isso é como esses pacotes configuram as folhas de sprite. Então eu vou te mostrar o que eu quero dizer com isso em um minuto. Mas, por enquanto, vamos com o sprite animado. E dependendo de como seus sprites específicos são, o nó sprite pode funcionar melhor do que um sprite animado. Então vamos começar a adicionar as animações a este sprite animado. E você verá um pouco do que estou falando. Aqui, à direita, há uma seção aqui chamada quadros e vazios. Portanto, queremos mudar o vazio para um novo sprite frames. Então isso é algo em que podemos clicar. E quando clicamos nos quadros sprite, janela aparece aqui na parte inferior e podemos criar animações individuais. Então, se olharmos para a arte para o sapo ninja, que vai estar na aventura pixel um pacote,
e depois personagem principal e, em seguida, sapo ninja. Podemos encontrar, digamos, nossa animação ociosa aqui. Então, quando você cria uma animação para um sprite animado, basta dar-lhe um nome e você pode criar novas animações aqui em cima. Então, vamos fazer adicionar quadros de folha de sprite. Então, se entrarmos em arte, pixel adventure, um, personagem
principal, sapo ninja, e então ocioso, podemos pegar isso. E assim você verá que aqui para horizontal será para cima, basta especificar o número de colunas e, em seguida, verticais quatro linhas. Então 11 por um nos dá 11 quadros sprite. Podemos selecionar ou limpar todos os quadros aqui e adicionar 11 quadros. Então, isso vai funcionar muito bem para este tipo de configuração onde cada uma de suas diferentes animações de quebrado em sua própria folha de sprite. Então eu mencionei, por que você gostaria de usar sprite animado sobre o componente sprite? Bem, vamos apenas adicionar um componente de sprite e eu meio que vou te mostrar o que quero dizer. Então vamos adicionar os sprites e por agora eu vou apenas esconder o sprite animado clicando nesse pequeno globo ocular. Vamos para Texture. E então você pode ver que nós podemos colocar exatamente uma textura aqui. Então isso pode ser um pacote de folhas de sprite. Então, por exemplo, eu posso colocar ocioso aqui e você pode ver os quadros carregando muito bem. Então, se expandirmos a seção de animação, você pode ver quadros horizontais e verticais para que possamos definir linhas e colunas como antes. Acho que precisamos de 11 quadros horizontais, está bem? E isso divide os quadros individuais. Então nós podemos passar pelos quadros aqui e apenas tipo de jogar fora nossa animação. Assim, seríamos capazes de animar usando esta configuração de quadro. Mas o problema é que você só pode ter uma textura de sprite. Se mudarmos isso para, digamos que esse salto, você pode ver que ele ainda está usando quadros horizontais, 11 por um. Esta animação é completamente diferente. Ele só tem um quadro, então eu precisaria mudar esse valor para um. E então sempre que estamos reproduzindo uma animação, teríamos que não apenas mudar a textura, mas também o número de quadros horizontais e verticais. E especificando quadros individuais na animação pela base de animação. Quando vamos em frente e criar um player de animação, o que normalmente seria bom se tudo fosse condensado em um pacote, assim como um único arquivo de textura. E então você pode simplesmente passar por todos os quadros aqui e não seria problema. Mas como eles estão separados, sprite
animado só faz mais sentido aqui. Ambos farão o trabalho, mas se você tiver animações diferentes que estão separadas, então é muito mais fácil clicar em Adicionar animação. E vamos correr aqui e arrastar e largar. Você realmente quer apertar este botão para que você possa
dividir os quadros, então você clica em Executar. Acho que temos 12 por um aqui. Selecione Limpar todos os quadros e, no canto superior direito, adicione quadros e veja sua animação. Então, podemos verificar se eles estão jogando caixa à direita para ver como nossa animação se parece. Isto é muito mais lento do que deveria ser. Então, na caixa de quadros sprite, nós realmente queremos mudar a velocidade para 20 FPS e há a velocidade correta para reproduzir a animação. Temos que definir isso em nossa animação por base de animação. Então, clique em ocioso e certifique-se de que também está jogando em 20 FPS. E você pode ver que é muito mais suave lá. Então você basicamente continua indo para baixo nesta lista para criar o resto de suas animações. Então eu acho que nós podemos realmente apenas adicionar em tudo agora. Por que não? Então vamos adicionar um quadro único de animação de salto. Então eu vou apenas adicionar isso como saltou e então nós vamos ter culpa. Então, a diferença entre salto e queda, tanto quanto quando seu personagem está indo para baixo e, em seguida, saltar vai ser quando seu personagem está subindo. Então você usa basicamente a velocidade vertical para descobrir isso, mas isso é para mais tarde. Então também podemos ter um salto duplo. Então vou adicionar uma nova animação. Vamos mudar isso para salto duplo sublinhado, eu acho. E vamos adicionar n. Essa animação. Posso ver que são seis quadros,
então seis horizontais, um vertical, selecione Limpar todos os quadros, adicioná-los, e então temos nossa animação de salto duplo. Então 20 FPS, e essa é a velocidade de reprodução correta. Então vamos ver o que mais. 3.5 aqui, bater e saltar na parede. Então hit, Eu acredito que vai ser quando o seu personagem sofre dano, Vamos adicionar esse fim. Então novo hit animação e, em seguida, nova animação enquanto salto sublinhado. Vamos pegar os quadros para isso de seus arquivos de textura separados. Parecem sete quadros. Então, sete por um, selecione Limpar, Tudo, coloque-o em 20 FPS. E podemos testá-lo mudando para essa animação. Ok, bem, este salto duplo e nós queremos acertar. Então, há a animação Hit bem escorregadio lá. Então, enquanto Trump é o último. Então vamos preencher esse irreal rapidamente. Adicione animação enquanto salta cinco quadros, então 5 vezes 1, selecione Limpar todos os quadros, adicione-os e certifique-se de que este FPS é de 20 FPS. Então podemos verificar todas as animações e apenas ter certeza de que eles são todos 20 FPS. Ok, então isso é basicamente nossas animações para o personagem configurar agradável e fácil com um sprite animado.
7. Entrada de jogadores e movimento: Então agora que sabemos onde nosso personagem está em termos deste brilhante com referência ao objeto de personagem cinemático. Nós podemos basicamente ir para a Animação, colocá-lo em ocioso, e podemos descobrir onde os assassinos e a forma devem estar usando o estado ocioso como um ponto de referência. Então, em forma de colisão 2D, eu vou clicar na forma à direita e podemos fazer uma forma de cápsula. Então, se você fizer uma forma de cápsula, há a habilidade de um personagem para meio que escorregar fora da borda se você está apenas se aproximando da borda. Se você não quiser que seu personagem seja capaz de deslizar acidentalmente para fora da borda. Você quer que ele seja puramente no chão ou ligeiramente fora do chão e, portanto, caindo, então você poderia usar uma forma retangular e, em vez disso, eu vou para a forma de cápsula por enquanto. Podemos mudar isso mais tarde, então nova forma de cápsula. E queremos que isso se ajuste aproximadamente onde o personagem fica no chão. Então eu vou encolher isso. E, na verdade, eu quero ver a forma de colisão acima dos sprites. Vou reorganizar a ordem. Então, o sprite animado vai estar no topo. Você só arrasta e solta. E agora podemos ver a forma da colisão. Então vamos mudar a transformação. Mova um pouco para baixo. Acho que adicionei 9,5 pixels ou mais. E agora só precisamos ajustar as coisas um pouco mais. Basta obter a forma desejada para colisões com outros objetos, como o teto ou o chão. Talvez queiramos que o personagem tenha uma caixa de sucesso relativamente alta. Então, se você está batendo com a cabeça no teto, isso deve acontecer aqui em cima, não aqui em baixo. Então vamos pegar a transformação e mover isso um pouco para cima. Então vamos ver cinco, ok, e isso provavelmente é muito bom aqui. Portanto, atualmente as configurações são cinco para a posição do pixel. E se clicarmos na forma da cápsula, temos um raio de 7.1. Eu vou arredondar para sete e a altura eu vou fazer 10. E isso deve servir para as formas iniciais da cápsula. Portanto, nosso personagem deve ser capaz de colidir uma vez que nós configuramos o movimento, o
que vai exigir alguns scripts. Então, primeiro, vamos tomar o nível. Então, de volta à guia de nível, eu vou fechar a arte e o sistema de arquivos ir para personagens, e vamos apenas arrastar este personagem jogador para a cena. Vou colocá-los um pouco aqui para que quando começarmos a correr o jogo, a
gravidade os faça cair no chão. E então podemos verificar se ele está no chão para coisas como ser capaz de mover para a esquerda e para a direita normalmente. Então é muito fácil verificar isso e obter 0 também. Uma das coisas legais sobre o corpo cinemático 2D e movimento e Godel. Então vamos mergulhar na cena do jogador. Podemos abrir um editor que vai mudar para a cena original no nível um, esta é na verdade uma cópia instanciada da cena, então você pode simplesmente colocá-lo em um monte de jogadores se você quiser. E estes são todos separados uns dos outros, mas eles estão todos baseando o que você tem, os diferentes nós aqui e o código baseado nesta cena original do jogador. De qualquer forma, precisamos adicionar um script ao player. Então eu só vou apertar o botão New Script enquanto clica
no corpo cinemático jogador 2D pregado, que é a raiz. Você verá que isso irá automaticamente dar-lhe o nome jogador ponto Gd para GD script. E ele vai colocá-lo na pasta Caracteres. Então eu acho que isso funciona muito bem para nós em termos de organização. Então, vou clicar em Criar. Então, o que vamos precisar fazer para garantir que nosso personagem possa se mover. Quando pressionamos teclas, é verificar a entrada quando o jogo está em execução. Então vamos fazer isso em uma função chamada Processo Físico. Você notará que o processo de função é comentado aqui. Mas como o movimento é basicamente parte da física do jogo, nós gostaríamos de executar isso no processo de física. Portanto, qualquer coisa que tenha a ver com movimento, colisão ou física, geralmente, é recomendável que você execute isso
na função de processo físico em vez da função de processo. Então, uma das diferenças com o processo físico é que ele vai queimar um determinado número de vezes a cada segundo da vida real. Onde está a função sublinhado delta processo pode ser executado mais ou menos vezes do que isso. Então, basicamente, o processo de física é consistente e em sua função de processo normal é executado em número inconsistente de vezes por segundo. Então vamos deletar tudo isso aqui por enquanto. Então eu vou escrever aqui beliche para a função e então sublinhar o processo de física. Você notará que isso nos dá o preenchimento automático. Então eu só vou apertar Enter lá, e completá-lo. Há um parâmetro aqui chamado delta, que é o tempo entre quadros. Então podemos usar isso como informação para nosso processo físico. Então o que nós vamos querer fazer neste é obter a entrada. Então eu estou realmente indo para apenas criar uma variável aqui chamada entrada. E então vamos criar uma função que será executada aqui. E eu vou chamar isso recebe jogador porto. E então só precisamos criar essa função. Então a função recebe entrada do jogador, ok? Sem parâmetros. E então adicionamos os dois pontos no final, apertamos Enter e agora podemos começar a escrever com uma função. Então nós podemos apenas criar uma variável aqui. Eu vou chamá-lo de entrada var. Eu vou colocar este cólon e então eu vou digitar o tipo. Vector para apenas para tipo informar qualquer pessoa lendo o código que este se destina a ser um vetor dois, que é basicamente para flutuar números. Você tem um valor x, que neste caso ele vai ser usado para importação horizontal ou movimento horizontal. E então você pode ter um componente y para o vetor, que seria vertical para cima para baixo. Então, se você estiver fazendo um jogo 3D, você pode ter um vetor 3, que adiciona a terceira direção, que seria como sua profundidade no fundo, seu eixo z. Ok, então nós temos a importação e nós precisamos começar a obter os valores para as entradas. Então temos conjunto extra para entrada horizontal e y para definir para vertical. E assim input.txt. E precisamos definir isso para importar. Agora a primeira letra aqui é maiúscula. Isso é algo que você pode acessar e Godot por padrão, você não precisa escrever nada antes que isso apareça. E então há funções que você pode executar nesta entrada. Então a função que queremos executar é obter força de ação. Então, isso leva um parâmetro e o parâmetro é o nome da ação. Então, você vê por padrão, há todas essas ações de interface do usuário que podemos pegar. Então, poderíamos apenas tornar-se preguiçoso e usar UI sublinhado esquerda. Outra opção seria que você poderia definir uma ação do cliente e chamá-lo de esquerda, direita,
cima, baixo, ou jogar um movimento para cima, para baixo, esquerda, direita, como você quiser chamá-lo, isso é totalmente separado da interface do usuário esquerda. Então, talvez você tenha controles diferentes para a interface do usuário, e talvez você tenha controles diferentes para o jogador, até você como você deseja fazê-lo. Em última análise, estamos apenas descobrindo a tecla que
queremos que o jogador pressione para mover o personagem para a esquerda e para a direita. Então vamos até o menu do projeto. No canto superior esquerdo, vamos para o mapa de entrada de configurações do projeto, e aqui podemos definir as ações para o nosso jogo. Você pode ver a interface do usuário esquerda, interface do usuário para cima e para baixo já estão definidas. Então, se quiséssemos, poderíamos apenas verificar esses valores e usar as setas para cima, para
baixo, para a esquerda e para a direita em nosso teclado, a fim de remover o personagem para o jogo. Eu geralmente prefiro movimento WASD. Então eu vou realmente adicionar uma nova ação. Então isso será separado da interface do usuário,
esquerda, direita, para cima, para baixo. Então eu vou chamar isso de esquerda aqui em cima. Se você estiver criando um jogo multiplayer, você pode chamá-lo de P1 para o jogador um sublinhado restante. Sabe, é mesmo com você. Então vamos adicionar k. Então temos a nova ação, mas não há chaves para ela. Então queremos apertar o botão mais aqui à direita. Você pode ver que você pode adicionar joystick, botão, controles de botão do mouse ou teclado. Então vamos fazer o teclado. E eu vou apertar W no teclado para definir a tecla e apertar Ok, então aguarde, bem que seria realmente para a frente. Então vamos mudar isso. Vamos apertar o botão de edição a para a esquerda. Ok, e então vamos adicionar a próxima ação. Então, para cima. E então podemos fazer para baixo e para a direita. Então, para cada um destes reset ou chave, cima será w, baixo será S, e então escrever será d. Ok, então controladores WASD, talvez queiramos mover isso lá em cima. Então, na verdade, diz que WASD faz um pouco mais de sentido. Vamos fechar isto. Então agora, a fim de obter a entrada x, nós realmente vamos precisar fazer alguma matemática entre dois valores. Então, se estamos definindo o movimento horizontal, há duas chaves que controlariam isso. Esse seria o movimento certo e o movimento esquerdo. Então, à direita na tela vai dar-lhe um valor positivo para o x. e, em seguida, à esquerda na tela vai dar-lhe um valor negativo. Então, como nós calculamos aqui é que para o XML, nós vamos obter o valor certo primeiro aqui. Então é positivo. Eu não coloco um negativo aqui. V é apenas positivo. Se formos para a direita. E então podemos subtrair a força de ação da esquerda. Então, pegue força de ação. E agora vamos à esquerda. Certifique-se de que há aspas porque é uma string. E isso basicamente significaria com uma porta chave. Se pressionarmos a direita, então este vai ser um. E se pressionarmos Left the doly, então este também vai ser um. Então, se você pressionar a direita e a esquerda ao mesmo tempo, um menos um vai cancelar um ao outro e você vai ter um 0. Se você não está pressionando para a direita, mas você está pressionando para a esquerda, você vai ter um negativo. E se você está pressionando para a direita, mas não para a esquerda, então você vai ter um. Então podemos usar isso para determinar qual direção o jogador deve se mover. Então, para a direção y
, pode ser muito semelhante. Então, para este jogo específico, uma vez que tem esse estilo clássico de plataforma, as teclas para cima e para baixo podem realmente não ser usadas no final, mas ainda podemos obter os valores de entrada para ele. Pode haver algum tipo de componente de movimento mais tarde em que dependeria da entrada Y. Então, podemos muito bem apenas obtê-lo já que já começamos. Então vamos fazer entrada y, e vamos fazer força de ação. E desta vez estamos procurando por baixo. Então isso pode parecer um pouco confuso, mas para baixo é realmente positivo quando você está fazendo jogos 2D. Então você vai para baixo na tela, significa que seu valor y está aumentando. Então nós queremos obter força de ação para baixo menos obter força de ação para cima. Então lá vamos nós. E agora temos a configuração
do vetor corretamente, então queremos retornar isso para que ele possa ser usado na função principal do processo físico. Então nos voltamos para a entrada, e estamos praticamente feitos com isso. Então talvez eu escreva um comentário aqui. Então agora, a fim de mover o personagem, nós vamos precisar determinar sua velocidade. Então eu vou subir aqui até o topo e declarar uma variável aqui em cima. Vou chamá-lo de velocidade distante. E eu vou apenas dizer que este é um ou dois, assim como fizemos na função aqui em baixo. Então a vantagem de declará-lo aqui em cima é que isso é basicamente anexado ao script do player diretamente. E podemos usar esse valor em qualquer uma das funções que este script vai estar usando. Então é apenas meio acessível publicamente se estamos em processo de
física obter entrada do jogador ou qualquer outra função. Então isso também significa que podemos definir o valor e, em seguida, o novo valor pode ser usado em outras funções também. Então nós queremos definir a velocidade e vamos fazer isso com base na direção vezes a velocidade de movimento dos jogadores. Mas não estabelecemos o quão rápido eles são. Jogador deve se mover, então precisamos de outra variável. Então eu estou indo para este tipo de tempo n exportação, e eu vou dar-lhe um tipo, ou float ou inteiro. Então, se você quiser ser capaz de usar pontos decimais, você usa um flutuador. Se você quiser que ele seja inteiro como um 1, 2, 3, 4, 5, 6, 7, nenhum ponto decimal. Então você pode escrever INT para Nt. Mas acho que não há nenhuma desvantagem aqui em usar carros alegóricos. E isso só permite que você seja mais específico com a velocidade exata. Então eu vou fazer a variável um float, e nós temos que colocar export float var aqui. E depois disso, damos um nome. Então eu vou chamá-lo de velocidade de
movimento, velocidade de sublinhado de movimento mais especificamente em religiosos, dado um número arbitrário como e 200 por enquanto, podemos sempre mudá-lo mais tarde. Agora, a diferença entre fazer um float de exportação longe e um var é que essa variável não vai aparecer no inspetor para o personagem. Mas quando você faz o float de exportação, o flutuador determina o tipo, basicamente como isso deve ser definido no Inspetor. E então a exportação vai torná-lo publicamente visível. Então, se eu clicar aqui no jogador, podemos ver a variável de velocidade de movimento é definida aqui e podemos mudar isso para qualquer coisa que quisermos. padrão é o que definimos no código, mas podemos alterar isso em uma base de instância. Então, se eu tiver três jogadores aqui na cena principal, eu posso clicar neles. Posso mudar os valores aqui, então 300. Mas ainda podemos salvar isso. Volte para a cena do jogador. E você pode ver aqui que são 200. Mas, em seguida, na cópia da instância, são 300. Caracteres diferentes, mesmo que sejam baseados no mesmo código, os mesmos nós podem ter configurações diferentes. Então você também pode usar isso para coisas como cor. Se quiser pegar um sapo verde e ficar azul ou algo assim. Então temos o nosso valor de Velocidade de Movimento. Agora precisamos multiplicar isso pela direção. Então vamos para o script e eu vou pegar a entrada x. Eu vou multiplicar isso pela velocidade de movimento, a fim de obter o movimento de direção x. Então velocidade, eu só vou definir isso igual ao vetor 2 aqui. Talvez eu divida isso em várias linhas. Então esta será a nossa linha x e esta será a nossa linha de fio. Vou definir isso para 0 por agora. Mais tarde, adicionaremos gravidade e salto. Mas aqui em cima na segunda linha para x, vamos fazer e colocar aquele X. Então essa é a direção que estamos indo vezes que pela velocidade de movimentos. Então, porque a direita é 1 O no teclado, esquerda é 1 O no teclado, vamos obter 0 ou mais 200 ou menos 200. E podemos usar essa velocidade para o movimento. Então mover um corpo cinemático em 2D, uma vez que você tem a velocidade e a direção, é bem fácil. Tudo que você tem que fazer é mover e deslizar. E então aqui vamos colocar nessa variável de filosofia, boom, feito. Na verdade, há outra maneira de se mover para, que é movido e colidir. E lá você também adicionaria n vezes delta. Então realmente isso seria como movimento colide velocidade vezes delta. Então esse é o tempo entre quadros estão se movendo slide são clinicamente contas para isso, mas mover slide não faz. Não sei porquê, mas isso é apenas o nosso trabalho. Portanto, a razão pela qual você gostaria de ter em mente o tempo entre os quadros é se houver alguma inconsistência entre o tempo entre os quadros, você deseja mover o caractere a quantidade certa com base no tempo desde o último quadro. Então o personagem deve se mover a uma velocidade consistente. Mas se seus quadros não forem renderizados na mesma velocidade
, a quantidade de movimento em cada atualização deve ser diferente. Agora, teoricamente e processo físico, vai ser sempre o mesmo. Então, geralmente, você não se depararia com esse problema. Mas no caso de estar lá, é por
isso que o delta existe. E mover e deslizar apenas fatores automaticamente que N. Então você só precisa da variável de velocidade. Você não multiplicá-lo por delta em poucas palavras. Então, agora que temos isso, acho que podemos ir em frente e apertar Play e mover o personagem para a esquerda e para a direita. Ok, primeiro, devemos ter certeza de que estamos no nível visto. E vamos diminuir um pouco aqui. Acho que vamos precisar colocar uma câmera. E então vamos adicionar uma nota infantil aqui. E eu vou adicionar uma câmera, especificamente uma câmera para D. E então, se você diminuir um pouco, você pode ver a borda azul para a câmera. Então eu vou clicar na câmera, pode clicar aqui em baixo e nós vamos mover a câmera 2D e apenas colocá-lo aproximadamente em cima do nosso jogador por agora. Agora podemos acertar o jogo. E o outro problema é que temos que fazer dela a câmera atual. Se você não fizer a câmera atual, então a câmera vai colocá-lo em algum lugar em torno de 000, eu acho. Então, se verificarmos a corrente, então esta é agora a câmera ativa e aqui vai ser onde o jogo começa a olhar. Então, jogue mais uma vez. E vamos testar isso. Ok, então nossos personagens lá, então agora podemos usar A e D para mover nosso personagem. Então, a, d, Ok, legal, está meio que funcionando. Então, problemas óbvios incluem ser capaz de atravessar a parede e não ter qualquer gravidade para cair no chão.
8. Configurações de jogos globais com Singletons: Vamos resolver o problema da gravidade primeiro. Em Canto. Se você for até um projeto, configurações de projetos, há valores de gravidade tecnicamente padrão que você pode definir aqui, ok? E você procura na barra de pesquisa, então gravidade, e então você pode ver 2D, nós temos gravidade padrão e fator de gravidade padrão. A gravidade padrão é medida em pixels, e estes são apenas números arbitrários que você poderia aplicar com seus corpos cinemáticos 2D. Eu acho que estes podem, eu acho que na verdade ele pode ter mais de um impacto direto quando você está usando corpo rígido 2D e que iria automaticamente fator de um centavo. Mas em corpos cinemáticos, você tem que fazer tudo manualmente. Então você pode usar esses valores e personalizá-los aqui. Ou o que eu acho que eu poderia preferir fazer é criar um singleton onde nós apenas temos configurações de jogo que nós podemos carregar em cima como base de nível superior ou para todo o jogo. E sempre que precisarmos mudar as configurações globais do jogo, fazemos isso em um singleton que carrega uma vez por jogo. Então eu vou fechar aqui e então nós podemos criar uma nova cena e anexar um script a ela. Então vamos para o menu no canto superior esquerdo, para a nova cena. E aqui vamos fazer outro nó. Este não é realmente um objeto 2D, por assim dizer. É apenas um nó que vai conter um script com
um monte de variáveis que podemos definir e referenciar e outros scripts. Então, outro nó. E eu só vou fazer nota aqui. Então, o mais básico que você pode obter, eu vou apertar Comando ou Controle S. E vamos salvar isso e o diretório raiz por enquanto. Nós poderíamos realmente criar uma pasta de volta única, poderia muito bem ter mais pastas. Então, vou clicar com o botão direito do mouse e fazer uma nova pasta. E eu vou colocá-lo em Singleton aqui. Acerte Ok. Então este nó vai ser chamado de configurações de jogo. Então, durante o invólucro de camelo, G
maiúsculo, S maiúsculo, e bater Save. Então, eu também vou renomear este nó para configurações do jogo, torná-lo consistente. E agora nós apenas adicionamos um script a isso. Então nós fazemos isso. Ele será automaticamente padrão para esse diretório singleton, qual salvamos o G, qual salvamos o arquivo de cena. Então agora ele vai armazenar o arquivo de script QDOT também. Então crie isso. Vamos apagar tudo por aqui. E agora podemos adicionar um par de variáveis de exportação. Então vamos fazer exportação, flutuar, var. E acho que o que vamos querer aqui é a gravidade. E podemos definir isso para um valor padrão arbitrário. Mas, mais uma vez, vamos salvar uma instância das configurações do jogo. Então podemos clicar aqui e personalizá-lo sempre que precisarmos. Nós realmente não precisamos usar o script porque nós
temos o float de exportação aqui. Então isso é muito útil. E podemos fazer o fluxo de exportação longe. E eu vou chamar essa velocidade terminal, como basicamente na velocidade máxima de queda que você pode alcançar. Então a gravidade é adicionada a cada segundo. Personagem continua acelerando, indo para baixo na tela. E o que você quer que a velocidade máxima seja? Então, porque é um jogo 2D, cartoony, é meio arbitrário. Física do mundo real não é necessária. Só pode brincar com os números e
descobrir a sensação que você quer para o seu jogo específico. Então vou encher a porta 300 4 agora mesmo. E vamos mexer com isso um pouco mais tarde, tenho certeza. Então nós temos esses valores e nós só queremos que ele carregue este nó de configurações do jogo toda vez que lançamos o jogo. Então eu vou para o projeto, Configurações do projeto. Há uma guia aqui chamada carregamento automático, e queremos adicionar nessa cena de configuração do jogo. Então vamos para um único termo e, em seguida, fazer o jogo settings.js PODE clicar duas vezes lá nele. Ok, então agora as configurações do jogo vão carregar toda vez que inicializarmos o jogo, é um singleton. Um único tom basicamente significa que só pode ser um em existência em um determinado momento. Então, se você fez referência às configurações do jogo, você deve estar relativamente certo de que essas
serão as mesmas configurações de jogo que você tem em todo o seu jogo. Então não deve mudar. Deve ser sempre a cena específica que salvamos nesta pasta singleton. Então vamos em frente e aperte Fechar agora. E agora podemos ir para o script do jogador e
podemos fazer referência à gravidade e à velocidade terminal. Então vamos definir a velocidade,
a velocidade y especificamente para sua velocidade de onda atual. E então vamos subtrair, e então vamos subtrair a gravidade. Então menos configurações do jogo ponto gravidade. Então isso é tudo que você precisa fazer para fazer referência a ele. Apenas configurações do jogo ponto qualquer variável que temos configuração e que singleton, e nós podemos apenas referenciar isso através. Ok? E nós também vamos limitar isso. Assim como as coisas são feitas agora, o valor da gravidade vai mudar
a velocidade e vai continuar indo para baixo mais rápido e mais rápido sem limite, basicamente infinito para baixo na velocidade da tela. Então eu posso mostrar isso rapidinho. Mas vamos também fazer uma declaração de impressão aqui. Então imprima e vamos apenas fazer a velocidade dot y para que no console, podemos ver que o valor apenas continua diminuindo. Então vamos tentar jogar o jogo. Então nível um, ok, e podemos ver na saída que vamos obter o valor para a velocidade. Então agora estamos nos aproximando como 16 mil negativos como a velocidade descendente. E, na verdade, cometi um erro. Deve ser mais gravidade porque para baixo é positivo quando estamos fazendo esses jogos 2D. Então vamos querer limitar a velocidade aqui. E a maneira como mantivemos a velocidade de movimento vertical é usando a função Min. É uma função matemática. Então ele vai retornar o menor dos dois valores. Então nós temos o nosso A aqui à esquerda, que é a nova velocidade que estamos tentando definir. E então aqui à direita, vamos ter jogos settings.py, velocidade terminal. Então, agora, quando avançarmos e
apertarmos Play, vamos ver, ou devemos ver um limite no valor. E nós não fizemos. Então eu acho que nós realmente queremos mais configurações de jogo doc gravidade. Vamos em frente e bater mais aqui e ver. Ok, sim, certo, isso está correto. Então, para baixo, mais uma vez é um valor positivo na tela. Então isso é positivo. Isto é negativo. Se apertarmos Refresh aqui, podemos ver, quando isso começa, nosso personagem meio que cai no chão, mas a velocidade é realmente mantida lá. Então é isso que queremos ver. Não importa quanto tempo vai, nunca
vai mais rápido do que aquela filosofia terminal. Ok, então agora nós realmente precisamos ter algumas colisões entre o jogador e o chão. Então podemos verificar nosso mapa de azulejos para isso. Vamos clicar no objeto de mapa de mosaico, a aventura de pixel para o arquivo main.js, que salvamos para o projeto. E agora podemos abrir nosso terreno. Podemos ampliar. E o problema é que não definimos nenhuma peça de colisão. Portanto, não é muito difícil fazê-lo, mas pode ser um pouco demorado. Então, vamos clicar na nossa região aqui. Mais uma vez, já configuramos o BitMask para que possamos desenhá-lo, mas não temos colisões adicionadas. Então, a maneira mais rápida e fácil de fazer colisões é adicionar um novo retângulo. Você pode ver que isso tem teclas de atalho, então é Shift R no teclado. Então eu encontrei uma boa maneira de fazer isso é clicar em sua telha, apertar Shift R, clicar no azulejo novamente, e então você tem seu quadrado de colisão, que é basicamente a mesma forma e tamanho do próprio azulejo. Então, clicamos no segundo quadrado para bater Shift R. Nós clicamos nele novamente, e agora temos uma forma de colisão. Então, se o personagem colidir com isso de qualquer direção, ele deve pará-lo em seus trilhos. Então vamos continuar fazendo isso. Clique em Shift, R, clique em, clique em shift, clique em. Então, continuas a passar e deparas-te com um problema. Você pode apenas clicar manualmente lá, apenas certifique-se de obter uma colisão em cada um. Se você ver que depois de ser amarelo, torna-se ainda mais amarelo. Isso pode significar que você fez as formas de colisão em cima dele para que você possa simplesmente clicar neles e excluí-las se isso se tornar um problema. Então tudo deve ter essa mesma sobreposição de amarelo. Então vamos continuar fazendo isso. Vou acelerar o vídeo. Então, se por algum motivo estiver lhe dando alguns problemas, você também pode clicar manualmente aqui para criar seu próximo retângulo. Então você pode fazê-lo como clique lá em cima e, em seguida, clique aqui para baixo. E então isso lhe dará os mesmos resultados. Mas espero que eles são teclas de atalho vai funcionar para você também. Isso é basicamente todas as formas de colisão com exceção de uma. Então, se ampliarmos aqui, podemos ver que esses blocos de plataforma que criamos têm apenas uma plataforma de quatro pixels de altura. Então não faz sentido ter um personagem colidir com ele por baixo. Porque isso significaria que iria bater sua cabeça bem aqui onde claramente não há nada lá. Então, quando adicionamos a forma de colisão para estes, você pode ver que eu disse que o encaixe era quatro pixels por quatro pixels antes. Há uma razão para isso e que é para que possamos ajustar essas formas de colisão para corresponder a essas plataformas. Então, quando você estiver criando suas formas de colisão, você pode verificar as opções de encaixe. Certifique-se de que o passo é quatro por quatro para esses blocos específicos. E agora você pode clicar em cada um dos cantos e arrastá-los para cima. Então, se fizermos isso para cada um lá, agora temos uma forma de colisão que realmente corresponde ao trabalho artístico deste conjunto de mosaicos. Então nós podemos basicamente refazer isso para cada um deles. Então, basta clicar nos quatro cantos que você precisa ajustar. E isso é basicamente tudo o que há para ele. Desde que você faça isso encaixar quatro pixels por quatro pixels, será muito fácil com esse conjunto de pneus em particular, ok? E por agora, e isso deve ser todas as colisões que vamos precisar
para o nosso conjunto de azulejos de terreno. Tão grande. E agora podemos acertar o Controle S. E se voltarmos ao jogo, a colisão deve estar funcionando. Então vamos jogar nossos personagens agora vai estar no chão. Então podemos bater esquerda e direita para movimento. E um personagem, ele
vai cair da borda e depois pára quando ele chegar aqui. E mais uma vez, quando ele está aqui embaixo. Agora, você pode ver alguns problemas. Um deles é que ele é um par de pixels fora do chão para o personagem. Só precisamos ajustar
a posição da forma de colisão para que isso pareça correto. E então aqui à esquerda você pode ver que eles são y velocidade continua dizendo que é 300. Não estou tecnicamente correto. Então vamos parar aqui. Agora vamos para a camada. Vamos abrir isso e o que precisamos fazer é que depois de termos a velocidade de movimento e deslizamento, isso realmente retorna uma velocidade depois de fazer colisões com o solo. Então, basicamente, eu vou pegar o valor y aqui e defini-lo como 0 porque houve uma colisões no solo. Então, basicamente, não pode se mover mais. Então, se definirmos os valores de velocidade armazenados
neste script para esse valor de velocidade retornado por aqui. Então isso fará com que ele redefina a velocidade y para 0. E então isso será configurado aqui para que a próxima vez que ele vier aqui, nós vamos estar adicionando a gravidade a 0. Então, isso deve estar correto. E também, nós realmente queremos ver a velocidade após o movimento, não antes, antes. Quando isto for 0, vai adicionar a gravidade que fará com que seja 50. Mas realmente depois que o movimento real é calculado, ele vai estar se movendo a uma velocidade de zeros para que faça mais sentido para imprimi-lo aqui. Então vamos em frente e tocar em Play e podemos dar uma olhada nisso. Então você viu talvez que no par inicial de quadros, era 50 era um 100 e então era um 150 como ele estava acelerando em direção ao chão. Mas depois disso é 0 porque estamos no chão. Fique de olho na saída e você pode vê-lo mudar novamente. Então, por uma fração de segundo, ele estava acelerando em direção ao chão. E é isso que queremos ver. Então vamos para a visão 2D para o nosso jogador. Posso ver que a forma de colisão é um pouco baixa aqui, então só precisamos ajustar isso. Então eu vou para a colisão 2D e então vamos tentar fazer a posição três. Depende da direção que você está enfrentando, então pode ser quatro aqui. E agora vamos em frente e ter certeza de que é pixel perfeito com o chão. Então, dando uma olhada aqui, podemos ver que temos os pixels do solo e logo acima estão os pixels delineados do personagem. Então é isso que vamos querer ver aqui. E isso é que você quer realmente cortar o contorno aqui e apenas ter o Greenberg sendo o que está se conectando com o solo. Isso é mais uma escolha estilística, eu acho. Então vamos em frente e bateu parou aqui. E, na verdade, quando eu dou uma olhada nisso, nós basicamente cobrimos tudo para este vídeo. Então temos uma câmera em cima do nosso jogador. Nosso personagem pode se mover para a esquerda e para a direita com base em nossa entrada que configuramos criando essas ações personalizadas. E a gravidade está funcionando bem como as velocidades terminais. Então, uma plataforma decentemente funcional, um personagem sem saltar ainda, mas vamos chegar a isso. Então, se você chegou até aqui, você já está bem no seu caminho para ter uma plataforma funcional ou um personagem. Então isso é muito legal.
9. Máquinas de pulação, movimento e máquinas: Então neste vídeo vamos pegar nosso personagem e dar a ele a habilidade de pular. Então parte disso vai ser a criação de Estados Unidos. Então, por exemplo, se os personagens no chão, ele deve ser capaz de saltar. Mas uma vez que seu personagem está pulando, o movimento vai funcionar um pouco diferente. Então, dependendo de onde o personagem está e quais botões são pressionados em cada um
desses modos diferentes que o personagem tem para ser capaz de interagir com o mundo do jogo vai ser chamado de estado. Então vamos em frente e mergulhe em nossa cena de jogadores novamente. Então aqui podemos ver que temos o spray animado, a forma de colisão, mas não temos como mudar a animação ainda. Então, então atualmente, mesmo que possamos nos mover para esquerda e para a direita quando vamos em frente e tocar em play. E tentamos nos mover para a esquerda e para a direita, podemos ver que os personagens ainda ficam
no Idaho e ele nem olha para o caminho certo para cima. Então podemos corrigir isso e, em seguida, adicionar em pulando nós e outra opção. Mas primeiro, antes de mergulharmos no script, vamos adicionar um player de animação. Então, nosso player de animação é uma das ferramentas que podemos usar para mudar a aparência dos personagens da animação atual, que quando mudamos o estado e o código, também
podemos atualizar o player de animação. Então ele está tocando a animação certa para o estado certo. Então, vamos clicar com o botão direito do mouse no player e adicionar um nó filho. Então estamos procurando um player de animação, que é bem aqui embaixo convenientemente, e vamos em frente e criar isso. E agora, quando clicamos em Animation player, podemos ver que há esta janela de animação aqui na parte inferior. Portanto, queremos criar uma animação para cada uma das animações de sprite animadas aqui. Então eu acho que a maneira de fazer isso é um pouco mais limpa quando você usa um sprite, não um sprite animado. Mas mais uma vez, porque em nosso vídeo anterior descobrimos que todas essas animações diferentes são separadas em diferentes arquivos de textura de imagem. sprite animado funciona melhor para este projeto específico. Então, como ele funciona para o player de animação e um sprite é que vamos entrar neste botão de animação e apertar Novo. Então precisamos criar um para cada animação. Vamos começar com ocioso. Aperte Enter, e agora precisamos adicionar uma faixa. Então, quando temos essas faixas Animation Player Animation, podemos alterar diferentes propriedades à medida que a animação avança. Então eu vou apertar Adicionar faixa aqui, propriedade. E agora podemos pegar qualquer propriedade da nossa cena e basicamente animar isso. Então vamos mudar o sprite animado. E queremos mudar a animação aqui. Quando entramos na animação ociosa no player de animação, queremos reproduzir a animação ociosa no sprite animado. Então eu vou clicar com o botão direito aqui, inserir uma chave. Uma chave apenas sendo um momento no tempo quando você altera o valor de algo como qual animação está sendo reproduzida. E depois à direita com essa chave selecionada, podemos alterar o valor dois. Eu não, nós estamos apenas convenientemente já ligado agora porque quando ele está no estado de animação, nós nunca queremos que ele pare, embora nós não precisamos tecnicamente agora porque quando um personagem está ocioso, nós queríamos manter continuando a animação. Eu acho que faz sentido verificar o loop de animação aqui tecnicamente pode não ser necessário neste caso, uma vez que isso está apenas dizendo ao sprite animado qual animação deve ser reproduzida. Mas os animadores oram provavelmente vão estar em loop de qualquer maneira. Mas se você estivesse usando um Sprite em vez de um sprite animado, você teria que ter esse loop verificado. Então eu acho que é melhor tê-lo lá, só por precaução. Então vamos também levar a animação aqui e criar uma nova. Então, vamos também subir para o menu de animação novamente e adicionar e executar animação. E vamos adicionar um para saltar também. E vamos trabalhar nos outros mais tarde. Mas vamos fazer isso por enquanto. Então r1 e nós vamos adicionar uma propriedade de faixa, rastrear animação sprite animada. E então, no primeiro quadro, queremos inserir a chave, certificar-se de que está na posição certa, até aqui à esquerda. E pegamos o valor e mudamos isso para executar. E claro que isso vai ser a animação de salto. Então, na mordida, co-seguro que quadro-chave para saltar. Então podemos fazer isso ir um pouco mais rápido se duplicarmos nossas animações. Então eu vou para Animation duplicate, e então podemos renomear isso para o que precisarmos. Então vamos ver outra animação. Provavelmente vamos prepará-lo. Vamos mudar o nome para a cabeça. E agora não precisamos verificar looping. Não precisamos criar um quadro-chave. Nós só precisamos mudar o valor aqui para bater animação e nós estamos bem lá. Então isso deve ser o suficiente por agora. Vamos entrar no código. Então vamos precisar de uma variável e num aqui no topo. Então eu vou digitar enums e podemos dar-lhe um nome opcional, então eu vou chamá-lo estado enum. E, em seguida, eu acredito que são os colchetes aqui, nós queremos colocar em ocioso, correr e pular. Então o que o enol basicamente faz é que ele traduz uma ala legível por humanos, como corrida ociosa ou salto em um valor inteiro que vai ser associado a isso. Então, basicamente, você pode pensar nisso como uma posição em uma matriz. O EIDL é o primeiro aqui, modo que vai ser representado como um 0. Quando o jogo está realmente em execução e R1 vai
ser um um e salto vai ser um dois. Mas quando estamos digitando um código, não
precisamos usar esse 012. Só podemos usar AIDL para fazer referência a essa posição dentro dos estados. Assim, fica mais fácil entender o que está tentando ir onde quando você chegou a solucionar problemas de seu código. Então, junto com isso, vamos precisar de uma variável para o estado atual. Então eu vou colocar var atual underscores estado, e nós podemos apenas padrão isso para o ponto de estado AIDL. Então realmente isso vai ser apenas um 0, mas que 0 especificamente está referindo a posição 0 dentro disso o suficiente. Então, mantenha isso em mente. A próxima coisa que vamos querer fazer é ter uma maneira de determinar qual será o próximo estado para o nosso personagem enquanto pressionamos botões ou nos movemos para fora da borda ou assim por diante e assim por diante, queremos basicamente descobrir onde o personagem está no jogo e quais ações devem estar disponíveis para ele. Então, vamos criar uma nova função após a movimentação e o slide são executados. E vamos chamar-lhe “Escolha o próximo estado”. Então, podemos apenas pressionar Enter algumas linhas e criar esta função, função escolher o próximo estado. E então uma das primeiras condições para determinar a história vai ser se os personagens no chão ou não. Alguns dos personagens no ar do que deveria estar em algum tipo de salto ou estado de queda. Você pode até mesmo inventar recibos para isso se você tiver uma razão para isso. Para este personagem, eu acredito que nós vamos ter apenas um estado aéreo, que vai ser o estado Jumps. Mas no chão, nosso personagem pode estar ocioso, ou também pode estar funcionando dependendo se há algum movimento horizontal e desligado. Então vamos verificar a condição principal primeiro, que vai ser, é no chão? Então este é um script 2D corpo cinemático, o que significa que temos acesso a uma função que é chamada é no chão. Então, basicamente, este script já sabe como
verificar se há solo diretamente por baixo. Basicamente, se o nosso corpo cinemático está colidindo com outra coisa debaixo dele, verificando nossa forma de colisão versus formas de
colisão se outras coisas como as telhas do terreno do solo. Então, se esse for o caso, se houver de fato terreno diretamente abaixo do nosso personagem, queremos acabar em qualquer tipo de estado de saltos. E isso significa que vamos querer redefinir o salto
para que nosso personagem possa saltar novamente mais tarde. Então eu vou definir saltos iguais a 0. Assim, para o nosso personagem terá a capacidade de saltar uma ou mais vezes. E isso representará o número de vezes que o personagem saltou desde que bateu no chão pela última vez. Então vamos realmente criar essa variável aqui em cima e avançar até agora saltos. E isso vai para o padrão 0. Desde presumivelmente no início do jogo, queremos dar ao nosso personagem a capacidade de saltar. Saltos vai para 0. Sempre que estamos em terra, precisamos determinar se vamos entrar em um estado de salto,
um estado de corrida ou um estado ocioso. Então queremos entrar em um estado de salto se pressionarmos o botão de salto enquanto estamos no chão. Então podemos verificar se o salto e a porta pressionaram. Então, se o ponto de entrada é a ação apenas pressionada, e então nós vamos procurar salto, que eu não acho que nós realmente criamos como uma ação ainda. Então eu vou em frente e fazer isso logo após esta linha. E então também precisamos verificar se saltos é igual a 0. Então, se salto é pressionado enquanto o personagem está no chão. Então vamos configurar essas ações de salto. Então projeto, Configurações do projeto, mapa de
entrada, venha aqui para baixo. Vamos adicionar a ação Jump. Tenha em mente a sua capitalização. Deve ser o mesmo que a string que você está usando dentro do script. Então vamos adicionar uma chave. Vou deixar a barra de espaço licenciável, apertar Fechar. E agora temos uma ação de salto que pode ser verificada com este gerenciador de entrada. Então precisamos definir o estado atual,
ou mais especificamente, o salto de ponto de estado. Então, quando adicionamos esse auto bit ao estado atual, podemos ter certeza de que estamos referindo o estado atual deste objeto aqui em cima. Então, quando adicionamos este eu aqui, podemos ter certeza de que isso vai se referir
ao estado atual que está especificamente ligado a este corpo cinemático aqui em cima. Então isso vai significar auto-ponto atual estado, que é bem aqui, que é o que queremos. Então estamos configurando isso para o estado ponto salto e temos outros estados que precisamos trabalhar. Então nós também podemos colocar um outro se como um se a primeira condição não for atendida, então esta é a nossa alternativa. E queremos ver se o personagem está se movendo horizontalmente. Então isso pode ser positivo ou negativo, basicamente, desde que não seja 0, poderíamos colocar em velocidade absoluta é maior que 0. Outra maneira que você pode praticamente escrever a mesma coisa seria apenas velocidade não é igual a 0. No entanto, você quer escrever a mesma coisa. E vamos adicionar auto-ponto atual estado é igual ao ponto de estado em. Então, se o personagem não está pulando, mas ele está se movendo, então ele deve estar no estado de corrida. O último que vamos ter para agora,
vai ser apenas o estado DOT I também, se essas outras condições não forem atendidas, mas os personagens no chão, então ele vai estar ocioso. Então, se você não está se movendo, você está ocioso. E não vamos fazer isso ainda. Mas eu vou adicionar uma pequena mensagem para escrever isso mais tarde. Então, se não estiver no chão, talvez queiramos dar um salto duplo aqui em baixo. Então, no ar, basicamente, nós também podemos fazer um movimento de Double Jump Cannon. Então eu vou dizer para fazer salto duplo. E eu só vou passar aqui passes e basicamente continuar com o programa. E não há código aqui, então estamos pulando por cima. Então, em seguida, eu quero criar uma função set para o nosso estado atual. Então, quando mudamos o estado de, digamos ocioso para saltar, queremos que certas ações ocorram. Ou seja, queremos adicionar algum movimento para cima para o nosso personagem quando ele entra no estado Saltos. Para representar o salto no jogo,
o personagem deve mover-se para cima. Então, podemos ter uma função definida significa que quando mudamos o estado atual, podemos ter certas ações de interesses do estado ocorrem. Então aqui em cima no estado atual, eu vou adicionar no conjunto final GET. E então vamos chamá-lo de estado atual, apenas convenção de nomenclatura padrão. Outra idéia que eu tinha em mente, eu não vou fazer isso, mas você também pode chamar de interestadual. Acho que isso também pode fazer sentido. Mas vamos descer aqui e escrever nossa função setter aqui no fundo. Na verdade, vou colocar uma hashtag, setters podem um cabeçalho aqui no caso de termos outras variáveis com setters mais tarde, apenas meio que mantê-los contidos na mesma área. Então vamos fazer função definir estado atual, e isso vai ter um valor, basicamente o novo estado onde entrar. Então eu vou escrever novo estado sublinhado, apenas mantê-lo o mais direto possível. Então, se quando definimos o estado atual, o novo estado é um estado de salto, então queremos que o personagem saltar movendo-se para cima na tela. Então eu vou usar a função de correspondência
no novo valor de estado e verificar se esse estado chegando é o estado de salto. Então podemos usar aqui em baixo como o salto ponto de estado de segunda linha. Então este é o valor que estamos combinando. Então, se o valor passado é salto ponto de estado, então nós vamos querer saltar. Então esta é uma função que não escrevemos aqui também. E, finalmente, queremos definir o estado atual para o novo valor que está sendo passado. Então, se você não tem um conjunto personalizado de funções criado, basicamente se você alterar o valor, seria exatamente como este estado atual é igual a novo estado e nada mais, mas o setter permite que você adicione um código extra que ocorrerá quando esse valor estiver sendo alterado. Então agora precisamos de uma função de salto. Então isso será realmente simples e direto. para ir aqui, escrever outra função, salto de
função e ponto e vírgula. Agora, o que precisamos fazer é mudar a velocidade y desse personagem e adicionar um valor de impulso de salto. Basicamente a quantidade de movimento que
queremos adicionar para cima na tela para que o personagem se mova. E isso deve ser um impulso imediato. Tanto em aceleração ao longo do tempo, ou pelo menos será assim para este personagem. Se fosse uma aceleração, seria mais como uma mochila a jato. Então vamos fazer um ponto de velocidade y. E isso está referindo a mesma velocidade aqui em cima, uma vez que não há nenhuma variável de velocidade especificada nesta função, ele vai para o padrão deste script. Então a velocidade y. E vamos definir isso imediatamente para um novo valor que vamos criar. E eu vou chamá-lo de impulso de salto e reiniciá-lo para um valor negativo porque queremos
que ele se mova para cima na tela. Então esta vai ser apenas a quantidade e esta vai ser a direção. Negativo. Valor significa subir na tela e saltamos. Também vamos querer aumentar o contador de saltos. Então saltar mais é igual a 1. Portanto, isso é importante no caso de querermos adicionar saltos duplos, o que faremos mais tarde. Então vamos criar essa variável de impulso de salto. E eu vou colocá-lo aqui no topo porque isso é algo que podemos querer mudar. Então vai ser um impulso de exportação, flutuar, var e saltar. Então personagens diferentes vão saltar quantidades diferentes. Então podemos definir isso para um bom e alto valor como 600. Então tenha em mente que após a velocidade inicial, isso vai diminuir em cada quadro por esta gravidade até atingir a velocidade terminal ou o personagem atingir o chão. Ele só vai se mover tão rápido inicialmente, e então ele vai abrandar e, eventualmente, voltar para a Terra. Ok, isto deve ser saltos aqui em baixo, não saltar. E agora, se apertarmos Play, nossos personagens devem ser capazes de pular na tela. As animações ainda não mudarão. Então, quando entramos no jogo e tentamos acertar o espaço, nada realmente acontece. Mesmo se cairmos da borda, podemos ver claramente que o personagem está no chão, mas na verdade não está registrando os caracteres no chão. E a razão para isso é que há um argumento extra que podemos passar para este slide de movimento, que é a direção de cima. Então, em um jogo 2D, podemos facilmente fazer isso fazendo vírgula e, em seguida, um vetor dois. Então isso vai significar que para cima nesta tela será nossa direção AP. E agora que isso está definido, movendo slide pode definir os valores para está no chão, está no teto e está nas paredes porque ele sabe em que direção as paredes, o teto e o chão estão agora. Então vamos em frente e reentrar no jogo. E agora podemos atingir o espaço. O ponto de interrupção atinge o salto estadual. Então vamos continuar com isso. E se voltarmos lá, podemos ver que o salto está funcionando bem. Nós também podemos ver que os personagens salto é rápido inicialmente, mas como ele chega a esse ponto mais alto, é diminui e, em seguida, aceleramos de volta para baixo. E isso é o que você quer de uma plataforma padrão ou salto.
10. Árvore de animação e comutação: Ok, a próxima coisa que vamos querer cuidar é
definir parâmetros em uma árvore de animação para que
possamos realmente fazer este player de animação mudar para as animações corretas dependendo dos valores que definimos para essas árvores de animação. Então basicamente precisamos dizer à árvore se o personagem está se movendo para a esquerda e para a direita ou pulando para o ar. E então deixe essa árvore descobrir qual estado de animação colocar o player de animação n. Então nós temos o código real para controlar como o personagem pode se mover. Mas também precisamos ter o player de animação e o lado da árvore de animação das coisas para controlar e como ele representa esses gráficos para o jogador, mas basicamente mudando a animação. Então vamos adicionar uma árvore de animação. Vou clicar com o botão direito do mouse no nó raiz em uma árvore de animação filho. E esta árvore de animação precisa de Animação jogador. Então vamos atribuir nosso player de animação à árvore de animação. E agora também precisamos de uma raiz de árvore. Então há maneiras diferentes de configurar isso. Mas eu acho que para o nosso projeto usando uma árvore de mistura de nós de animação como o nó da árvore raiz vai funcionar. Tudo bem, então é isso que eu vou fazer por agora. Então podemos ver na árvore de mistura que temos uma saída. Então precisamos determinar como vamos chegar a essa saída e qual das animações será a saída atual para o nosso player de animação usar. Então, em nossa árvore de mesclagem, o primeiro nó que eu vou adicionar n será qualquer clicado com o botão direito do mouse, a propósito, para adicionar nós, eu vou descer para mesclar espaço 1D. Então, com esse espaço de mistura 1D, estamos basicamente trabalhando com um parâmetro como uma entrada. E vamos contar à árvore de animação
sobre o valor do parâmetro e o script do player. Mas podemos ver esses parâmetros se clicarmos na árvore de animação novamente. E você vem aqui e o inspetor, você pode ver perímetros misturando espaço 1D. Esse é o nome do nosso parâmetro aqui. E o valor. Então esta é a posição da mistura. E você pode definir isso com parâmetros barra nome do parâmetro e, em seguida, barra mistura posse. Então, no nosso caso, vamos definir para 101 negativos. É pixel arte jogo. Você não vai misturar animações como faria com um modelo 3D. Portanto, só queremos esses três valores. E também podemos dar um nome melhor para isso. Então eu poderia chamar este valor x movimento ou x seno, seno representando a direção um ou 0 ou um negativo para o movimento do nosso personagem. E levando isso para o editor aqui, nós somos capazes de determinar se ele deve mostrar ocioso ou Vaughn. Então vamos abrir o editor aqui e então vamos adicionar pontos aqui. Então eu vou apertar Criar pontos aqui à esquerda e, em seguida, clique com
o botão esquerdo no meio, adicionar animação ociosa. Então, se o valor de x move é definido como 0, Isso vai torná-lo ocioso. Então, vamos clicar aqui na animação do anúncio à direita. Então podemos ver olhando para o gráfico que isso é definido com um valor de um aqui à direita. O EIDL é 0 e, em seguida, 1 negativo. Nós também queremos fazer animação Run. Então ele ainda vai estar funcionando. Só vai fazer isso na direção inversa. Então queremos que ele reproduza a animação de execução. Para que possamos vir até aqui para a raiz. E eu vou conectar isso à saída. Agora, tudo o que precisamos fazer é definir este parâmetro no código. E a árvore de animação será capaz de dizer ao jogador de animação se deve ser executado ou se está ocioso para a animação. Então, vamos clicar na árvore de animação. O parâmetro que precisamos definir mais uma vez é este x move. Então, se passarmos o mouse sobre a posição de mesclagem, podemos ver o caminho completo para ele é perímetro barra x sublinhado mover barra mesclagem posição sublinhado. Então, se formos para o script do player agora, depois que a velocidade é definida, removendo slide, vamos querer definir alguns parâmetros de animação. Então eu vou criar uma função adequadamente nomeada conjunto n m parâmetros. E nós podemos meio que vir aqui. Eu vou apenas inserir algumas linhas e vamos
escrevê-lo logo abaixo deste processo de física. Assim conjunto de função e m parâmetros. Então, para isso, vamos precisar fazer referência à velocidade. Mas, mais uma vez, podemos ver que a velocidade está sempre sendo montada aqui no topo. Então nós realmente não precisamos torná-lo um parâmetro dentro desta função, nós podemos apenas referenciar isso diretamente. Mas o que precisamos agora ainda é uma referência à árvore de animação. Então, se você quiser pegar um dos nós que está dentro de sua hierarquia de cena e referenciá-lo realmente facilmente dentro de seu script. Então o que você pode fazer é vir aqui. Vamos acima da velocidade. Então, agora aqui em cima, precisamos escrever em “não prontos”. E o que isso significa é que quando o roteiro começa, precisamos fazer algo. Mas estamos colocando o on pronto com uma variável. Então, quando o script começa, estamos fazendo algo com essa variável. E a variável vai ser árvore de sublinhado de animação. Então esse é o nome da variável. Mas o que realmente queremos aqui é uma referência ao nó da árvore de animação. E a maneira como fazemos isso é acertar iguais e então colocamos a árvore de animação do cifrão. Então isso vai olhar em nossa hierarquia de cena e, em seguida, tentar encontrar o nó chamado uma árvore de animação. E então, quando o script começar, ele vai pegar esse nó e atribuí-lo aqui. E com o não pronto, isso é atribuído uma vez que o script é iniciado. Então, agora que temos a árvore de animação, podemos definir parâmetros na árvore de animação em nosso conjunto e m parâmetros função. Então eu vou fazer animação sublinhado tratar ponto definido porque estamos definindo um parâmetro. E agora precisamos do caminho para o parâmetro dentro desse nó. Então queremos que os parâmetros cortem o nome do parâmetro, que eu acredito que foi chamado de movimento X,
e, em seguida, barra posição de mesclagem. E o que queremos definir lá será o sinal da velocidade. Então, ou vai ser 10 ou um negativo e nenhum outro valor. Já que não estamos tentando nos misturar, são os valores que queremos usar. Então é 100%, ou ocioso ou 100% correr e não tentar fazer nada estranho. Então vamos pegar o sinal da velocidade x e isso é basicamente esse valor. E mais tarde teremos mais parâmetros de anime, mas isso é tudo o que precisamos, já que estamos apenas fazendo o movimento x. Então vamos em frente e tocar em play e podemos mover para a esquerda e para a direita. Ainda não está funcionando. E eu acho que isso é porque a árvore de animação não é realmente ativada. Então livre verificar ativa a árvore de animação. Agora ele vai mostrar a animação ociosa. Ok, nós também podemos vê-lo muda para a animação de movimento, mas só depois de um segundo ter ocorrido. Então o que está acontecendo lá é que se
saltarmos para o player de Animação e olharmos para essas animações, elas só serão atualizadas uma vez por segundo. Assim, a animação foie precisa ocorrer atualmente para que ela possa alternar entre animações. Então, para nós, isso é uma solução muito fácil. Podemos apenas tomar o tempo de cada uma das animações e configurá-los para 0,05. Tudo isso realmente está fazendo é certificar-se de que ele está na animação certa, reproduzindo no sprite da animação. Então a duração realmente não importa aqui, 0,05 para a animação ociosa, a animação de salto. Então imprima 05 e vamos ter certeza de que R1 está lá dois. Então 0.05, vamos em frente e tocar play. Então agora podemos nos mover em nosso jogo. E quando nos movemos, instantaneamente muda para esse estado de humor. E quando começamos a nos mover, ele instantaneamente se move volta para o estado ocioso quase instantaneamente de qualquer maneira, leva 0,05 segundos no máximo, modo que praticamente funcionará bem. Agora também vimos que o personagem pode se mover para a esquerda e para a direita, mas não ajusta a direção em que está virado com base se estiver se movendo para a esquerda e para a direita. Então precisamos de mais uma função aqui chamada ajustar direção invertida. E em que vai tomar as variáveis de entrada. Então esta é a importação daqui de baixo. Ok, nós podemos parar o jogo para que ele não atinja pontos de interrupção. Então precisamos escrever o código para apenas virar direção. Vou adicionar outra função aqui em baixo. Então função ajustar direção flip. Ele vai tomar um parâmetro e eu vou
especificar que deve ser um fator dois. Então um vetor de ponto-e-vírgula 2 e depois termine essa linha com outro ponto-e-vírgula. Então o que vamos verificar aqui é basicamente o sinal da entrada. Agora também podemos verificar o sinal da velocidade atual dos caracteres. Mas eu quero que o personagem para enfrentar a direção onde o jogador está tentando se mover, não necessariamente aquela direção que os personagens velocidade atual está indo. Agora, para este personagem, se estamos apenas movendo instantaneamente 200 para a esquerda ou 100 para a direita,
a velocidade de movimento, e não há mais nada agindo sobre ele. Não haverá nenhuma diferença funcional lá, mas alguns personagens podem ter aceleração, seja acelerando para a direita porque você está mantendo a taxa baixa. Mas ele realmente não mudou a direção da velocidade da esquerda para a direita porque ele tem um acelerado o suficiente ou ele realmente
mudar de direção e para que lado ele está indo na tela. Então, de qualquer maneira, vamos usar se seno de entrada X é igual a 1, basicamente significando que o valor é positivo para a direção certa, então o sprite animado não vai virar sua direção. Assim, o sprite dot flip animado H para horizontal é falso. Nossa direção padrão será falsa e você sempre pode mudar isso. Você também poderia ter uma
variável de frente padrão se você quisesse ser um pouco mais flexível. Mas vamos supor aqui que estamos fazendo o rosto do nosso personagem certo por padrão. Então isso parece correto. E nossa alternativa é, se este sinal importar que x é igual a um negativo como o personagem está pressionando para a esquerda, então o sprite animado deve olhar para a direção esquerda. Não, não, eu não tenho outra. Se o seno é 0 aqui porque se houver 0, não há entrada. E se não houver entrada, não
quero mudar a direção que está virada. Deve apenas encarar onde estava. Antes da última vez que soltamos o teclado. E vamos realmente perder essas variáveis de sprite animadas. Então precisamos de outro em var pronto aqui. Assim como com a árvore de animação que o sprite animado está aninhado em nossa hierarquia para a cena. Então var não pronto, sublinhado animado, spray é igual ao sinal do dólar, sprite animado. E isso é tudo o que precisamos fazer para sermos referenciados a isso. Note que quando você faz as coisas desta forma, você deve manter o mesmo nome ou então eu acho que você pode ter problemas lá. Mas se este é o nome do nó, ele vai fazer referência a que apenas fine,
desde que esse nó está contido nesta hierarquia. Então agora isso deve resolver esse problema. Vamos em frente e aperte Play e nosso personagem vai agora enfrentar a direção correta. Também podemos saltar. E enquanto saltamos, o personagem pode enfrentar a direção certa. Mas ainda não está tocando a animação para isso. Então isso será algo que configuramos no próximo vídeo enquanto caminhamos em nossa árvore de animação e ajustamos, nosso estado é um pouco mais.
11. Configuração de animações para pular e cair na árvore de animação: Então, em seguida, precisamos configurar a árvore de animação para
que possamos suportar a mudança para a animação de salto. Então vamos mergulhar de volta na cantora do jogador. Vou clicar aqui em cima. E vamos clicar na árvore do jogador. Então, podemos ver atualmente que só temos um linspace uma dimensão, que está tomando esse parâmetro x move, a fim de ir entre ocioso e executado. Mas queremos ter um caso em que o personagem esteja no ar. E então, se estiver no ar, devemos alternar entre estados de
ascensão e queda dependendo da direção da velocidade y. Então podemos pegar a saída desta dimensão única, e então podemos clicar com o botão direito aqui e criar uma mistura três. Assim, a mistura três permite que você tenha três entradas. Assim, podemos ter um valor de mistura negativo. Podemos ter o padrão de entrada, que neste caso vai ser o nosso movimento x. Então eu vou apenas desconectar lá e conectá-lo bem aqui. E então temos o caso de valor de mistura positivo. Então eu vou em frente e chamar isso de algo como sinal de sublinhado y. Você também pode chamá-lo de velocidade de sublinhado y. Mas realmente vamos ter três valores aqui em 101 negativos. Então, se tivermos o valor de mesclagem negativo, isso significa que o personagem está subindo na tela desde negativo é para cima no eixo y. E isso significa que queremos a animação de salto. Então eu posso clicar com o botão direito aqui em uma animação. E nós podemos apenas selecionar saltar da lista e alimentá-lo para a mistura negativa. Depois a mesma coisa. Se tivermos uma mistura positiva caracteres movendo-se para baixo na tela. Então queremos usar a animação de queda. Então clique com o botão direito na animação, mude para queda, que aparentemente ainda não foi criada. Então vamos em frente e mudar para o player de animação aqui e criar outra animação. Então vou pegar esse ídolo e duplicá-lo. Então agora temos cópia ociosa. Vou renomear isso para ser outono como a animação. E vamos pegar essa coisa de animação, mudar o valor de ocioso para a animação de outono. Então, porque duplicamos a animação, já
temos o tempo da animação definido para 0,05 segundos e em repetição. Então isso pode ser tudo o que precisamos lá. Então, de volta na árvore de animação, podemos selecionar a animação de flores. Talvez precisemos recriar a caixa de animação. Então, vou clicar com o botão direito do mouse em Adicionar animação. E espero que desta vez apareça aqui. Então nós temos a animação de outono e queremos conectar isso ao valor de mistura positivo. Então agora eu tenho três possibilidades são um salto, permitindo que o espaço de mistura para escolher nossa animação com base no movimento x ou ter queda como a outra animação. Então vamos conectar isso à saída aqui. E vamos mover esse valor deslizante ao redor. Então podemos ver em mais um, é uma animação caindo, negativa, temos a animação de salto. E em 0, ele será padrão para qualquer saída do linspace 1D é aqui. Então agora precisamos fazer mais uma coisa que é definir esse valor seno y e código. Então, se clicarmos na árvore de animação, podemos expandir os perímetros e podemos ver o caminho para este yseno. Então ele vai ser praticamente como o movimento x e apenas parâmetros cortar o nome da variável como ele digitou aqui. Então y sublinhar sinal e, em seguida, finalmente, cortar a quantidade de mesclagem. Observe que para o espaço de mesclagem 1D, a parte final desse parâmetro foi a posição de mesclagem. Mas para esta mistura três, é realmente a quantidade de mistura. Então você tem que ter cuidado lá. Certo, então vamos voltar ao código e temos nossa função de parâmetros de animação aqui. Vamos adicionar mais um pouco aqui. Então árvore de animação ponto definir parâmetros e queremos y sine barra mescla quantidade sublinhado. E o valor que vamos fazer para isso é apenas velocidade
senoidal ponto y. eu vou em frente e salvá-lo. Por uma questão de consistência, eu acho que eu vou apenas pegar o movimento x e eu vou renomear isso para ser x seno também. E, em seguida, na árvore de animação, vamos apenas certificar-nos de que este parâmetro é chamado x seno. Então, se você mudá-lo em um lugar, certifique-se de mudá-lo e o outro também. E agora podemos ir em frente e relançar o jogo e ver se as animações funcionam corretamente. Então vamos em frente e tocar no play. Ok, e é isso. Pular. Está bem. Então ele muda para a animação de salto e quando ele cai, ele tem a animação de queda. Então nosso personagem está se movendo para a esquerda e para a direita e pulando e caindo muito bem.
12. Sinais e etiqueta de depuração de jogador: Ok, a próxima coisa que eu quero configurar é um rótulo que podemos ter exibição acima do nosso personagem para fins de
depuração, a fim de saber tipo que estado ou animação o personagem é em qualquer momento. Então, em nosso objeto de personagem, vou clicar com o botão direito do mouse e adicionar um nó filho. E então este vai ser um nó rótulo, que é tecnicamente um nó de controle, mas você pode colocá-lo nó de controle em cima de um nó 2D como um corpo cinemático 2D se você quiser. Caso contrário, geralmente nós de controlador iria para o Canvas, que é tipo de sua interface do usuário. Então eu vou clicar no rótulo aqui, e eu vou posicionar este rótulo em algum lugar acima do nosso jogador. Então vamos meio que mover isso para cá. E porque é um filho do jogador, deve mover-se junto com o jogador. Então, talvez para o rótulo padrão, eu possa apenas escrever nenhum aqui ou algo assim. E então vamos pegar o alinhamento para o texto e
centralizá-lo apenas para que fique um pouco mais agradável lá. Então o que podemos fazer com este rótulo para que ele mostre o estado atual que o jogador é e é criar um sinal. Então, à vista do script do jogador criará um sinal aqui. Então, sob o estado atual definido, sempre que um novo conjunto de status, vamos criar uma maneira de dizer a ele o rótulo que o novo estado foi definido. Então uma maneira seria apenas acessar diretamente o rótulo aqui em cima, como ele fez com isso, e então apenas fazer texto de ponto de rótulo igual a qualquer que seja o novo valor. Mas outra maneira é criar um sinal. Então, como o sinal basicamente envia uma mensagem e qualquer coisa que está anexado a esse sinal será capaz de responder a ele de alguma forma. Então, ao invés do rótulo ou do corpo cinemático precisando saber diretamente um do outro. O rótulo só precisa ter, o rótulo só precisa ter uma função de resposta ao sinal que está sendo emitido do player, mas ele não precisa saber nada sobre o jogador diretamente. Então, em certo sentido, esse tipo de dissocia seu código entre seus objetos. E então o ponto de conexão é o sinal em si, que você pode conectar para comprar código. E você também pode se conectar com bastante facilidade clicando no objeto indo para o nó. E então você pode ver um monte de sinais aqui que você pode responder. Então, quando criarmos um sinal e o script do jogador, ele aparecerá aqui. E então podemos clicar duas vezes e na seção de notas e apenas dizer qualquer outro objeto que queremos responder à emissão de sinais para ter uma função, para fazer algo com os dados quando esse sinal é emitido. Então deixe-me ir em frente e configurá-lo e espero que faça sentido depois disso. Então deixe-me mergulhar no código aqui. Então aqui no topo, vamos criar um sinal para esta classe de jogadores emitir sempre que quisermos emiti-lo dentro do script. Então vou adicionar um par de espaços aqui. Vou digitar o sinal e acho que vou chamá-lo de estado mudado. E então isso vai ter um valor para quaisquer outros scripts como o script label para responder. Então eu vou chamá-lo de um novo estado. E isso é praticamente tudo para configurar este sinal. Agora só precisamos emitir este sinal. Então aqui em baixo, e vamos emitir um novo sinal sempre que o estado mudar. Então emita sinal. E então colocamos o nome do sinal. Então mudou de estado. Podemos ver isso aqui em cima. E então há alguns outros sinais padrão, eu acho que para esta classe. Mas vamos usar o personalizado que acabamos de criar. E então precisamos dos parâmetros. Então eu vou colocar no novo estado. E então podemos salvar nosso roteiro. Isso é praticamente tudo. Agora, se clicarmos no nosso jogador e irmos para a seção de notas no canto superior direito e inspetor extra, podemos ver este jogador ponto G, D tem um novo sinal. E então podemos clicar duas vezes sobre isso, a fim de se conectar ao sinal. Então, clicando no jogador, agora
podemos ir para o nó e clicar duas vezes em onde ele diz estado mudou aqui, o novo sinal que acabamos de criar. Agora escolhemos um script para conectá-lo. E ele vai criar um receptor métodos. Assim, o jogador emite o sinal com alguns valores de parâmetro, e então o rótulo de estado tem um método receptor, a fim de responder a isso. Então, vamos clicar no rótulo de estado conectado. E agora temos essa função no jogador mudou de estado. Assim, sempre que o jogador mudar de estado, queremos definir o texto deste rótulo. Então eu poderia apenas fazer auto-ponto texto. E assim com o texto do rótulo, podemos definir o novo estado lá. Então eu vou fazer a cadeia do novo estado. Então, seja qual for o valor passado aqui, nós só queremos convertê-lo em uma string se não for uma string já, e definir isso como o texto. Então vamos voltar ao nosso jogo e ir em frente e tocar em Play e ver se o sinal está funcionando. Certo, temos que tirar o S. Então vamos tentar de novo. Então, se formos em frente e tocar, podemos ver as enums sendo representados como o valor inteiro. Então 0 para ocioso 14 correndo ao redor e depois dois para saltar. Então, tecnicamente, está funcionando muito bem. Mas aqui pode ser mais útil mostrar o nome das enums. Então, em vez de dizer 0 para ocioso, nós apenas temos ocioso representado no topo lá. Então, se voltarmos para a classe do jogador, quando emitirmos o sinal, em vez de emitir este novo estado como um inteiro, podemos ter o valor da string ser empurrado também. Então, para fazer isso, vamos subir aqui no topo. E para esse estado alterado, eu vou ter dois parâmetros sendo passados. Então o primeiro é novos estados durante e, em seguida, o segundo, que é o atual, pode ser apenas um novo ID de estado ou um novo inteiro de estado, algo ao longo dessas linhas. Então agora aqui na parte inferior, ainda
vamos passar o novo estado, que é o valor inteiro. Mas também vamos acessar o nome da string do estado e passar isso também. Então podemos fazer isso acessando o nome deste estado. Então este é um dicionário e nós podemos apenas fazer chaves de ponto de estado. E agora precisamos passar a posição do array, que será onde quer que encontremos um novo estado. Então, se fizermos isso e salvarmos, isso agora deve passar com dois argumentos para o rótulo de estado. Então isso vai para lá. E poderíamos reconectar essa função se quiséssemos. Acho que talvez possamos nos safar redigitando os parâmetros. Então novo ID de estado e, em seguida, nova cadeia de estado. E nós vamos apenas pegar esse valor e definir que seja o novo texto. Então agora o nosso sinal vai dar-nos dois parâmetros para trabalhar. E nós só nos preocupamos com a string porque é isso que queremos mostrar acima do player para fins de depuração. Então vamos em frente e ver se isso realmente funciona. Vou tocar no play. E agora entramos no jogo. Ok, nós temos ocioso, ocioso correr e saltar. Então isso deve ser muito mais útil do que apenas ter um 0 ou um ou dois aparecendo acima do jogo.
13. Siga a câmera: Então, agora que nosso personagem pode se mover em grande parte, uma das coisas que vamos querer adicionar vai ser uma câmera seguinte. Então, atualmente, a câmera que configuramos é apenas apontada para essa área e é estática. Então, se apertarmos
o jogo, não vai seguir o nosso personagem. Assim, um personagem pode correr para fora da tela. E isso pode ser um problema se chegarmos a essa parte em que não podemos mais ver nosso jogador. Agora, em alguns casos, você pode querer ter uma câmera estática
dependendo do estilo do seu jogo ou desta cena específica. Então você pode realmente alternar entre diferentes câmeras estáticas se você só queria mover de tela para tela, tipo de como estágios individuais. Mas se você quer ter uma câmera de acompanhamento, deixe-me mostrar-lhe como fazê-lo. Então temos o nosso nível e depois o jogador aqui em baixo. E precisamos adicionar uma transformação remota ao player para que a câmera 2D rastreie. Então, se eu clicar com o botão direito do mouse no player e adicionar um nó filho, podemos procurar esse nó de transformação remota, basta digitar REM. E aqui temos a transformação remota 2D. Então eu vou adicionar isso. E agora essa nota 2D de transformação remota tem uma propriedade chamada caminho remoto. Então, basicamente, o caminho remoto diz um objeto diferente para olhar para esta transformação para rastreá-la. Nesse caso, serão as câmeras. Então vamos atribuir a câmera 2D. E isso será basicamente tudo o que temos que
fazer para garantir que a câmera siga essa transformação remota. E, por padrão, a suavização é um on. Vou desligar isso agora mesmo e carregar em Play. Então, se você não tem Smoothing, então a câmera vai basicamente seguir perfeitamente sua quantidade de personagem. E não haverá nenhum atraso entre o movimento dos personagens e a câmera. Então, em algumas circunstâncias, pode querer que haja um pouco de um atraso seguinte. Então você pode verificar ativado aqui. E quanto menos atraso você quiser, mais velocidade você vai aumentar. Então, se você quer que ele seja muito lento em seguir o jogador ao redor, então você iria querer uma velocidade mais baixa. Este padrão é cinco. Então vamos em frente e testá-lo com 10. Então vamos tocar no Play e nos mover. E você pode ver um monte de Jenkins, sim, certo? Então, uma configuração que podemos usar que ajudará a corrigir que muito é o encaixe de pixel da GPU. Então, se entrarmos no menu do projeto na parte superior esquerda e, em seguida, as configurações do projeto, podemos procurar o encaixe de pixel e eu acredito que está em Renderização 2D. Então, podemos checar isso. E isso vai resolver muitos dos nossos problemas de exibição. Então eu vou fechar isso e vamos em frente e tocar play novamente. E desta vez, quando nos movemos pela tela, parece muito, muito melhor. Então, mais uma vez, se o seguinte for muito rápido, você pode tentar diminuir a velocidade. Então cinco é o padrão. Vamos mostrar como é isso. E aqui ele basicamente fora disso. Então, se eu parar de me mover, você pode definitivamente ver o atraso lá. Então, cabe a você quais serão
suas preferências pessoais para o seu estilo de jogo. Vamos ir em frente e fechar isso lá fora. E acho que por agora vou colocar de volta para 10. Então isso é basicamente tudo que você precisa, apenas uma transformação remota e diga à câmera para olhar para ela. E você é basicamente ser bom para ir para a nossa câmera de acompanhamento e obter o.
14. Código duplo de Estado de salto: Ei, então atualmente nosso personagem pode se mover ao redor da tela, ele pode pular. Mas o que podemos querer fazer é adicionar um pouco de funcionalidade extra ao nosso personagem. Então, a fim de deixá-los mover ao redor do nível um pouco mais fácil, Vamos em frente e adicionar em duplo salto. Então eu vou sair do modo de jogo e vamos para o roteiro do nosso personagem. Então, dentro deste script, podemos configurar um novo estado e tê-lo mudado para isso com pick next state como antes. Então o que basicamente vamos fazer é se a entrada for pressionada, vamos pular. Mas neste caso vai ser um salto duplo porque o personagem já está no ar. Então isso vai, então para o nosso próximo estado de escolha, ele vai ser semelhante a aqui mesmo, onde se salto é pressionado, nós entramos salto, mas nós vamos estar verificando quando os personagens e o ar, e Se o personagem estiver no ar e saltar reprimido, então vamos fazer um salto duplo apenas enquanto o personagem não tiver atingido seus saltos máximos. Então ele está no chão é definido para falso significa que ele vai vir aqui para baixo. Então, podemos apenas configurar a entrada if é ação apenas pressionada. E depois procuramos saltar. E agora vamos mudar para o estado de salto duplo, que ainda não criamos. Então estado ponto-ponto salto, salto duplo sublinhado. E eu vou rolar até aqui até o topo e vamos adicionar isso à nossa lista de estados. Então salto duplo. Então, o que queremos que aconteça quando o salto for pressionado? Bem, queremos que salte como fizemos com o estado normal dos Saltos. Também queremos que ele salte quando fazemos um salto duplo. Agora isso pode ser exatamente como o primeiro salto onde nós apenas fazemos o impulso de salto negativo. Ou você pode ter uma função separada para um salto duplo. E talvez isso tenha um valor de impulso de salto diferente. Por agora, eu vou apenas configurá-lo aqui para apenas fazer um salto normal em termos de seu movimento. Então, como podemos adicionar salto duplo a esta pequena declaração de correspondência aqui é apenas colocar uma vírgula e então fazemos o estado ponto duplo salto. E acho que podemos ter um espaço lá também. Aperte Salvar. Então, agora, se o estado é salto ou salto duplo, vamos executar a função de salto. Então você pode apenas ter como uma lista de estados diferentes que querem combinar certas ações para. Agora, é claro, isso só combina com o movimento dele. Ainda precisaremos configurar a árvore de animação para a mudança para a animação de salto duplo. Mas uma outra condição que eu quero adicionar a isso é a ação apenas pressionada é ver se os saltos estão acima do número máximo de saltos. Porque o nosso personagem provavelmente pode saltar duas vezes, mas geralmente não mais do que isso. Então, podemos ter uma variável de saltos máximos, poderia configurá-lo para dois ou três quantos você quiser. Mas se não tivermos esse conjunto, o personagem será capaz de continuar pulando para sempre. Então podemos mostrar isso em jogo. Vou em frente e apertar o botão play. E vamos começar a saltar. Então eu posso apenas continuar a enviar spam o botão de salto e apenas ir muito acima do nível. De um modo geral, isso seria inovador. Então vamos em frente e fechar fora disso e ter uma variável de saltos max aqui em cima. Então eu vou fazer exportação inteiro var max saltos, e eu vou padrão que para dois. Então, sempre que nos depararmos com esta situação em que poderíamos fazê-lo saltar, nós nos certificamos de que ele já não atingiu essa quantidade de saltos máximos. Então isso vai ser aqui em baixo. Quando estamos pensando em fazer um salto duplo. Queremos que a condição final que salta é menor ou igual a saltos máximos. E como sabemos, sempre que executamos a função de salto que vai incrementar. Então, batemos no Jump uma vez para entrar no ar e deve ir para um. Fazemos o salto duplo e deve chegar a dois. E você não deve ser capaz de fazer mais nenhum salto até que nós batamos no chão e então é no chão é verdade, e saltos é definido como 0. Então vamos em frente e jogar e enquanto no chão para que eu possa saltar uma vez e eu posso bater barra de espaço duas vezes para saltar duplo. Parece que ainda podemos saltar para sempre. Então vamos dar uma olhada nisso. Então eu acho que eu vou apenas depurá-lo imprimindo o número de saltos para o console. Faça o login aqui, a saída. E vamos ver o que acontece quando apertamos Play e continuamos apertando o botão de salto. Então 23. Ok, parece que podemos ir para três, mas não mais do que isso. Então, sim, isto na verdade deve ser menor que o número de saltos máximos. E agora o personagem só deve ser capaz de saltar duas vezes. Então vamos repetir o jogo 12, ok, 123, não, não funciona. Ok, então só podemos fazer dois saltos. Temos salto duplo, mas não vai mais do que isso.
15. Configurar o salto duplo na árvore e código: Então a próxima coisa que precisamos fazer é configurar
a animação de salto duplo para trabalhar com o truque de animação. Então, se dermos uma olhada no sprite animado na cena do jogador, podemos ver dando uma olhada nessas animações que a animação de salto duplo aqui é uma cambalhota. Então eu vou dizer que o personagem só deve fazer uma cambalhota sempre que batermos na barra de espaço para fazer um salto duplo. Portanto, isto vai ser um pouco mais o que chamaríamos de animação de um tiro. E podemos configurar isso muito facilmente na árvore de animação também. Então, em um tiro vai jogar uma vez e, em seguida, ele vai retomar outras animações dependendo de outros parâmetros que temos definido. Então este tiro vai ter prioridade sobre as animações padrão de salto, queda, inatividade e execução. Então, se clicarmos com o botão direito do mouse no gráfico do nó aqui, podemos adicionar um one-shot. Então você verá que ele tem duas portas. Um para o único tiro em uma entrada padrão de quatro anos. Então eu vou pegar este conector entre a mistura três e nossa saída. Então eu vou redirecionar isso para a entrada. E então o único tiro vai se conectar à saída. Então isso vai significar que eles são um tiro tem prioridade sobre qualquer outra coisa aqui. Se o one-shot estiver ativo e sabemos que está ativo por causa
desse pequeno parâmetro booleano que podemos definir quando estiver ativado, queremos que ele reproduza a animação de salto duplo. Então, vou clicar com o botão direito do mouse no gráfico do nó, ir para animação. E então aqui, Vamos selecionar a animação de salto duplo, conectá-lo a um tiro, e vamos apenas renomear o parâmetro que este tiro vai usar. Então, se você clicar na árvore de animação, podemos ver o perímetro de um tiro aqui. E vamos dar um nome que seja mais específico. Então eu vou chamá-lo de salto duplo sublinhado. Acho que é o mais claro possível. E se passarmos o mouse sobre ativo, podemos ver que o caminho completo para este parâmetro é perímetros barra dupla sublinhado salto barra ativa. Então vamos precisar definir essa codificação em um minuto. Mas antes de fazermos isso, quando temos um nó de um tiro, há duas propriedades que devemos mudar. Então esse é o tempo de Baden e o tempo de desaparecer. Então, para a nossa animação de pixel art, não
queremos que haja um atraso de tempo entre entrar em uma animação e realmente começar a reproduzi-la. Então, queremos pegar estes e definir como 0 para ambos. Então, quando o tiro único estiver ativo, troca deve ser imediata. Ok, então agora podemos pular para o código. Então vamos dar uma olhada nisso. Nós vamos gostar antes que precisamos usar a árvore de animação e definir um parâmetro. Mas este conjunto e m parâmetros função está sendo executado cada física Process Update. Então isso seria um número definido de vezes por segundo. Mas a coisa é, nós só realmente precisamos definir esse parâmetro de animação como verdadeiro, especificamente quando estamos fazendo saltos duplos. Então seria muito redundante colocá-lo aqui e fazer algum tipo de
verificação e, em seguida, configurá-lo para ativo ou falso em cada segundo. Então, vamos realmente descer aqui até o fundo. E um lugar muito melhor seria colocá-lo no centro. Então, quando entramos em um novo estado com estado atual definido, podemos ter esse parâmetro B sat quando entramos no estado de salto duplo. Então, se você ainda não separou seu estado ponto salto salto e estado ponto duplo salto correspondência. Você pode fazer isso agora. Então eu vou colocar um cólon aqui. E vamos fazer o salto duplo do estado. E eu vou mover isso para baixo. Então isso agora vai ser sua própria coisa separada. Estado ponto-ponto-ponto salto cólon. E é claro que ainda vamos querer que ele faça aquele salto, a função do salto. Mas também vamos querer pegar a árvore de animação e definir o parâmetro. Então o nome dos perímetros era parâmetros barra dupla sublinhado salto barra ativa. E porque nós apenas entramos em salto duplo, queremos definir isso como verdadeiro. Então isso basicamente diz a árvore de animação K. Tocar o único tiro. Vamos fazer a cambalhota de salto duplo porque agora estamos no estado de salto duplo. Então a última coisa que precisamos fazer é descobrir como sair desse tiro. Então o script vai definir isso como verdadeiro, mas nós também precisamos configurá-lo para fora para que ele possa ir reproduzir as outras animações depois que ele é feito. Então podemos fazer isso no player de animação. E se você encontrar a animação de salto duplo, ela deve ser definida para 0,3 segundos. Então ele está tocando seis quadros a 20 quadros por segundo. Então fazemos a animação 0.3 segundos de duração. E também queremos desativar o loop de animação se isso estiver aqui à direita, porque isso só deve ser jogado uma vez e depois Terminar. Agora podemos ampliar um pouco aqui e vamos querer adicionar outra faixa. Vamos definir o parâmetro na árvore de animação para o one-shot como false quando esta animação for concluída. E, claro, isso de várias maneiras que você poderia fazer isso. Você poderia fazer isso no código aqui também. Mas isso parece mais conveniente para mim. Então eu vou adicionar faixa, propriedade,
faixa, árvore de animação, escolher o perímetro. O perímetro está ativo de salto duplo. E agora precisamos definir um quadro-chave para isso. Então aqui em 0.3 segundos quando esta animação estiver concluída, clique com o botão direito do mouse na tecla Inserir, e ele já está indo padrão para desativado. Então, basicamente, neste ponto no tempo, ele está tomando o perímetro, o salto duplo ativo, e definindo isso como falso, indicando que a animação está feita. Então, depois disso, há um tiro será falso e ele vai voltar para a mistura três para escolher o que deve ser a saída. Então, se tudo correr bem, isso deve ser tudo o que precisamos fazer para acertar essa chance. Vamos tocar no Play e ver onde estamos. Ok, animações para trabalhar com salto e lá está o nosso salto duplo funcionando muito bem. Uma coisa a observar, a forma como o código atual é escrito, um jogador pode saltar até duas vezes antes de tocar o chão. Então, se você realmente cair aqui, isso não conta como um salto. Então, se eu cair e fazer um salto duplo, podemos realmente fazer saltos duplos no ar. Claro, só vai jogar uma vez se o primeiro salto duplo ainda estiver em execução. Vamos ver. Ok, mas sim, se a animação estiver terminada e você fizer o segundo salto de seta, então ele fará aquela segunda animação lá. Então, é só algo para pensar. Você pode querer que seu personagem seja capaz de fazer isso onde, independentemente de como ele entrou no ar, você pulou duas vezes ou você pode querer que ele seja limitado que um personagem só pode fazer um salto duplo no ar, ponto independentemente de ter caído da borda ou saltado para o ar. Nesse caso, você pode configurar uma variável como se o salto duplo ocorreu. E se isso for falso, então permita o salto duplo. E uma vez que você entra salto duplo, configurá-lo para verdadeiro e só redefinir que quando o, quando o personagem atinge o chão. Caso contrário, você pode realmente gostar quando você personagem pode saltar duas vezes independentemente, pode fazer sentido para alguns jogos. Então, apenas algo para pensar, mas basicamente para este vídeo, fazer a animação para ser reproduzida como um tiro único parece estar funcionando. Então, acho que estamos bem aqui.
16. Pathing para venido Porz porco: Em seguida, vamos criar um inimigo para o nosso jogo de plataformas. Então vamos usar a arte para um porco furioso para isso. E eu vou abrir arte, pixel adventure para inimigos. E lá temos nossos personagens diferentes. Então, podemos clicar em qualquer um deles e ver basicamente uma visualização das diferentes animações no canto superior direito. Então, para criar nosso novo inimigo, será parecido com a criação de objetos de nosso jogador. Então precisamos criar uma nova cena. E a raiz dessa cena é claro que vai ser um corpo cinemático 2D. O que significa que como ele se move vai ser algo que temos que escrever em configuração para nós mesmos em um script. Então vamos para cena e nova cena. E, em seguida, para aqui, Vamos outro nó e, em seguida, corpo cinemático 2D. Então, para este corpo cinemático, vamos clicar duas vezes nele. E podemos ver que é basicamente centrado na visão da cena na posição 0, x e 0 y. Isso é o que queremos. E vamos adicionar um sprite animado a ele. Então adicione nó filho e, em seguida, sprite animado. E mais uma vez, a razão pela qual estamos usando sprites animados é porque para o pacote SART, todas as animações são divididas em suas próprias texturas retas individuais. Assim, sprites animados nos permitem usar texturas separadas para diferentes animações. Muito mais fácil do que seria com um nó sprite. Vamos pegar o sprite animado e eu vou criar algumas animações para ele. Vamos para o lado direito. Então quadros ou pressione o botão vazio e clique em Novos quadros sprite. Vamos abrir isso. E então temos nossa janela de animações aqui na parte inferior, vamos colocar tudo como padrão para 20 FPS. E vamos renomear a primeira animação para ociosa. Então, vamos clicar neste botão aqui que se parece com uma grade para eu adicionar quadros de folha de sprite e vamos para arte, pixel aventura para inimigos, porco
irritado, e um ocioso. Então podemos contar rapidamente quantos quadros estão aqui. Tenho nove. Então, nove para horizontal, vertical
e, no lado direito, selecione Limpar todos os quadros, adicione quadros. E se estivermos jogando, devemos ser capazes de ver nossa pequena animação ociosa lá. Então agora só precisamos repetir isso para as outras animações. Então vamos adicionar uma animação de execução. E correr levará, é
claro, os quadros de execução. Então vamos ver 3, 6, 9, 12. Então 12 horizontais, um vertical. Selecione todos adicionar e fazer este talão 20 FPS. Então vamos adicionar isso do personagem. Isso parece cerca de 16 por um, ou selecione todos adicioná-los. E nós podemos apenas testar que ele está funcionando fazendo uma reprodução automática nessa animação. Apenas certificando-se de que tudo parece centrado corretamente. Então deve ser bem óbvio. Ok, em seguida, vamos adicionar acertar um e acertar 2 para quando o inimigo receber dano. E isso parece cinco quadros. Selecione Limpar tudo. E então precisamos fazer 20 FPS. Ok, parece que estraguei tudo adicionando. Então vamos excluir todos os quadros e ter certeza que ele é atingido um por um horizontal, um vertical, e adicioná-los em. Certo, isso é o que deveríamos estar vendo. Agora vamos adicionar em dois. Então eu vou adicionar a mesma coisa por quadros. Então, cinco horizontais, um vertical, adicione-os e certifica-se de que o FPS é 20. Então podemos ir entre nossas diferentes animações e tudo deve ser jogado sem problemas. Então a próxima coisa que vamos precisar fazer é determinar como esse personagem vai se mover. Então, a minha ideia para este porco furioso e o que é realmente renomeá-lo lá e guardá-lo como uma nova cena. Então porco irritado, ou salvá-lo em personagens, porque podemos criar uma pasta inimigos aqui apenas no caso de acabarmos com um monte. E então porco raivoso viu mais, guarde lá dentro. Então meu conceito para esse personagem de porco vai ser que por padrão ele vai andar entre duas pesquisas diferentes waypoints,
então ele só pode se mover para a esquerda e para a direita. Sem movimento vertical, pelo menos sem gravidade. E se um jogador é detectado,
então, em vez de andar, ele vai mudar para uma corrida irritada. Então nós colocamos isso em execução mais tarde, aumentar a velocidade de movimento do personagem. E se o inimigo aqui corre para o jogador, então o jogador vai sofrer algum dano. E esses serão basicamente os hábitos para os porcos zangados. Então, um inimigo muito simples aqui. Então eu vou colocar o estado padrão de volta em ocioso. E podemos adicionar um script a esse personagem. Então eu vou apenas clicar com o botão direito Attached script, e isso será chamado Angry pig dot h gd. Então, por agora, isso só vai estender o corpo cinemático 2D. No futuro, podemos querer usar herança para ter um script inimigo base, e então outros inimigos podem herdar
disso e, basicamente, ganhar algumas das funcionalidades básicas. Então não precisamos escrever isso em todos os inimigos. Mas por agora vamos colocar tudo no porco furioso. E então, se precisarmos levá-lo para uma classe inimiga de nível superior mais tarde, então faremos isso separadamente em um vídeo diferente. Então, agora, para o movimento que eu falei, nós vamos ter que criar algum tipo de ponto de caminho para o nosso personagem. Então, se você ainda não fez, Vamos em frente e salvar a cena como uma pasta sênior e Inimigos. Então eu vou subir aqui, Salvar Cena As. E eu estou colocando em personagens, inimigos, como você pode ver aqui. Além disso, certifique-se de que o script foi salvo na mesma pasta por motivos de organização. E agora vamos para o nível 1. E vou deixar aqui uma cópia do inimigo. Então, para que nosso personagem se mova, vamos ter que dar a ele alguns pontos de passagem, a fim de avançar em direção. Então, há algumas maneiras de fazermos isso. Eu acho que o que pode fazer sentido é criar alguns pontos de passagem dentro deste nível que nossos inimigos podem usar como um ponto para se mover e, em seguida, atribuí-los como uma lista. Sempre que criamos uma instância do nosso objeto, só
podemos atribuí-los aqui em uma matriz para qual posição deveria ter se movido. Então, no nível eu vou clicar com o botão direito aqui em cima e eu vou adicionar um novo nó. Então vamos começar com o nó 2D como aparente, porque queremos que esta lista de waypoints se
mova junto com o nível se alguma vez nos movemos para a posição de níveis por qualquer motivo. Então eu vou chamar isso de waypoints. E, em seguida, pontos em andamento, vamos adicionar alguma posição dois D's. Então, para estes, eu acho que eu posso apenas renomeá-los waypoint um e, em seguida, duplicá-los algumas vezes e nós vamos apenas obter waypoint 1, 2, 3, assim por diante e assim por diante. E ele tinha apenas se certificar de que você está arrastando-os por aí, mas eles não são filhos um do outro, então eles deveriam ser coisa deles. E então podemos configurar o local para esses waypoints quando estamos
olhando para essa pilha de objetos e queremos ter
certeza de que estamos movendo o que selecionamos. Você pode manter Alt pressionado. E então isso vai garantir que o waypoint um seja eleito e movido porque temos waypoint um aqui em cima. Então, se segurarmos Alt, pegamos o certo. Vamos adicionar um waypoint. Vamos apenas dizer bem ali. E então vamos ao waypoint 2. E nós vamos apenas arrastar isso para fora da pilha dois bem ali. Então nosso personagem será capaz de andar para frente e para trás entre lá e lá. E então vamos pegar 0,3. Não há necessidade disso ainda, mas talvez para o futuro haja mais relevante e eu vou colocá-la ali. Então agora nosso porco irritado vai precisar de uma lista de posições hoje costumava ser seus pontos de passagem. Então vamos abrir o script e vamos criar uma exportação longe. Então isso vai ser uma matriz de posição 2D e vamos chamá-lo var waypoints. Vamos tentar salvar isso. Ok, então ele realmente não parece que usar uma matriz
do tipo de nó 2D posição vai funcionar para nós. Então, outra alternativa e minha cabeça é usar o caminho do nó aqui. Portanto, nenhum caminho vai ser o caminho relativo é um nó. E, em seguida, quando o jogo está realmente em execução, podemos obter o nó do caminho do nó e, em seguida, obter a posição desses nós no mundo do jogo enquanto o jogo está em execução. Então, neste momento, devemos ser capazes de aumentar o tamanho do nosso array aqui à direita e, em seguida, atribuir os diferentes nós. Então queremos waypoint 1 e, em seguida, waypoint 2. E então será isso para este personagem. Então agora no script Pig irritado, precisamos ter certeza de que quando o jogo está correndo, que nosso personagem está se movendo para frente e para trás entre esses dois pontos. E vai começar com o primeiro waypoint. Então nós devemos ter uma variável aqui para manter o controle de qual waypoint ele está. Então vamos fazer var waypoint index. E isso vai começar em 0, o que vai significar o primeiro waypoint na lista. E assim, além disso, podemos ter uma posição de ponto de passagem. Então, estas serão as coordenadas XY para onde este ponto de passagem está. Então só precisamos pegá-lo uma vez. E então toda vez que a função do processo físico está em execução, ele pode simplesmente mover-se em direção a essa posição até chegar a essa posição. Falando nisso, não vamos usar o processo ponto-ponto. Mais vai querer função física processo dot delta. Então, vamos passar isso por agora. Então, quando o jogo começa, Vamos realmente ir em frente e obter a posição do primeiro waypoint. Então nós vamos fazer em pronto para especificar que quando o jogo começa, algo vai acontecer aqui, ou mais especificamente, quando o script começa, que é presumivelmente quando este personagem é carregado para o nível. Então, a posição waypoint, nós vamos estar fazendo um nó get e nós vamos ter a matriz waypoints. Então lá em cima. E nós vamos precisar colocar no índice que estamos tentando obter. Então índice waypoint no início deste jogo, Assumindo que este índice waypoint é 0, isso você obtém o nó naquele local. Então, depois de obtermos o nó, vamos apenas precisar da posição desse nó. Então vamos colocar isso aqui e nós poderíamos ir em frente e testar isso fazendo uma impressão na posição waypoint, então nós podemos lançar este nível com aquele porco raivoso nele. Então, atualmente, o porco irritado não tem formas de colisão, mas isso deve ser bom para agora. Então vamos em frente e aperte o play, ok, e podemos ver que estamos realmente recebendo a posição desse waypoint, o que é bom. E nós podemos realmente transformar isso em uma função que podemos usar toda vez que precisamos para obter e definir a nova posição waypoint, nós poderíamos realmente torná-lo um conjunto de funções. Então vamos definir ponto de onda, eu acho que vou dizer índice. E então faremos essa função aqui embaixo. Então conjunto de função, índice de ponto de passagem. E, claro, estaríamos passando o valor do novo índice. Então o índice waypoint vai ser igual a esse valor. Mas então nós também vamos dizer que posição waypoint. Bem, basicamente só esta linha aqui em cima. Então vamos colocar isso lá e, em seguida, substituir o valor pelo índice waypoint neste ponto, dizendo isso ou aquilo seria o mesmo aqui. Mas agora vamos apenas usar o valor que foi passado para esta função apenas no caso. Então agora sempre que dissemos o índice waypoint, também
definimos a posição waypoint. Então eu acho que nós poderíamos realmente ser capazes de apagar isso, fazer isso um var honorário. Então, quando o jogo
é carregado, ele vai definir o valor como 0. E podemos nos livrar dessa parte, já que isso já vai ser atribuído. Teoricamente, isso deve ser um vetor para, eu acredito, e vamos em frente e ver se isso funciona. Então vamos ver se chegamos a este ponto quando o jogo for lançado. Agora que esta função está lá, nós podemos realmente ter este bit removido e nós não precisamos que isso seja um íon pronto. Mas o que podemos realmente fazer e não remover isso também. Vamos apenas ter quando o jogo começa aqui, e vamos apenas definir o índice waypoint para o valor inicial. Então, digamos ponto de partida. E nós poderíamos realmente fazer disso uma exportação longe. Então eu vou fazer esta exportação e var waypoint inicial. E nós vamos padrão que para 0. Então agora no script começa, ele vai começar o índice waypoint fora em qualquer ponto de partida é. E como resultado de vender isso, ele também vai definir a posição waypoint. Ok, então nós realmente precisamos colocar auto-ponto ponto ponto ponto ponto ponto ponto índice aqui para ter certeza de que funciona corretamente. Certo, e agora chega aqui. Então ele está dizendo inválido get index, é
claro, porque eu defini isso para cinco para testes. E agora podemos controlá-lo com o ponto de partida. E esse valor pode ser definido aqui. Então, se você quiser que o porco irritado não se mova para o primeiro waypoint, mas o segundo waypoint, você poderia apenas especificar a posição da matriz aqui e decidir a partir disso. Basicamente, sempre que
mudamos o índice waypoint, nós também vamos mudar a posição waypoint também. Então agora só precisamos configurar e mover a velocidade
e ter certeza de que o personagem está se movendo entre esses dois pontos. Então vamos subir aqui e criar uma variável de velocidade de movimento. Então eu vou fazer o fluxo de exportação, barra move velocidade, e eu vou apenas arbitrariamente definir isso para 200 por agora para o futuro. Vamos também, enquanto estamos nisso, adicionar uma velocidade de corrida. Então esta seria a velocidade rápida quando o porco irritado é realmente irritado para correr velocidade e 300. E agora fazendo o processo de física, queremos que o personagem se mova entre esses dois pontos. Então vamos precisar olhar para a direção entre
o personagem e o waypoint atual. Então, é claro, como acontece com muitas coisas, há algumas maneiras diferentes de fazermos isso. Então vamos começar por obter a direção entre o personagem atual, porco irritado, e o waypoint. Então eu vou fazer uma direção barda. E então vamos fazer a auto-posição. E então para esse vetor, vamos fazer a direção dois. E então precisamos dar outro vetor. Então, é claro, precisamos da posição de ponto de passagem, ok? E agora que temos uma direção, também
podemos obter a distância. Então vamos realmente fazer a distância x porque nós
só realmente nos preocupamos com a distância horizontal, não incluindo o quão longe ela está verticalmente, porque nosso personagem nunca vai estar pulando para cima. Então vamos usar o valor absoluto de auto posição x e, em seguida, menos o valor absoluto de não-auto posição x, mas a nossa posição ponto x. Então esta deve ser a distância entre os dois pontos, sem contar para direção, e então esta seria a direção. Então o que vamos fazer é se distância até
o waypoint estiver acima de um certo limiar, então vamos continuar nos movendo em direção a esse waypoint. E se estiver abaixo desse limiar, vamos mudar para o próximo ponto de passagem e algo para se mover. Então, se a distância x é maior, e poderíamos dizer maior ou igual, então. E poderíamos chamar isso de algo como waypoint, limiar são realmente waypoint chegou distância. Acho que faz um pouco mais de sentido na minha cabeça. Então, se a distância é maior do que a distância do ponto de passagem chegou, então vamos nos mover em direção ao waypoint. Senão. Vamos trocar pontos de passagem. Então vamos colocar o ponto de passagem a distância aqui em cima. Então o fluxo de exportação, nosso ponto de passagem chegou à distância. E eu vou criar isso como 10 por agora. Então, para avançar em direção ao ponto de passagem no início, temos que obter uma velocidade. E nós poderíamos realmente fazer isso uma variável aqui em cima, é que precisamos referenciá-lo em outras funções. Então a velocidade será igual a um vetor dois. E o valor x vai ser a velocidade de movimento vezes o seno da direção ponto x. Então, independentemente do que esse valor exato da direção é, nós só nos preocupamos se ele é positivo, negativo ou 0. Então, basicamente, assine ou converta isso para um positivo. Negativo um ou 0, o
que significa que a velocidade de movimento será consistentemente ou positivo 200, negativo 200, ou 0. E então vamos adicionar uma vírgula lá. Então o segundo valor será uma gravidade. Mas eu acho que por agora, nós só vamos na verdade, nós podemos apenas apenas olhar para os roteiros do player. Então vamos usar esse mesmo tipo de coisa. Vamos ver. Vou copiar toda esta linha aqui. Então a velocidade atual e nós adicionamos a gravidade, mas nós o tampamos na velocidade terminal. E isso será apenas consistente entre o jogador e os outros inimigos no jogo. Então, basicamente, paramos com isso aí dentro. E agora nosso personagem tem gravidade baseada nas configurações do jogo. Ok, então vamos mover e deslizar nosso corpo cinemático. E vamos movê-lo com a velocidade. E queremos dizer vetor dois pontos para cima. Provavelmente não serei muito relevante para um inimigo como este. Mas se precisarmos verificar se o corpo cinemático está no chão, então ter a direção subida definida será importante. Então, é melhor ter isso do que não tê-lo, eu acho. Caso contrário, queremos trocar pontos de passagem. Então temos que descobrir para que ponto estamos mudando. E para saber que temos que saber o tamanho do array, basicamente quantos waypoints estão atualmente nele. Então, apenas no caso de isso ser algo que mudaria durante o jogo, eu acho que vamos obtê-lo uma vez cada vez que chegar a este ponto. Então vamos encontrar o tamanho dessa matriz. passagem entorpecidos, pontos de passagem, tamanho dos pontos. E, e então vamos verificar o índice atual. Então, se o índice waypoint é menor do que o número de waypoints, então nós vamos aumentá-lo. Então o índice waypoint é igual a mais igual a 1. contrário, se o índice de waypoint é realmente igual ou acima do número de waypoints, então precisamos reiniciá-lo de volta para 0. Então o índice waypoint é igual a 0. E então este bit nos permitirá percorrer os waypoints. Uma coisa vamos precisar de nós para inicializar esta variável de velocidade para um vetor para 0. Ok, então isso significa que isso vai começar com os valores que são 0. E também nosso personagem realmente vai precisar ter uma forma de colisão para qualquer uma dessas funções físicas como movimentos, como trabalhar nele. Então vamos em frente e adicionar uma forma de colisão à picareta irritada. Então colisão em forma 2D. Ok, e vamos salvá-lo. Vamos fazer uma forma retangular. Mantenha-o agradável e simples. E então vamos aumentar o tamanho desta forma de colisão para que ela possa interagir com o solo. E eu vou aguentar, esticar um pouco. E eu vou entrar na transformação e ajustar sua posição para baixo alguns pixels. Vou ser muito importante que esta forma de colisão igual à posição dos pés no chão. Então vamos realmente jogar aqui. E podemos ver que o porco furioso foi capaz de se mover para esta posição esquerda. Então está se movendo corretamente e deslizando ao longo do chão. O sono de colisão parece ser bom. Tem o pixel certo, bem acima do solo. Então está tudo bem. E agora temos que descobrir, por que não mudou para a segunda posição? Este porco furioso tem duas posições aqui. Então eu vou definir um par de pontos de interrupção. Sempre que o índice de waypoint muda. Vamos tocar no Play e ver o que aconteceu. Ok, então chegamos aqui onde o índice de waypoint aumenta em um. Então vamos mergulhar nesta próxima função. Certo, não estamos usando o índice de waypoint autoidade. Então precisamos fazer isso ou a função setter para realmente acionar lá. Então agora podemos tocar no play e ver se isso vai funcionar. Ok, obter índice 2 inválido no array. Então não deveria ter chegado aqui com dois se o índice waypoint é menor que o número de waypoints. Ok? Então deve ser o número de pontos de passagem menos 1, ok? Porque esta é uma contagem e, em seguida, esta é uma posição de matriz. E lembre-se que começa misterioso a partir de 0 e a contagem começa a partir de um. Então precisamos colocar um menos um lá para ajustar para isso. Então, agora, se batermos fluindo, nosso personagem deve ficar bem. Então, olhando para o código, o porco fica preso aqui. E então, como podemos ver, ele está constantemente mudando entre o primeiro e o segundo waypoint. Ok, então aqui podemos ver no código que esta parte aqui não está funcionando. Então podemos ver aqui em baixo que quando o primeiro ponto é alcançado, ele muda para o segundo waypoint. E então essa distância x é um negativo 173. Então nós não queremos que isso nunca seja negativo, então ele vai um pouco longe de fazer isso seria realmente
obter dois vetores e compará-los com a distância para funcionar. Então vamos fazer um vetor dois do ponto self.position x. e vamos dizer 0 para o y. Vamos fazer isso para ambos os vetores,
fonte uma distância dois e, em seguida, vetor de perímetro para posição de waypoint x e, em seguida, 0. Ok, então nós realmente precisamos ponto ponto ponto ponto ponto x. Então, quando fazemos isso desta maneira, basicamente estamos criando dois novos vetores e o valor y é o mesmo. Então a única coisa a comparar será as posições x desses dois vetores. E uma distância dois vai ser direção inespecífica. Então, quando fazemos isso dessa maneira, devemos obter um valor de mais 173 em vez de um negativo. E nós poderíamos realmente, bem, nós realmente não precisamos, nós podemos apenas meio que tocar Play. E veja se funciona. Então vamos tocar, ok, e agora podemos ver que nosso personagem está realmente se movendo entre os dois pontos. Então é basicamente isso que queremos. Quero dizer, isso está se movendo muito rápido. Então, talvez eu queira recusar isso de forma bastante significativa. Então vamos para a velocidade de movimento, torná-lo 100, que correr velocidade 200. E também, uh, nós queremos virar a direção daquele porco furioso. Então, quando ele está se movendo para a esquerda, nós viramos para a esquerda e um está se movendo para a direita, nós
viramos para a direita para que possamos fazer isso
no código muito facilmente como estávamos fazendo isso antes. Então acho que podemos dizer aqui em baixo, se vamos fazer um movimento, então podemos mudar a direção. Então vamos ter acesso ao sprite aqui em cima, e vamos fazer nosso sprite animado igual a cifrão animado. Então isso é referenciar isso aqui. Ele não precisa do mal preparado na frente dele. Então sprite animada ponto h vai ser verdade em uma condição. E essa condição vai ser se o sinal da direção x. Então devemos fazer uma variável para isso. Então var direção x seno é igual a sinal Direção ponto x. agora podemos colocar isso aqui e bem aqui. Se este for, se este for negativo, então vamos invertê-lo. Então, se for negativo, então isso significa que vamos para a esquerda, o que significa que queremos virar essa horizontal brilhante. Se o seno é um, então isso significa que estamos indo para a direita, o
que significa que queremos desligá-lo. E estamos assumindo atualmente que o sprite está voltado para a direita por padrão. Caso contrário, isso seria inverso. Então, se o personagem está se movendo para a esquerda, então ele está virando para a esquerda. E se ele está se movendo para a direita, então ele está voltando para o padrão, sem virar. E se ele não está se movendo onde a direção x seno seria 0, então nós não estamos controlando a viragem porque se ele não está se movendo, então nós realmente não deveríamos estar mudando a direção. Então agora podemos ir em frente e reiniciar o jogo. Mas C, Ok, então o flipping funcionando, exceto que é em sentido inverso. Então deixe-me dar uma olhada lá. Eu acho que este é um caractere de frente à esquerda por padrão. Então o que poderíamos realmente fazer é colocar nossa exportação booleana apenas no caso de estarmos fazendo um novo personagem ou os sprites alterados, gostaríamos de ser capazes de definir a direção invertida padrão. Então aqui em baixo podemos dizer rostos, certo? E, e o inverso das faces bem aqui em baixo. E vamos parar de novo por dinheiro. Então, se o sprite estiver virado para a direita por padrão, então queremos desligar a viragem enquanto ele está virado para a direita. E se ele não estiver virado para a direita por padrão, então se isso for definido como falso, então rostos amados por padrão, então isso vai ser falso e nós não queremos invertê-lo. Então, basicamente, desde que definamos esse booleano para o valor certo, o personagem deve enfrentar a direção certa quando ele está se movendo. Então estamos desligando rostos, certo? Vamos tocar no Play. Podemos ver que a nossa instância do porco é capaz de ir entre os dois waypoints. Está funcionando em geral. Há, obviamente, alguns problemas como correr para o jogador e ficar preso lá. Nós provavelmente não queremos realmente que haja uma colisão difícil com o jogador, mas sim apenas talvez causar dano ao jogador e depois passar direto por ele. E também precisamos adicionar e o estado de corrida irritado e também certificar-se de que ele está animado corretamente. Tudo isso vamos fazer provavelmente no próximo vídeo ou dois.
17. A animação de estado irritada, camadas de física e detecção de área inserida em área: Então, neste momento, há alguns ajustes que eu gostaria de fazer para o porco raivoso. Primeiro, ele precisa ter algum tipo de zona de
detecção para que quando o porco irritado realmente vê o jogador, que ele pode mudar para o seu modo de corrida irritado e mover-se mais rápido. Em segundo lugar, como você pode ver, atualmente, nenhuma dessas animações está sendo reproduzida. Então vamos ter que montar uma árvore de animação para o porco irritado. E nós também precisaremos armazená-lo,
configurando camadas físicas para que quando o porco irritado correr para o jogador, ele não vai realmente parar o corpo da física de se mover assim para frente neste jogo, nós vamos fazê-lo para que o jogador e inimigos podem se mover um pelo outro, é claro, ainda ser capazes de causar dano uns aos outros, mas vamos precisar configurar isso começando a usar camadas físicas. Então, podemos não deixar o porco colidir com a camada do jogador, mas pode haver uma caixa danificada no porco, que detectará se ele pode causar dano ao jogador e em seguida, causar dano ao jogador quando o jogador entrar nessa zona específica. E assim que tivermos a configuração do porco irritado com a árvore de animação também precisará de
script para fora os estados e código para que corresponda com. E é isso que vamos tratar neste vídeo. Então vamos entrar na cena do nosso porco furioso. E eu vou adicionar uma nova área a ele. Então eu vou adicionar um nó filho e estamos procurando uma área para d. Então nós podemos apenas digitar isso na edição de pesquisa. E esta área 2D vai precisar de uma forma de colisão própria. Então eu vou clicar com o botão direito sobre ele, adicionar uma coalizão em forma de 2D. Então isso pode ser o que você quiser que seja. E esta zona vai basicamente detectar quando o jogador está próximo para que o porco irritado possa entrar em seu estado de raiva e enfurecido. Então eu vou renomear a área 2D zona de detecção de raiva porque eu acho que isso só faz um pouco mais de sentido aqui. Ele fará com que o personagem entre nesse estado mesmo que o jogador esteja diretamente acima da cabeça. Então, na verdade, vou usar uma forma oval. Então, à direita, onde temos Inspetor, vamos mudar a forma para a forma da cápsula. E então eu vou girá-lo 90 graus porque eu quero que ele seja mais largo que alto. Então vamos para a transformação 90 para os graus de rotação. Ok, e então vamos expandir isso para uma quantidade razoável para que ele possa ser basicamente tão grande ou tão pequeno quanto você quer que seja. E como você joga teste, é
claro, você vai querer ajustar isso. Você pode até ter um tamanho de zona personalizado para diferentes variações do inimigo, ok? E para este detecções irritadas na área de dois D, eu vou desligar problemas de monitor porque eu realmente
não preciso que esta zona seja detectada por qualquer outra coisa no jogo. Só precisamos de monitorização, porque esta zona vai verificar o jogador, mas nada precisa de verificar o seu cuidado com esta zona. Então, parece inútil tê-lo ligado. E, na verdade, por que usar recursos extras quando não precisamos. Então é por isso que estou deixando isso de lado. E agora podemos criar um gráfico de nó para uma árvore de animação neste porco furioso. Assim como o jogador, vamos ter que clicar com o botão direito do mouse e adicionar algumas notas. Então vamos adicionar uma árvore de animação. E, em seguida, vamos também adicionar em uma camada de animação. Então este player de animação vai ter toda
a configuração de animação que corresponde com nossas animações no sprite animado. Então vamos criar hit um. Então vamos criar hit um, bater em Idle, correr e andar. Então, na configuração de animação, Vamos fazer novo. Acerte um. E então podemos adicionar uma propriedade Trek. Então a propriedade vai ser animada, animação sprite. E no quadro 0, queremos que ele jogue. Hit um é a animação. E usaremos essas animações como padrão para ser 0,05 segundos de duração e em repetição. Então agora podemos duplicar isso. E, claro, o próximo será atingido dois. Então vamos mudar essa animação para o hit para animação. Duplicá-lo novamente, renomeá-lo. Então fazer Idle, correr e andar animação. Certo, então essa é a configuração da animação. Agora precisamos nos conectar à lógica e a uma árvore. Então, para a árvore de animação, vamos criar uma árvore de mesclagem de nós de animação, assim como o player. Então, a fim de fazer a zona de detecção irritada funcionar, podemos configurar um espaço de mistura um D, que nos dará uma variável que podemos definir para controlar se o personagem deve estar andando ou correndo. Então vamos mudar a variável aqui para jogar são detectados, e isso vai ser como um booleano, ou configurá-lo para um ou 0. E se abrirmos o editor, podemos adicionar os pontos. Então, em 0, queremos que seja uma animação ambulante, significa que o player não é detectado. E, em seguida, em um, queremos que ele seja executado. E apenas no caso, vamos também fazer um negativo uma corrida que também. Mas eu acho que nós vamos ter apenas dois valores, ou 0 ou um. Então, agora que temos a configuração de espaço de mistura simples, podemos conectar isso à saída. Se fizermos 1, obtemos a animação de execução, e se tivermos vários, obtemos a animação de caminhada. Então, agora só precisamos verificar se o jogador é detectado no código e, em seguida, definir o parâmetro nos horários corretos. Então, uma maneira que podemos ter a zona de detecção de raiva dizer ao porco irritado quando há o jogador dentro da zona é usar sinais. Então, podemos configurar um método receptor indo para anotar aqui à direita. E então podemos usar a forma do corpo inserida e a forma do corpo. Excelente. Então eu vou clicar duas vezes em cada um deles e nós vamos adicionar uma zona de detecção de raiva forma corpo inserida no script Pig irritado. E vamos fazer isso por ambos. Portanto, clique duas vezes conectado ao script. Ok, e isso é basicamente tudo o que vamos precisar da zona. Para que as coisas funcionem aqui. Então, quando uma forma de corpo entrou
, deve ser um jogador. E vamos configurar isso com camadas e um minuto. E como um jogo para um jogador, deve
haver apenas um personagem nessa camada a qualquer momento, um ou um 0. Então, podemos apenas definir parâmetros de animação
na árvore de animação, a fim de cuidar disso. Então, se você ainda não tem o on pronto para árvore de
animação é igual a árvore de animação aqui no topo. Você pode ir em frente e configurar isso. E então aqui embaixo podemos fazer ponto de árvore de animação definir o parâmetro. Então vamos fazer parâmetros barra, jogador detectado posição de mistura barra. Está bem? E nós vamos querer definir isso para um. E quando o jogador sair dessa área, queremos definir o parâmetro como 0. Então, selecione tudo isso e cole-o aqui. E nós definimos isso para 0. Agora, se estivéssemos fazendo um jogo multiplayer, poderíamos precisar de um código um pouco mais elaborado porque pode haver vários jogadores. Mas, neste caso, ele vai funcionar perfeitamente bem, porque há apenas um jogador no jogo em um determinado momento. Então isso simplifica para nós. Agora, se formos para a zona de detecção de raiva e o inspetor, podemos configurar suas camadas de colisão. Mas antes de configurarmos as camadas de colisão, devemos definir quais são. Então, no projeto, configurações de projeto que podemos ir para baixo, eu acho que está sob física. Então física 2D aqui embaixo sob nomes de camadas. Vamos escrever alguns nomes de camadas. Então, camada um, os riquenhos fazem o mundo. E então, por enquanto, vamos descer aqui para,
digamos, camada 4 e camada e inimigo. Então temos algumas camadas de configuração. E para cada uma dessas camadas podemos ter um objeto colidir em uma determinada camada, e também podemos permitir que ele seja encontrado por outros objetos olhando para essa camada. Então vamos fechar as camadas aqui. Então temos a opção de camada sob colisão. Então, a camada é onde outros objetos podem detectar este objeto e colidir com ele ou fazer o que eles precisam. Então, para a zona de detecção de raiva, nós realmente não vamos querer uma camada aqui porque não é nada realmente precisa colidir com ela. Só estamos usando isso para desencadear eventos, que basicamente está fazendo o porco correr. Mas a máscara vai estar onde estamos verificando se esses eventos acontecem. Então, para nós, isso não vai ser a camada mundial, que seria apenas configurado como um, mas na verdade vai ser camada estava em Fort, que vai ser a camada de camada. Se clicarmos e clicarmos para trás, ele deve atualizar aqui em baixo. Então você tem trabalho para é a camada jogador. Então, com esta zona de detecção de raiva, estamos apenas olhando para a camada de jogador e isso deve ser apenas um jogador no jogo. Portanto, esse será o único objeto que pode acionar os métodos do receptor aqui para definir o tratamento de animação 21 ou 0
dependendo se precisamos dele para executar ou se precisamos dele para andar. Então, se salvarmos isso, agora só precisamos definir o player como um objeto de camada de jogador. E nós também devemos apenas atualizar o inimigo para ser um objeto de camada inimigo enquanto estamos nele. Então, sob o porco irritado, o corpo cinemático vai para colisão, colisão física corporal. E então vamos mudar a camada aqui para inimiga. Ainda vamos usar solda como máscara. Então eu acho que o que nós vamos definir a camada mundial como é todo o solo, as plataformas, as telhas, coisas que as interações físicas normais devem ocorrer. E assim os corpos cinemáticos vão continuar olhando para
o mundo para que essas colisões ainda possam acontecer como um inimigo, jogador não será capaz de colidir diretamente com este corpo cinemático. E este corpo cinemático não será capaz de colidir diretamente com o jogador porque não estamos verificando bem a máscara do jogador, e eles verificando a máscara do mundo. Então vamos mergulhar no jogador de novo. Então, a cena do jogador, clicamos no corpo cinemático jogador, física, corpo 2D. E mudamos isso de um objeto de mundo para um objeto de jogador. E ele vai estar olhando para a camada mundial para que colisões ocorram. Então, agora, quando executamos o jogo, se eu tiver configurado tudo certo, o porco não deve colidir com o jogador e o jogador não deve colidir com o porco. Mas a zona de detecção 2D deve ser capaz de detectar o player para que ele possa dizer ao script Pig irritado se ele deve estar em execução ou se ele deve estar andando. Então vamos em frente e tocar em Play e ver se tudo isso funciona. Então, atualmente, os jogadores em endossomos, então é apenas andar. Então, pelo menos a nossa animação lá está tocando corretamente. Vamos nos mover um pouco acima dele. E podemos ver que a animação está mudando. Então isso é realmente bom para nós. Agora a última coisa que precisamos fazer é basicamente controlar
a velocidade de movimento para que ele faça um pouco mais do que apenas mudar de cores aqui. Então vamos parar o jogo de correr para lá. E vamos abrir o guião do Pig furioso. Então, nessas propriedades se configuram para a árvore de animação. Também podemos preparar algo para o porco zangado. Assim como o jogador, vamos criar uma enumeração representando o estado que o porco não é. Então aqui no topo, eu vou fazer enums State, e atualmente nós vamos apenas andar e correr. Então aqui no topo podemos criar outra enumeração para o nosso porco furioso, assim como fizemos para o jogador. Então, nossos estados vão ser, eu vou andar e para o estado de corrida, poderíamos apenas chamá-lo de corrida. E isso seria mais consistente com tudo no jogo. Acho que podemos fazer isso. Quero dizer, eu também estava pensando que poderíamos chamá-lo como louco ou irritado, mas talvez se nós apenas chamá-lo de R1, isso vai fazer mais sentido quando nós realmente olhar para o player de animação na árvore de animação também. Então, vamos definir esse estado aqui em baixo. E, claro, precisamos de uma variável para armazenar o estado atual. Então estado variável ou outro estado atual variável. E nós vamos padrão que para o estado caminhada ponto. Desde que o personagem vai estar andando assim que o jogo começar. E isso também faz desses estados capital, uma vez que eles são constantes durante todo o jogo. E o State Dot caminhou até lá. Ok, então agora nós podemos pegar o estado atual e definir isso para executar estado se ele está recebendo esses parâmetros de um valor. Então ele vai estar correndo lá embaixo e a árvore de animação. E então o estado atual é igual à caminhada de dúvida de estado se ele estiver definido como 0. Então, agora esses serão consistentes. E agora só precisamos controlar a velocidade de movimento com base no que esse estado é. Podemos mudar a velocidade de movimento aqui em cima para uma velocidade de caminhada, ok? E então isso ainda será movido velocidade. Mas a velocidade de movimento real que vamos atualizar em cada quadro. Vai ser uma nova variável que criamos aqui. Então isso vai ser um fator dois. E então podemos fazer uma correspondência sobre o estado atual. Então, se combinarmos o estado atual para andar ponto de estado, então a velocidade de movimento será igual à velocidade de caminhada. E, na verdade, isso deve ser um fluxo porque nós só nos
preocupamos com o movimento x e isso deve ser um sublinhado. Então só precisamos da ruína do estado aqui em baixo. E, claro, vamos definir a velocidade de movimento igual à velocidade de corrida. Então agora deve ser muito mais óbvio se o personagem está entrando,
você sabe, meio casual sobre as coisas ou correndo e tentando perseguir o jogador para baixo. Então vamos em frente e tocar play e ver se tudo funciona até agora. Assim, à medida que nos aproximamos do inimigo e podemos ver movimentos ridiculamente rápidos. E à medida que nos afastamos, ele volta aos seus estados verdes. Então há esse tipo de zona arbitrária que assim que o jogador entra, ele desencadeia o porco para se mover muito rápido. Então podemos querer diminuir os números do movimento, mas quanto à detecção,
isso está funcionando corretamente. Então eu vou até aqui e fazer o personagem se mover um pouco mais lento. Então é um pouco mais justo para o jogador.
18. Configuração de Jump ~ Hurtbox e Hitbox: Então, nesta parte, vamos criar
a habilidade para o jogador atacar o inimigo, neste caso o porco irritado. Mas realmente eu acho que nós vamos configurá-lo para que nós tenhamos um script baseado em inimigos que personagens como o porco irritado e outros inimigos podem ser baseados em que nós não temos que continuar redigitando o mesmo código uma e outra vez, basicamente herança. Então, o atacante apenas vai dar a este personagem é a capacidade de saltar em cima de inimigos, causar
dano a eles, e, em seguida, saltar no mais original. Mas vai funcionar por enquanto. Então vamos mergulhar no personagem porco irritado novamente, e nós vamos estar criando uma nova área para d. Esta área 2D é basicamente vai ser uma caixa ferida. Uma área onde quando o personagem cai no topo de se ele entra nessa zona, ele pode verificar se o jogador está no topo e se for esse o caso, causar
dano e fazer um pouco de animação de salto. Então, no processo de configuração,
já que podemos ver que já existem algumas formas de colisão em nosso personagem que podem ficar no caminho. Pode ser uma boa ideia trancá-los no lugar. Então, se clicarmos em uma camada, podemos clicar neste pequeno símbolo de bloqueio para torná-lo para que não possamos movê-los acidentalmente. E eu vou fazer isso com todos esses três. A área para D, a forma de colisão para D e os porcos irritados, colisão corporal
cinemática em forma 2D. Então agora vamos adicionar em uma outra área 2D. Então eu vou clicar com o botão direito do mouse no porco irritado em uma área de nó filho 2D. E então vamos dar uma forma a isso também. Então colisão em forma 2D. E para tornar isso simples, vamos usar uma forma de retângulo. Então esta forma de retângulo vai ser muito pequena e
vai ser posicionada bem aqui no topo dos porcos tinham. Então eu poderia levar a área para D e mover isso para cima. E que também irá mover a localização de formas de colisão também. Ou você pode simplesmente mover a forma de colisão diretamente como você quer obtê-lo lá em cima é bom. Então vamos ver se fazemos 12. Talvez queiramos 12 negativos lá. E vamos apenas aquele negativo 10 parece bom. Então, agora vamos pegar a forma de colisão e ajustar suas extensões para que as extensões Y e apenas vamos querer que seja um. Então podemos ver que esta é uma forma de colisão
muito, muito pequena. E esta área para D, vou chamar uma caixa de salto. E pode mudar o nome desta forma de colisão, forma de colisão de salto. Assim como quando pairamos sobre ele, podemos realmente ver um nome que faz um pouco mais de sentido. Então eu acho que isso pode ser um pouco útil. Certo, agora para que esta caixa funcione, vamos precisar de uma camada de colisão para o hotbox e não acredito que os preparei. Então vamos para as configurações do projeto. E vamos até onde diz física 2D. Então temos camadas para o inimigo jogador mundial, e para ser mais específico sobre inimigo e jogador, estas são as camadas do corpo cinemático. Mas também podemos querer áreas de camada quatro onde certos eventos podem ser acionados, mas não necessariamente para mecânica do tipo de colisão de movimento e deslizamento. Então, talvez possamos dizer mais e sobre a camada 11 terá caixa inimiga, que podemos ou não usar, que seriam os inimigos tentando acertar o jogador ou outro personagem. E depois, além disso, eu poderia criar uma camada de caixa de salto ferido. Então você também pode criar um inimigo genérico HIPAA. Então você também pode apenas criar uma camada de caixa de dano inimigo genérico, que funcionaria bem atualmente. A coisa é que, se o seu personagem acaba tendo vários ataques, você só pode querer cirurgião e torneiras como um salto,
saltar para realmente ser capaz de bater áreas muito específicas e não todas as áreas de ataque potenciais no cuidado. Então, por agora eu só vou ter pulado a caixa dela e esta camada será usada exclusivamente para aqueles ataques de salto. Então aqui em cima, eu não tenho certeza se vamos usá-lo ou não, mas apenas para ser um pouco consistente com baixo, eles também estão criando uma caixa de hit camada caso precisemos mais tarde. Então vamos fechar isso. E esta caixa de salto vai estar, é
claro, na camada de caixa de salto. Claro que não mostrará os nomes corretos até que mudemos para uma aba diferente e voltemos. E agora, se formos até aqui, ok, eu acho que é na segunda fila, nós devemos ser capazes de encontrar e me acertar caixa e, em seguida, saltar caixa ferida. Então vamos tirar todas as outras camadas. E então essa área 2D não vai estar verificando nada. Só vai receber informação, por isso só precisamos de a ter na camada de caixa dela. Não precisamos usar uma máscara para,
para verificar se há entrada ou saída de outras camadas, pelo menos por enquanto. Ok, então agora vamos para o personagem da camada e vamos criar essa caixa de salto. Então eu vou clicar com o botão direito do mouse no jogador e adicionar uma área 2D, ok, e nós vamos renomear essa caixa de salto. E é claro que vamos precisar de uma forma de colisão. Então, a forma de colisão, vamos fazer disso um retângulo. E eu vou me certificar de que a altura disso é uma. E então nós vamos apenas puxá-lo aqui para baixo para o fundo do personagem. E podemos ajustar a transformação na área da caixa de salto, suponho. Então vamos derrubar isso com a posição de transformação. E eu acho que 15 é sobre o que estamos procurando lá. Nós provavelmente também queremos diminuir a largura dele porque os pés do personagem só vão para cerca de aqui. Então vamos mudar o H2, talvez um seis, ok, acho que posso procurar agora. E essa área de caixa de salto 2D vai estar procurando a camada de caixa de
dano de salto , a fim de ver se ele pode acertar o inimigo naquele ponto em causar dano a ele. E atualmente, eu não preciso de nada para verificar a caixa do quadril, então eu estou apenas tirando da camada 1. Assim, ele não será usado em quaisquer colisões apenas
para verificar se há coisas que entram nesta camada, a caixa de salto ferido. Ok, então agora o que precisamos fazer é conectar essa caixa de salto dentro do script do player. Então podemos fazer isso usando sinais muito facilmente. Se você clicar na caixa de salto, podemos ir para a nota. E então vamos querer usar a forma da área inserida porque estamos verificando a caixa machucada, que é uma área 2D. Se estivéssemos procurando por um corpo cinemático, ele usaria a forma do corpo em forma de acidente. Então vamos fazer forma de área inserida. E acho que é o único que precisaremos saber. Assim, o nome padrão do método receptor no salto, forma da área
da caixa de quadril inserida funciona perfeitamente bem. Vamos conectar isso ao script do player. E agora vamos ter isto no fundo. Vou movê-lo aqui para que não fique na seção central.
19. Verificação de salto para tipo Inimigo: Quando algo entra na caixa de sucesso, teoricamente deve ser apenas o inimigo saltar caixas ferir. Mas eu quero ter certeza de que a área que está entrando está realmente ligada a um inimigo. Então o que podemos fazer é verificar esta área e então
podemos ver se o seu dono é de fato do tipo inimigo. Então eu vou fazer var inimigo e, em seguida, Área dot proprietário e estrangeiro instanciado visto que deve nos dar o nó raiz. Então, se eu fosse verificar o que o dono seria quatro como esta caixa de salto. Se eu tivesse um script anexado aqui, iria para o proprietário, que neste caso é o jogador. Então, no porco furioso, o dono desta caixa de salto é o porco furioso, que vai ser do tipo inimigo. Na verdade, vamos ver, já criei o tipo inimigo? Não, eu não tenho. Então faremos isso em um minuto. Então, de volta ao script do jogador, precisamos verificar, é o inimigo na verdade um inimigo. Então eu vou dizer é inimigo,
inimigo , e nós ainda não criamos isso. Então isso não vai funcionar e nós só precisamos basicamente criar o script para isso. Então termine a pasta de caracteres, inimigos. Vou criar um novo script aqui. Vou clicar com o botão direito do mouse aqui, fazer um novo script e vamos chamá-lo de inimigo. E dentro do ponto inimigo GD, isso vai estender o corpo cinemático 2D. Então, o tipo base disso é o mesmo
que porco irritado, o que significa que o porco irritado pode apenas herdar do inimigo ponto g, que vai herdar do corpo cinemático 2D. Assim, obtém toda a funcionalidade do corpo cinemático e também do inimigo. Então, para GD script para declarar isso como um tipo que podemos referenciar sem um caminho. Acho que precisamos do nome da turma aqui e depois do inimigo. Então, é apenas basicamente dando um, se você estava fazendo C mais tipo de como um namespace para este script. E agora no porco irritado ponto h gd, podemos apenas escrever inimigo, por isso se estende inimigo. E esse inimigo é porque nós o definimos para o nosso projeto com esse nome de classe. Agora tudo o que queremos que todos os inimigos tenham pode entrar aqui. Então, por exemplo, porco irritado, eu acho que nós não temos um conjunto de variáveis de saúde, mas este seria um lugar perfeito para realmente colocar isso. Então vamos fazer exportação, porque vamos torná-lo um float var saúde e vai padrão para três. Então, agora, se clicarmos no porco irritado, vamos ao Inspetor, podemos ver que a variável de saúde está aqui. Mas esta variável de saúde, não vem de um porco irritado, mas sim do script inimigo aninhado. Então agora Malloc e o método receptor para a caixa de salto, se chegamos ao ponto em que descobrimos que o inimigo é de fato um inimigo. Então também queremos ter certeza de que ele pode ser atingido no momento porque não queremos acidentalmente acertar o inimigo por qualquer motivo. Portanto, pode haver um tempo de invulnerabilidade, como quando a animação Hit está sendo reproduzida no momento, talvez o inimigo deva ficar vulnerável por um minuto. Então podemos adicionar outra variável ao inimigo, que poderia ser algo como pode ser fechado. Então ponto inimigo pode ser atingido e este será um booleano. E podemos declarar isso no nosso roteiro inimigo. Podemos dizer que a barra de exportação pode ser atingida. E presumivelmente isso seria geralmente padrão para verdadeiro, já que no início do jogo, você quer ser capaz de acertar o inimigo, mas você pode personalizar isso, é
claro, para cada inimigo, vez que essa propriedade apareceria aqui dentro de cada um dos personagens. Então agora, neste ponto, queremos verificar se o personagem está realmente acima do inimigo. Se estamos pulando de baixo e as áreas se sobrepõem, isso não é o mesmo que cair em cima do inimigo. Então podemos verificar quando a área em forma entra, se entra por cima, onde quer que o inimigo esteja. Então, basicamente, para isso, podemos pegar a caixa de salto. E eu poderia realmente fazer mais sentido ter isso como uma variável no topo para ser mais consistente. Então, vamos ter em var pronto, saltou caixa hip é igual ao sinal do dólar. Não cabe na caixa. Portanto, certificamo-nos de que está lá no início deste script em execução. Então, verificamos o ponto da caixa de salto hip. Vamos fazer posição global ponto Y. Então, no mundo do jogo, isso vai ser,
é como posição absoluta, não em relação a nada. Então, se compararmos isso com outra posição global, então podemos ter certeza de que ele está realmente acima da outra posição ou não acima da outra posição. Então, a área dot posição global ponto y. Então esta vai ser a área da caixa de dano e teoria, uma vez que a caixa de salto só pode detectar na camada de caixa de jumper. Então podemos estar razoavelmente certos de que esta área é de fato a caixa de salto ferido. Então, se chegarmos aqui em baixo, então vamos fazer o ataque de salto. Então, para isso, vamos pegar esse personagem é a velocidade, e vamos aumentá-lo com um pequeno salto inimigo. Então eu vou ter uma variável, salto inimigo, impulso, e então nós vamos fazer dano ao inimigo. Então vamos ter esta função ser atingida com uma quantidade de dano. Então precisamos criar duas variáveis lá em cima no topo. Então primeiro, exportação, var, salto inimigo. E eu vou fazer isso menos do que o salto principal, algo como 400 soa um pouco melhor do que nós
também podemos ter outra variável loop. Então isso será dano Dama e eu só vou colocar isso em um. Simpático e simples. Ok, então começamos no ar para baixo seu impulso de salto inimigo, salto inimigo. Acho que o salto inimigo funciona melhor. Certo, isso é o que eu chamei nos roteiros originais. Então isso deve esclarecer o problema. Só temos de ter a certeza de que o script inimigo temos que obter o método atingido. Então, seja atingido. Vamos fazer essa função ser atingida. E isso vai levar uma quantidade de dano, presumivelmente um flutuador. Então, quando o inimigo for atingido, queremos fazer com que ele não possa ser atingido novamente até que tenhamos outra coisa. Diga que pode. No nosso caso, vai ser o fim do hit um ou hit 20 animação que está sendo feito. Então, enquanto ele está jogando a animação Hit, basicamente em vulnerável em certo sentido. Então nós vamos tomar a saúde e nós vamos para menos igual o dano. E então vamos definir pode ser atingido igual a falso.
20. Obtenha a implementação e animações: Agora, no script Pig irritado, queremos criar uma função que podemos executar quando nossas animações de sucesso são feitas. Então vamos criar uma função que a animação terminou. Certo, então quando terminar, queremos definir o acerto igual a verdadeiro. E eu também vou querer retornar o estado do personagem para correr ou andar. Uma vez que é feito de ser atingido, ele deve basicamente retomar sua funcionalidade normal. Então, vamos dizer que o estado atual é igual a ardósia dot run por enquanto. Ok? E isso também é mover essas funções para cá, ok? E uma coisa sobre isso, quando estamos no estado HIT, não
queremos que o personagem seja capaz de mudar seu estado para correr ou andar. A única maneira de deixarmos o personagem voltar para estado
urbano é se esta função terminar. Então, em essência, queremos trancar isso. Então eu vou colocar aqui, se o estado atual é estado ponto caminhada, então ele pode ir para um estado de corrida ou aqui em baixo. Se estiver em execução, pode ir para um estado de caminhada. Quando este parâmetro é definido e o jogador não está mais lá, ele deve começar a andar e quando o jogador entrar, ele deve começar a correr. Mas só quando não está em outro estado como hit. E isso precisa ser igual a sinal. Então agora vamos para o nosso jogador de animação, porco raivoso 2D. Vamos clicar no player de Animação. E vamos adicionar outra faixa para HIT 1. Então nossa faixa vai ser chamada de método, e nós queremos chamar métodos do porco irritado, ok, e nós também precisamos que ocorra no final da animação. Então vamos precisar estender isso. Na verdade, vou estender para 0,5 segundos por enquanto. E quando vamos para o sprite animado, eu vou diminuir o FPS e o vz pela metade para que não demore 0,25 segundos,
mas 0,5 segundos para que toda a animação seja reproduzida. Vamos ver se isso funciona para nós. E agora podemos voltar para o jogador. Portanto, deve levar até aqui para que a animação de 10 FPS termine. Então é aqui que queremos colocar no, esqueceu outro sinal de igual lá também. Ok, então agora para nossas funções rastrear, nós podemos inserir a chave. Animação de sucesso concluída. Ok, agora isso deve rodar a animação lá. Agora também precisamos fazer a mesma coisa com HIT 2. Então vamos fazer isso 0,5, mas a duração, e vamos desligar o loop também porque ele não deve fazer loop. Só deve tocar uma vez e depois voltar a correr. Então, um método de chamada no porco irritado,
e, em seguida, clique com o botão direito aqui em 0,5 segundos, inserir a chave, animação Hit terminou. E agora a nossa função vai funcionar aqui. Então isso deve devolvê-lo ao estado e permitir que ele seja atingido novamente. Então, isso deve ser o que queremos. Então, agora vamos apenas verificar, acertar um e desligar o loop. E mais uma coisa que precisamos na árvore de animação é realmente configurar uma variável de um tiro para que possamos entrar nesses estados de sucesso. Então, vamos clicar com o botão direito do mouse no gráfico do nó e fazer um one-shot. Então este tiro vai ser, vamos chamá-lo de hit. Mas por que não manter isso simples? Então esta é quando a animação Hit vai ser reproduzida. Então, quando esse parâmetro de animação é definido como ativo, ele deve mostrar hit um ou hit também. E podemos fazer disso uma variável aleatória. Mas para que isso realmente funcione, temos que reconectar as saídas. Então vamos tomar esta linha aqui para a saída e jogado detectado. E agora este espaço de mistura 1D deve alimentar diretamente no n como a função padrão. E então isso vai para a saída. E agora só precisamos criá-los. Acerte um, duas animações aqui em baixo. Então clique com o botão direito do mouse em Animação Certo, então no primeiro acertou um, no segundo bateu dois. E agora podemos ir até aqui, clicar com o botão direito e acho que queremos misturar dois, certo? Então, uh, basicamente vai ter dois valores, 01, se for 0, então nós jogamos hit um. E se for um, então jogamos hit dois. Então podemos chamar a propriedade aqui, bater variação. Se ele vem pélvico bater muito asiático. E vamos ligar isto ao tiro. Ok, então agora temos duas variáveis para acertar. Isso vai determinar se nós jogamos hit um ou hit também, apenas para alguma variedade. E então isso determinará se estamos reproduzindo a animação Hit. Então, para os inimigos em nosso jogo, depois de pensar sobre isso, podemos realmente querer que cada inimigo tenha sua própria implementação de ser atingido. Então ainda podemos passar a mesma quantidade de dano para a função de cada personagem. Mas talvez alguns personagens não sofram danos quando são atingidos. Talvez eles se movam um pouco ou talvez alguns personagens não sejam invulneráveis depois de serem atingidos. Então, em qualquer caso, eu poderia realmente fazer sentido permitir que o jogador para dizer ao inimigo sobre como executar esta função, mas ter uma implementação diferente para cada personagem. Então eu vou colocar um sublinhado aqui para tornar isso uma função virtual. E então vamos cortar isso por agora. Então o que vamos fazer é levar isto para o porco zangado. E vamos colocar isso aqui como uma implementação para isso. Voltaremos a isso em um segundo. Então, por agora, se a função é executada e não é uma implementação personalizada, eu vou apenas empurrar um erro. Basta dizer que ser atingido não foi implementado. Então, se em porco irritado ou outro inimigo, eles são atingidos foi criado, ele deve usar esta versão do get hit. Mas no caso de não acontecer, nós só teremos essa mensagem de erro para que nós basicamente agora que nós temos que ir em frente e implementá-lo. Então, para esta versão de ser atingido ou o porco irritado, eu vou fazer isso para que quando ele for atingido, nós entramos no estado de sucessos. E como parte disso, podemos realmente definir essas variáveis aqui na árvore de animação. Então eu vou pegar a árvore de animação e vamos definir os parâmetros. Então o primeiro vai ser perímetros barra hit slash, ativo, e depois o outro, vamos em frente e verificar isso. Então jogador detectado, de modo que vai ser parâmetros barra jogador sublinhado detectado barra 08, não aquele. Variação na verdade. Perímetros de barra de variação de acerto quantidade de mesclagem de barra. Ok? Então, então conjunto de árvore de animação ou seus amadores barra hit sublinhado variação barra mistura quantidade. Então isso vai ser 0 ou um. E nós vamos ter que descobrir isso em um segundo. E então isso vai ser verdade. Então podemos gerar um número aleatório aqui. E para criar um número aleatório, você precisa criar um objeto gerador de números aleatórios, que tem seu próprio construtor. Então nós poderíamos criar um dentro desta classe ou poderíamos criar um cada vez que executamos esta função. Ou o que podemos fazer é colocá-lo em nosso roteiro global de singleton. E, em seguida, sempre que precisamos executar uma função aleatória, nós apenas referimos que configurações do jogo global. Então eu gosto mais dessa ideia. Então, em nosso jogo settings.js, podemos criar uma variável e isso será carregado no início do jogo. Então este será o nosso gerador de números aleatórios. E o que nós só precisamos fazer é gerador de números aleatórios e criar uma nova instância disso. Então, no início do jogo, sempre que ele carregar, nós vamos obter este novo gerador de números aleatórios e nós só precisamos de um e nós podemos usá-lo em todos os lugares. Então, no porco furioso agora podemos adicionar uma nova linha. Então vamos fazer isso. Seleção de anime distante. E isso vai ser igual às configurações do jogo. Nossa referência de singleton Hubble em qualquer lugar ponto, vamos ver, chamamos isso de Jen Rant. E, em seguida, precisamos gerar um novo número para que possamos fazer aleatório int i para int intervalo sublinhado entre 01. Assim, inteiros só podem ser números não decimais. Então isso vai nos dar especificamente um 0 ou um. E podemos colocar isso no valor da árvore de animação. Então vamos colocar essa seleção de enumeração aqui. Então, isso nos dará o nosso selecionado aleatoriamente ou hit uma animação ou hit to animation. Então, mais uma coisa em jogos, settings.js, quando usamos o gerador de números aleatórios para gerar valores aleatórios, por padrão, ele vai realmente usar a mesma semente sempre que o jogo for carregado. Então terá a mesma sequência de, por assim dizer, números aleatórios. Então, se o gerador de números aleatórios fosse usado apenas uma vez para determinar que o personagem foi atingido e qual animação reproduzir, então esse personagem, em teoria,
estaria reproduzindo a mesma animação sempre que o jogo for carregado e esse mesmo evento acontece. Então, para fazer um verdadeiramente aleatório, o que poderíamos fazer é implementar uma função pronta aqui. E então se deve aleatoriar um booleano, então vamos aleatorizá-lo. Então Ran Gen, re-randomize. Certo, então se tivermos esse R1, isso criará uma nova semente para o gerador de números aleatórios. E isso deve nos dar variações diferentes cada vez que executamos o jogo. Então vamos fazer isso uma variável que podemos definir nas configurações do jogo. Visto que TSC e arquivo assim deve randomizar. E isso será padrão para verdadeiro. Então, se alguma vez precisarmos desligar a randomização porque queremos
testar a mesma semente para o gerador de números aleatórios, então podemos simplesmente ir para esta cena e desligá-la no inspetor ou para o lado. Então vamos deixar isso aí por enquanto. Ok, então vamos em frente e jogar aqui e ver onde estamos realmente. Então vamos em frente e jogar aqui e ver onde estamos. Vou saltar para o personagem. Então, primeiro, ele não deveria ter chegado aqui porque estava abaixo da área para começar. Mas também podemos ver função inexistente ser atingido. Isso é porque nós temos o sublinhado lá. Então nós podemos tirar isso já que esta é a implementação final de obter hit este personagem. Então vamos em frente e tocar Play. E agora podemos ver que o personagem está sendo atingido, mas não criamos o estado de sucesso. Então, aqui no topo, vamos adicionar esse estado, estado atingido, Ok, e vamos dar outra chance. Ok, então nós realmente tivemos o salto em cima do personagem. E você pode ver que depois do primeiro salto, na verdade não é possível atingi-lo novamente, ou pelo menos temporariamente. Não era. Outro problema parece ser que o personagem realmente
não morre quando a saúde está abaixo de 0. Então vamos resolver isso rapidinho. Se a saúde é menor ou igual a 0, podemos usar Q livre para remover o caractere. Então, é claro, se você tivesse como uma animação de morte, você pode jogar aquele não dito primeiro e depois Q livre. Mas isso remove a cena da hierarquia. Em outras palavras, remover o inimigo do jogo. Então vamos tocar em Play e ver isso de novo. Então isso é um golpe, dois golpes, três cabeças. Ok? Então isso realmente causa dano ao inimigo. Ok, então parece que o que realmente precisávamos era que a posição global na caixa do quadril deveria ser maior do que a posição global na área. E você pode meio que depurar isso apenas imprimindo a posição global para cada um sempre que você tem uma colisão e ver se os números realmente alinham. Então, agora, se saltarmos para o personagem, ele deve realmente saltar, mas só se estiver no topo. Então vamos ver, vindo de baixo, nada acontece, mas se saltarmos de cima, conseguimos aquele salto. Está bem. E depois há o terceiro golpe. Ok, então isso parece estar mais ou menos funcionando. Vamos testar isso mais uma vez. Parece que perdi a caixa. Está bem. Há isso. Está bem. Saltar por baixo não faz nada, mas podemos pular e bater nele de novo. Ok, então podemos rapidamente marcar a caixa para o personagem. Vamos ver. Então nós temos essa pequena linha aqui em cima. Talvez queiramos fazer a caixa de colisão de salto um pouco mais larga. Eu acho que esse não é o único problema lá, então seremos generosos com isso para que se o personagem meio que atingir o limite deles, podemos ir um pouco mais longe, talvez possamos fazer 13, 14, mesmo quando não. Está bem. Então vamos tocar no play. Teste mais uma vez. Oh, ok. Eu acho que e parece estar funcionando em geral. Outra ferramenta que você pode usar para verificar colisões. Se você for até o menu Depurar, poderá ativar formas de colisão visíveis. Então, agora, se
apertarmos Play, podemos ver diretamente onde estão as formas de colisão. Então, onde devemos bater para que o salto ocorra. Ok. E vamos saltar sobre ele de novo. Está bem. Tudo bem. E mais uma vez. Está bem, isso parece estar a funcionar correctamente para o nosso porco zangado. Então, no próximo vídeo, nós estaremos trabalhando em criar uma maneira para que o porco irritado possa realmente danificar o jogador se o porco irritado correr para ele. Então essa parte deve ser, espero, um pouco mais simples do que
ter que configurar essas caixas de sucesso para saltar e saltar. E os diferentes estados.
21. Adição de estado para jogadores: Agora que somos capazes de saltar sobre um inimigo para causar dano a ele. Ou pelo menos com área de porco irritado, devemos fazer um caminho para os inimigos como o porco irritado para ser capaz de causar dano ao jogador. Então podemos ir em frente e configurar isso agora. Então, anteriormente fizemos uma classe inimiga, que é um script base que o porco irritado e cabelos. Então eu estou nesta classe, nós criamos a habilidade de inimigos serem atingidos. E também todo inimigo tem saúde e a variável pode ser atingida. Então, para que o nosso jogador possa ser atingido por inimigos, vamos precisar configurar algumas variáveis semelhantes ao que fizemos com o script inimigo. O porco irritado herda do inimigo, que significa que o porco irritado tem saúde e deve implementar a função get hit. O que podemos fazer é puxar tudo para cima de outro nível onde qualquer personagem eo jogo terá saúde e deve implementar uma função get hit. Então podemos criar um script para isso. Se formos para caracteres e, em seguida, clique com o botão direito do mouse na pasta, faça um novo script. Então eu vou chamar esse ponto de personagem G, D. E neste script nós vamos apenas extrair essa informação do inimigo, como a variável de saúde. E vamos desistir de tudo, colocá-lo aqui,
e, em seguida, certifique-se de que este é um corpo cinemático 2D, já que cada personagem vai ser um corpo cinemático 2D tipo personagem. Então, agora, se temos o inimigo herdado disso, ele vai ter o valor de saúde novamente. Agora o que eu percebo às vezes é que se você tem muitos nomes de classe
no jogo e você tem um monte de herança acontecendo que às vezes ele recebe erros. Então, em vez de colocar caractere className aqui e, em seguida, estende caractere, o que podemos fazer é apenas cortar este texto e , em seguida, arrastar e soltar o caminho para o script de caracteres. Então, se eles estão apenas arrastando isso aqui, basicamente vai funcionar da mesma forma que se tivéssemos usado o nome da classe e o personagem. Apesar de fazê-lo desta forma, podemos evitar alguns erros que ocorrem com o uso de nomes de classe e Godot. Um problema é que se você mover seus arquivos de script no diretório, isso obviamente causará muitos erros porque este é um caminho para onde ele está armazenado. Então, se o script de ponto h gd do caractere não é mais um na pasta de caracteres, então ele obviamente quando ele tenta
carregá-lo, ele vai lhe dar alguns erros. Então você pode brincar com ele um pouco e descobrir qual método funciona melhor para você. Então nosso inimigo vai herdar do ponto de caráter GD. E isso significa que ele vai ter essa saúde, mas isso também é pegar essa função e colocá-lo no personagem também. Então esse é o personagem vai ser o nosso script personalizado base escrito em cima do corpo cinemático 2D. Então é disso que isto está herdando. E então inimigo é um tipo de personagem. E então porco irritado é um tipo de inimigo. Então, a turma de porcos zangados vai herdar de tudo por baixo dela. Ter tudo em inimigo, e teremos tudo em caráter também. Então podemos manter o inimigo como um script separado, porque como o jogo fica um pouco mais complexo, pode
haver certas coisas que queremos que todos os inimigos tenham, mas não necessariamente personagens como o jogador. Então vamos agora fazer do nosso jogador um personagem. Então eu vou clicar no player e vamos cortar o extensor e apenas arrastar e soltar o script GD ponto personagem. Então estende o caminho para o script que funcionou para nós. Então agora o jogador vai ter uma saúde e nós vamos precisar escrever esta função. Então vamos descer aqui e escrever que eles recebem função hit. Então a função é atingida e nós vamos pegar um valor danificado, que pode ser um flutuador. E as coisas que vamos precisar fazer para sermos atingidos é, obviamente, levar o dano. Então auto-ponto saúde, vai ser menos igual ao dano de valor. E também devemos mudar o estado do personagem. Então nós podemos fazer auto-ponto, estado
atual é igual estado ponto hit, que nós não criamos ainda. Então vamos pegar isso e colocá-la aqui, criando um quinto estado. E então, é claro, temos um método setter para este valor de estado atual. Então, quando isso for executado, o estado atual definido vai acontecer aqui embaixo. Então eu acho que este seria um bom lugar para definir os parâmetros na árvore de animação. É claro que não definimos o parâmetro para o novo tiro em que o personagem sofre dano e tem um pouco de reversão escalonada. Mas podemos ir em frente e digitar isso com antecedência. Então o estado para o qual estamos combinando é, naturalmente, ponto de estado atingido. E quando isso ocorrer, vamos fazer parâmetros de árvore de animação, barra, hit, barra ativa. Assim como com o salto duplo, este vai ser um tiro único. Então é por isso que diz ativo aqui. Vai ser um booleano e vamos torná-lo ativo ou verdadeiro. Então agora vamos mergulhar na cena do jogador. Vamos para a árvore de animação, e vamos configurar isso para HIT. Então, em nosso jogo, quando o jogador sofrer dano, isso terá prioridade sobre qualquer outra animação. Então este tiro deve ser na frente do salto duplo e da hierarquia. Vou clicar com o botão direito do mouse aqui, fazer um tiro único. O nome da variável, assim como votamos no script, é acertado algum bom sobre isso. E agora podemos redirecionar essa saída para aqui. E o único tiro vai para aqui. E quando essas variáveis de acerto estiverem ativas, vamos reproduzir o one-shot, então queremos obter a animação Hit. Então vamos colocar isso aqui e conectar isso ao tiro. Agora, também precisamos ter certeza de que nosso player de animação tem a configuração de animação Hit corretamente e que a animação Hit no sprite animado também está configurada. Então, se clicarmos em sprite animado, podemos verificar hit. E podemos ver isso como oito Frame Animation. Estamos rodando em 20 quadros por segundo. Então isso é importante. Podemos descobrir quanto tempo a animação Hit deve ser reproduzida, 4,05 segundos por quadro. Então isso vai ser um total de 0,4 segundos antes de entrarmos no Animation Player. Mais uma coisa no one-shot, como com o salto duplo um tiro, queremos fazer o fade no tempo e fade-out tempo 0. Temos que fazer isso há um segundo. E isso vai ser muito importante para que a animação seja realmente olhar correto. Agora vamos para Jogador de Animação. Vejamos nossa animação Hit. Podemos ver que está em loop e é apenas 0,05 segundos. Então precisamos desligar o loop e torná-lo 0,4 segundos, porque é o tempo que leva para passar por todos os quadros da animação. E agora, quando o personagem terminar com a animação Hit, vamos querer algum tipo de chamada de volta dentro do nosso script onde basicamente a animação está completa. Então algo deve mudar na classe de jogadores. Ou seja, ele deve retomar um estado normal como ocioso ou andar provavelmente usará ponto de estado AIDL. Então vamos em frente e escrever essa parte do roteiro. E de fato, o que nós provavelmente poderíamos fazer é colocar isso no personagem, já que eu imagino cada personagem no jogo,
desde que você não esteja tendo NPCs de algum tipo que são totalmente imunes a tudo. Eu vou ter uma animação de sucesso de algum tipo. Então você pode colocar isso no jogador, ou nós poderíamos apenas escrevê-lo aqui como algo que deve ser implementado para cada personagem no jogo. Então vamos fazer em, bateu terminou. E nós podemos simplesmente empurrar um erro se ele não for implementado, já que devemos ter nossa própria implementação personalizada dele. Então, no jogador, vamos realmente escrever isso. Então aqui embaixo, podemos fazer a função no hit finalizado. E o que vamos fazer é pegar o estado atual do ponto de auto e vamos definir isso para o estado de ponto ocioso. E se você se lembra, nosso script já está configurado para ir entre estados ociosos e em execução, dependendo se os jogadores entrarem. Então eu estou colocando isso em ocioso deve ser apenas bom para aqui. E agora só precisamos ter certeza de que isso seja chamado para que possamos retomar o estado ocioso. Então, na faixa de animação para o player de animação, certifique-se de ter o player de animação selecionado. Faça Adicionar faixa, método de chamada, selecione o script player, e vá para o final da animação, que é de 0,4 segundos. E vamos clicar com o botão direito do mouse e inserir uma chave, escolher o método que você deseja que ela execute. E este caso vai ser anulado no sucesso terminado. Então vamos clicar duas vezes nisso. Agora, quando chega a este ponto, esta função só vai ser executada automaticamente. Assim, o estado será mudado para ocioso.
22. Detecção de Hitbox inimigas: Agora que nossos personagens basicamente configurados para entrar no estado de animação Hit, nós vamos precisar de uma maneira para o inimigo realmente causar dano aos jogadores, semelhante a como nós temos a caixa de hit de salto para este jogador, nós podemos criar uma caixa de hit para o inimigo que vai procurar o jogador. E se ele encontrar o jogador em tudo ido, esta função get hit. Para podermos saltar para a nossa cena de porcos furiosos. Agora, com a picareta irritada, podemos montar uma caixa de sucesso. Isto vai ser muito parecido com montar a caixa de ferimentos aqui em baixo. Então eu vou clicar com o botão direito do mouse no porco irritado, vou adicionar uma nota infantil, e vamos torná-lo uma área de 2D. Eu vou renomear esta caixa de colisão inimiga, uma vez que esta é a sua capacidade causar dano quando ele apenas colide com o jogador ou um colide com o jogador. E agora precisamos de um 2D em forma para os dólares do quadril. Então eu vou clicar com o botão direito sobre ele, adicionar um nó filho, e vamos fazer a forma de colisão 2D. Tudo bem? Assim como com um monte de outras coisas, podemos simplesmente mantê-lo simples com uma forma retangular. Atualmente, eu não quero acidentalmente ajustado salto caixa ferido, por isso seria bom para bloquear isso no lugar. Certifique-se de que não adicionamos de forma alguma. E agora podemos pegar a forma da nossa caixa de quadril e ajustá-la. Então eu vou dizer que este personagem só pode realmente colidir com o
ajuste do jogador colide com ele bem quando ele está olhando para ele sobre Aqui. Certo, então vamos pegar nossa forma de colisão e encolher um pouco. Então, a grande forma de colisão que será para este porco colidindo com outras coisas, mas nós vamos ser meio generosos com o jogador e apenas dizer que o personagem meio precisa ser bem por aqui sobreposto com o jogador, a fim de realmente causam dano a ele. Então eu vou pegar a forma do retângulo e vamos fazer algo como 77, aperte Enter. E talvez possamos dizer 78, mas então pegamos a caixa de colisão e movemos um pouco para baixo. Então vamos mover isso para lá e podemos esconder temporariamente as outras caixas de quadril para que possamos ver tudo claramente se precisarmos. Acho que pode ficar tudo bem. Talvez eu o mova para baixo apenas mais um pixel e chamaremos de bom para lá. Podemos sempre ajustá-lo mais tarde. Então agora para esta caixa de colisão inimiga, precisamos definir as camadas onde ele vai estar olhando para, para causar dano ao jogador. Então, se quisermos, poderíamos criar uma camada de caixa de dano jogador se quisermos definir uma forma personalizada para onde o jogador pode ser atingido. Mas eu acho que a forma de colisão corporal principal vai funcionar muito bem. Podemos ver isto aqui. Meio que se encaixa muito bem no tamanho do personagem. Então vamos usar essa forma de colisão que vamos olhar. Por exemplo, esta é a forma de colisão para o corpo cinemático. Então, no script, vamos usar a verificação do corpo, não a verificação da área. Então nós não precisamos criar um jogador seu dinheiro, mas se você quiser fazer isso,
você pode ir para o menu do projeto, ir para a física 2D, e em seguida, na Camada 8, pode dizer caixa de dano do jogador, Talvez precisemos disso mais tarde. Então vou escrever isso como uma camada agora. Mas em vez disso, vou mudar a máscara, que é o que a área deve fazer à procura. E mude isso para a máscara do jogador. E eu vou desligar a camada para colisão, já que isso só vai estar procurando o jogador a fim de causar dano a ele. E, na verdade, podemos apenas pegar um monitor de uma tupla e apenas desligar isso completamente. Também pode querer renomear a colisão em 2D à esquerda. Só para sabermos qual é qual. Então eu vou chamar esta forma de colisão inimiga. E eu guardo isso lá. Agora precisamos pegar os sinais dos Hip Hawks e adicionar isso ao roteiro do Pig furioso. Então, com a caixa de colisão inimiga, eu posso entrar aqui para você forma do corpo, e eu vou ligar isso ao porco raivoso. Então, a forma do corpo da caixa de colisão inimiga entrou, vamos tentar causar algum dano ao jogador. Mas a coisa é que um monte de inimigos vão ser capazes de causar dano desta forma, se não todos eles no jogo. Então eu poderia realmente querer tirar isso
do script Pig irritado e nós podemos colocá-lo em GD inimigo e stat. Então os inimigos vão ter a capacidade de causar dano ao jogador
sempre que o jogador entrar nessa área se o jogador não estiver em um estado vulnerável. Então, para que um inimigo cause dano, vamos precisar de outra variável. Então eu vou fazer exportação, digamos colisão flutuante, forma
de colisão, danos de colisão. E eu vou colocar isso em um. Então vamos verificar se este corpo é um tipo de jogador. Então, para a nossa caixa de colisão, o corpo deve ser anexado a um jogador. E podemos ter certeza de que isso vai ocorrer porque em nossa caixa de quadril, a camada de colisão só é configurada para ter a máscara do jogador e os jogadores vão ser um tipo de personagem. Então o que podemos fazer e nosso roteiro inimigo aqui, é apenas atribuído o dano a este corpo, assumindo que é um tipo de jogador. Então ponto do corpo ser atingido, danos de
colisão devem, em teoria, ser capazes de ocorrer uma vez que
os únicos corpos
que vão estar nessa camada no jogo vão ser o jogador. E se não for um jogador, então provavelmente estragamos algo e queremos receber uma mensagem de erro. Então eu acho que tudo bem fazer essa suposição aqui. Por que eles recebem um erro ou foram bem-sucedidos, talvez ele não tenha sido implementado nesse tipo de caractere específico. Mas vamos tentar. Ok, então agora obter hits vai correr. Jogadores implementação disso é que ele vai levar dano e que ele vai definir o estado atual para bater. Vamos fazer uma alteração extra aqui, que é que na classe de caracteres, vamos adicionar um método GET conjunto aqui. Então Set Health. E então podemos dizer função definir saúde, e vamos dizer saúde é igual a valor. Mas se a saúde for menor ou igual a 0, então podemos deixar para mim neste objeto. Então, basicamente, isso só significa que qualquer personagem que cai para 0 saúde é instantaneamente removido do jogo. Talvez mudemos isso mais tarde se tivéssemos algumas animações para removê-lo do jogo, se escrevermos aqui, então é basicamente configurado para todos os personagens. Então, se formos para o porco irritado, por exemplo, não
precisamos ter este Q livre aqui. Podemos apenas fazer auto-ponto Saúde menos é igual a dano. E, em seguida, isso deve executar o método setter de integridade conjunto de caracteres. Vou puxar isso aqui para que fique perto dessa variável. Então vamos em frente e tocar em Play e ver onde estamos. Se encontrarmos o inimigo, a animação será reproduzida por 0,4 segundos. E acredito que estaríamos a sofrer danos, são duas cabeças. E depois de três batidas, a saúde cai para 0. Então o jogador é Q libertado do jogo.
23. Temporizador e adicionar o dano: Isso é tudo tecnicamente funcionando, mas algumas coisas que provavelmente queremos adicionar ao personagem. Em primeiro lugar, se todos os nossos inimigos estiverem colidindo com o nosso personagem desta forma, usando o dano do estúdio da caixa de sucesso. Cada inimigo pode continuar fazendo isso uma e outra vez
toda vez que a forma entra na forma do corpo. Então queremos ter certeza de que o personagem não pode ser apenas sobrecarregado. Portanto, deve haver algum tipo de temporizador de invulnerabilidade para o jogador se proteger. Basicamente, só pode ser atingido uma vez a cada segundo. E isso vai tornar o jogo um pouco mais justo para o jogador como nós adicionamos inimigos extras. Então, se formos para o jogador, podemos clicar com o botão direito aqui na parte superior em um nó filho. E vamos fazer um temporizador. Então este temporizador, podemos apenas ter um segundo tempo de espera por padrão. Então essa será a duração da invulnerabilidade. E vamos verificar um tiro para que quando o temporizador cair para 0, ele não reinicie, ele simplesmente pára. Então poderíamos chamar isso de temporizador invencível ou temporizador de invulnerabilidade, o que você preferir. Vamos abrir o roteiro e vamos fazer referência a ele com febre. Estou pronto se o invencível for igual ao cifrão e ao Vince a tempo inteiro. Então, com este temporizador, vamos querer iniciá-lo sempre que formos atingidos. Então, se você achar o método “get hit “, então podemos iniciar o temporizador quando recebermos o dano. Temporizador tão invencível, ponto de partida. Vou colocar isso aqui. Então, agora queremos evitar que o personagem sofra danos enquanto o temporizador está funcionando. Para que possamos colocá-lo aqui. Então, se temporizador invencível, e há uma maneira de obter se ele está atualmente em execução ou não, mas eu esqueci por um segundo. Então, vamos realmente procurar a ajuda. E você pode usar isso no canto superior direito. Se você precisar procurar detalhes sobre qualquer um dos nós e o jogo. Então, se apenas digitar timer aqui, podemos encontrar temporizador e podemos ver todas as propriedades e métodos sobre isso. Então, queremos verificar se parou. Se ele parou, então ele deve ser capaz de sofrer danos, mas de outra forma não é assim. E jogador ponto GD e nós queremos fazer é parado. Este é um método, então precisamos do parêntese e só se ele parou vamos fazer tudo isso. Então, caso contrário, o temporizador de invencibilidade significa que não importa que o personagem tecnicamente obteve pelo inimigo não vai entrar nesse estado. Esse personagem vai continuar operando normalmente. Ok, então agora se
apertarmos o jogo, devemos ser capazes de limitar a quantidade de vezes que recebemos danos. Então eu vou correr para ele um monte e ver quanto tempo leva para realmente ter o jogador morrer. Então, como podem ver, passei pelo Inimigo muitas vezes, mas o jogador não morreu por pelo menos três segundos. Posso tocar no play e mostrar isso mais uma vez. Ok, Então indo para trás e para frente através do inimigo, e leva um tempo para morrer porque os temporizadores invencibilidade limitando a quantidade de dano para o jogador. Agora uma última coisa é que o personagem pode simplesmente se mover, no entanto quer quando ele leva dano. Então eu não acho que isso se sente tão bem em termos de enfatizar que o personagem deve sofrer danos e meio que ser empurrado para trás um pouco. Então devemos configurar algum movimento personalizado quando o personagem sofre dano para que ele cambaleia um pouco. Então, como podemos fazer isso é aqui em cima em nosso processo físico, esta é nossa maneira normal de se mover, mas queremos ter uma maneira diferente de se mover se o personagem estiver no estado oculto. Então podemos pegar esse código, movê-lo para sua própria função separada. Aqui em baixo, vou chamar esta função de movimento normal. Vai exigir uma entrada. Como você pode ver, esta direção invertida precisa da entrada. E nisso, vamos executar este código. E, na verdade, não vamos definir a velocidade aqui. Vamos apenas devolvê-lo. Vamos fazer uma correspondência aqui em cima. Então, basicamente, em qualquer outro estado, então o estado que vamos nos mover normalmente. Então vamos fazer corresponder o estado atual, e vamos pegar todos os outros nomes de estados. Então estado ponto AIDL, vírgula, ponto de estado, salto ponto de estado, vírgula ponto salto duplo. E em todos esses casos, a velocidade será igual ao que tivermos de volta do Move normal, que leva a entrada do jogador aqui em cima. E agora, no último caso, ou pelo menos o último caso atual, que é o ponto de estado atingido. Queremos uma função de movimento especial, para que a velocidade seja igual ao movimento. E isso não vai precisar de nenhuma entrada porque o jogador vai
ter nenhum controle sobre como o personagem se move neste caso. Então vamos criar essa função aqui embaixo, função fit, mover para escrever um pequeno comentário aqui. Certo, então em movimento, vamos retornar um vetor. Claro, a velocidade. Então vamos precisar de uma quantia e uma direção. Então, para a direção, eu quero verificar para que lado o sprite está virado no momento. E então eu quero ir na direção inversa. Então, se o personagem está virado para a direita, eu quero que a batida de volta seja na direção esquerda. Então vamos fazer uma variável para essa variável, bater para trás direção. E isso seria uma formiga, positiva ou negativa. E se sprite animada ponto flip h. Então isso vai significar que o personagem está virado para a esquerda. Então, nesse caso, queremos que a batida seja para a direita. Então, a direção da batida, vai ser apenas uma. E nos outros casos o personagem está virado para a direita, então isso não vai ser flip h. E isso significa que queremos bater de volta para a esquerda. Então bata para trás na direção. Vai ser igual a um negativo. E agora podemos pegar esse valor de um e negativo e multiplicá-lo por sua velocidade. Então nossa velocidade para a NAACP volta vai ser reduzida velocidade, não aquela colisão esquiada. Eu não sei como você quer chamá-lo, vezes bater para trás direção. E então, para o y, poderíamos ter a gravidade ainda funcionando durante a colisão. Essa seria uma opção. Ou podemos apenas configurá-lo para 0, que significa que se o personagem for atingido no ar, ele vai parar de ter gravidade. Então, para a parte y deste vetor de velocidade, nós poderíamos apenas ter a gravidade padrão aplicada aqui. Ou o que podemos fazer é definir a velocidade y. Ou o que poderíamos fazer é definir a velocidade y para 0, que significa que para que 0,4 segundos para o personagem está fazendo o movimento de
hit, ele vai apenas tipo de fluxo no ar e mover para trás um pouco. É assim que eu quero fazer por enquanto. É totalmente até você sobre como você quer configurar o movimento do personagem. Mas sim, se você não quiser que o personagem se mova verticalmente durante este movimento do quadril, então você pode apenas defini-lo como 0. Então vamos agora criar a variável no topo para a velocidade de colisão de volta. Então a inclinação de exportação longe isso e poderia configurá-lo para algo como 50. Não quero que seja muito rápido. Não quero que o personagem apenas caia facilmente das bordas que acontece de estar perto, isso seria muito irritante. Então, vamos manter um pouco pequeno por enquanto. Ok, vamos em frente e tocar em Play e ver onde estamos. Ok, então vamos descer até o inimigo, ser atingido. Então antes de testarmos o jogador, primeiro, eu vou para o nível 1, clique no jogador e eu vou dar-lhe, digamos como 20 de saúde para que possamos testar sem ter que reiniciar o jogo. Então vamos em frente e tocar em Play e ver onde estamos. Ok, então aqui está o inimigo. Você vai ser atacado. Realmente não tem nenhum movimento. Mas se estamos enfrentando o inimigo, então nós temos que bater de volta e é na direção oposta a que estávamos enfrentando. Então isso é basicamente o que eu quero. Ok, então eu vejo um bug no momento, que é que os personagens e rasgando o estado ocioso e um pouco rápido demais. Então vamos verificar o player e a árvore de animação. Ok, e vamos ter certeza de que tudo está funcionando aqui. Então o único tiro parece estar funcionando certo? O sucesso da animação vai aqui. Então talvez no player de animação, podemos verificar este ponto zero quatro segundos e animação e loop. Ok, então aqui está o que é. A função de estado de piqueniques está em execução mesmo que esteja em estado ponto hit. Eu acredito que a função do “porco próximo estado “corre atrás de tudo o resto. Então nós podemos ser capazes de cortar isso aqui em baixo e, em seguida, apenas tomar o próximo estado e fazer isso correr aqui também. Vamos ver se isso funciona. Então escolher o próximo estado só vai ser executado normalmente se ele está basicamente fazendo esses movimentos tipo normais. Então vamos jogar e ver se isso vai funcionar. Tudo bem? Certo, então um personagem ainda pode se mover. E quando somos atingidos, está sendo batido de volta. Então é isso que estamos procurando. Não queremos nenhuma maneira de o jogador sair
acidentalmente estado de sucesso que não seja a animação que está sendo completamente feita. Então, parece muito bom lá. Ele pode apenas se livrar da depuração de impressão aqui apenas para verificar a velocidade. Uma última coisa que podemos querer fazer é fazer o vetor de direção de reversão 2 em vez de um inteiro. Tecnicamente, isso funciona bem, mas o que podemos fazer para torná-lo um pouco mais claro é devido igual a vetor à direita. E então, em vez de negativo na direção x, podemos dizer vetor dois pontos à esquerda. Pode haver casos em que você quer que o jogador fique grávida e um pouco. E nesse caso, o vetor dois funcionaria melhor aqui, já que você seria capaz de definir um componente y para a direção também. Então, para isso, o que podemos fazer em vez disso é
tirar isso aqui e então apenas multiplicar isso pela direção de reversão. Então esta será a nossa magnitude e então esta será a direção. Teoricamente, gostaríamos de normalizar isso. Então eu acho que este aqui tecnicamente faz qualquer coisa aqui, mas nós gostaríamos de ter certeza de que as direções não vão acima de uma ,
porque então teria uma espécie de magnitude aqui. Então vamos normalizar. E então vamos definir a direção de volta para isso. Assim, o vetor normalizado apenas tendo direção multiplicada pela velocidade. E deve funcionar eficazmente exatamente o mesmo que antes. Mas eu acho que isso torna um pouco mais fácil entender exatamente o que está acontecendo para que nosso personagem ainda possa se mover e tudo mais. Vamos ser atingidos pelo inimigo, é empurrado para trás na direção correta. E sim, está funcionando exatamente como antes em termos de funcionalidade final. Então é assim que podemos ter inimigos como o porco irritado danificar o nosso jogador. E isso é muito bonito para esta seção sobre como configurar a escolha irritada.
24. Codificação na parede: Então, nesta próxima parte, vamos adicionar o estado de deslizamento da parede para o nosso personagem. Então, quando estamos na fronteira com a parede, devemos ser capazes de deslizar para cima e para baixo. E também vai dar um campo diferente ao movimento. Então, uma coisa que vou acrescentar é reduzir a taxa que você
desliza pela parede em vez de quando ele cai devido à gravidade. E também adicionaremos a habilidade de fazer um pequeno salto da parede, o que é diferente de um salto normal porque ele vai nos empurrar para longe da parede automaticamente. Então vamos em frente e mergulhe em nossa cena de jogadores. E acho que um lugar com o qual poderíamos começar seria a árvore de animação. Então, se
expandirmos isso, podemos ver que não há nada aqui por um tempo deslizando animação. E acho que o que vamos colocar é entre o golpe de um tiro e o salto duplo. Nós queremos que a morte bem seja uma animação de alta prioridade para obtê-la e receber dano basicamente é token e proceder tudo. Então vamos tê-lo bem aqui. E em vez de um tiro único vai fazer isso uma mistura porque estar na parede pode ser ligado e desligado. Então vamos clicar com o botão direito aqui e eu vou adicionar uma mistura T2. E esta mistura dois vai ser, está na parede. Então, como nós conectamos a saída do nosso salto duplo de um tiro para ser a entrada é na parede e desconexão é em que? O único tiro para terminar a tendência. E antes de adicionarmos a animação, precisamos corrigi-la. Então, no sprite animado, podemos ver que temos uma animação de salto de parede aqui. Mas, na verdade, isso não é preciso. Esta é realmente uma animação deslizante de parede. O salto vai parecer apenas uma animação de salto padrão. Então vamos renomear essa animação para ser slide de parede. E agora vamos para nossa árvore de animação para que eu
possa clicar com o botão direito em uma animação e vamos escolher aquele slide de parede. Bem, nós realmente não criamos essa animação no player de animação para ela também. Então, no player de animação, Vamos para animação ociosa e duplicá-lo. Ok, então podemos renomear isso para ser, eu acho que eu preciso mudar aqui vai ser o valor ou a animação. E é claro que vamos mudar isso para ser enquanto desliza. Então agora podemos ir para a árvore Animation, excluir esse nó de animação e adicionar um novo para que ele seja atualizado com a pequena animação de parede. E agora conectamos isso à mistura. Então, se o nosso valor de mistura for definido como um, vamos dormir bem. E se ele estiver definido como 0, nós vamos estar jogando uma dessas outras animações. Então agora vamos mergulhar no código. Assim, com o corpo cinemático 2D, há uma função que
é, está na parede com parênteses. Então você pode executar isso em qualquer corpo cinemático 2D para verificar se o personagem está na parede ou não. Mas na minha prática, eu não tenho 100% de certeza do porquê, mas eu acho que você tem resultados mais consistentes em verificar se há uma parede na fronteira, se você apenas fizer um reelenco. Então, ao invés de usar é na parede e usar isso para verificar se devemos entrar no estado deslizante, vamos usar matriz moldada para ver se estamos mesmo ao lado contra uma parede. E então esses objetos de parede supostamente também
vai ter que combinar para estar na camada mundial porque nós só queremos coisas como os tijolos e as plataformas para realmente ser capaz de contar como uma esposa, nós esbarramos em um inimigo que não deveria contar. Felizmente, se você se lembra, nosso jogador tem a máscara de colisão onde só estamos verificando o mundo. Então basicamente qualquer coisa que possamos
colidir com uma operação de física 2D é o que vamos usar para as máscaras ou vamos apenas usar esta máscara. Então vamos em frente e criar nossa função para testar se estamos próximos contra a parede. Então eu vou chamar este funk está no teste de reformulação de parede. Eu quero ter certeza de que é claro que nós não estamos apenas usando o padrão é mau funcionamento, mas fazendo nossa própria coisa aqui. E então vamos precisar de uma variável. Então este vai ser o estado espacial. Então, em um jogo de gueto, podemos obter este objeto de estado espacial, que tem a capacidade de fazer testes re-cast usando Git mundo 2D e, em seguida, verificando essa propriedade de estado espacial direto. Então, com isso podemos fazer um elenco de raios, que é basicamente tomar um ponto de partida, indo para outro ponto em nosso mundo 2D e vendo se há alguma colisão entre o ponto inicial e o ponto final. Então vamos ter uma variável de resultado, que vai ser um dicionário das colisões que ocorrem. E isso vai ser igual ao nosso objeto de estado espacial fazendo a reformulação e vamos fazer isso como um raio cruzado. Estamos começando a partir da posição de nossos objetos de jogador. Então essa é a posição global. E vamos colocar a posição final neste raio. Basicamente, nossa posição inicial mais um certo número de pixels em direção à direção que nosso personagem está enfrentando. Onde nosso personagem está enfrentando será a parede que nos importamos. Assim, podemos começar com a nossa posição global aqui. E um número arbitrário de pixels. Descobri que 10 funciona muito bem. E você pode colocar uma propriedade no topo se você quiser colocá-la lá e outras coisas. E vamos às vezes essa função phi e u vai escrever direção de frente. Então vamos em frente e escrever essa função agora. Então a função fica voltada para a direção. Então isso vai ser bem simples. Só vamos dar uma olhada. Para qual direção o personagem está virado. E então essa será a nossa direção de frente. Então nós podemos apenas verificar se o sprite animado blip H é falso. Então, se isso é falso, então nosso personagem está virado para a direita. Então queremos retornar um vetor de dois pontos, certo? Então, em termos de valores, isso seria apenas uma vírgula 0,
0 para y, um para x, que
significa que estamos virados para a direita. Caso contrário, basicamente está virada para a esquerda. Então podemos apenas retornar o vetor dois pontos à esquerda. Tão super fácil. Ok, então agora podemos voltar para as nossas funções de teste de reformulação. Portanto, há mais alguns parâmetros aqui. Então você pode ver o terceiro parâmetro ali é excluir e ele leva uma matriz, então queremos excluir o objeto atual a partir disso. Não é realmente necessário aqui, mas por qualquer motivo, não
queremos que o jogador apareça como uma parede para os resultados. Então poderia muito bem apenas fazer auto aqui como a matriz. Então, observe os colchetes. Foi assim que ele definiu como uma matriz. E isso tem que ser uma matriz porque esse é o tipo para o perímetro. Então, em seguida, podemos colocar uma máscara de colisão aqui para torná-la para que haja você
intersetorial quando ele está saindo e verificando se há colisões, ele está fazendo isso apenas na camada mundial. Então a maneira mais fácil de fazer isso é pegar a máscara de colisão aqui. E nós podemos apenas puxar isso direito do corpo cinemático 2D
fazendo máscara de colisão auto ponto. Então isso vai fazer a verificação de reformulação para a parede para nós. E agora podemos apenas fazer algumas verificações muito simples. Então, se há um resultado e o dicionário, isso significa que houve uma colisão. E presumivelmente essa colisão acontece na camada mundial, o que
significa que é um bloco ou algum outro objeto que contaria como uma parede. E só queremos ver se há algum desses. Então podemos fazer isso muito facilmente com se o tamanho do ponto do resultado é maior que 0, então obviamente há algo lá. Então retornamos verdadeiros. Caso contrário, não há colisões. Então não deve haver um muro bem na nossa frente, para que possamos retornar falso. Então, dependendo de como nós codificar, ele provavelmente vai precisar do resultado disso várias vezes para cada loop de nosso processo físico, isso vai ser uma variável útil para determinar qual status deve estar em e quais ações e movimentos devemos tomar. Então, se nós rodarmos isso aqui e nossa função de processo físico poderia apenas colocá-lo bem aqui ao lado de definir parâmetros de animação. Então vamos executar esta função e, em seguida, vamos salvar o resultado dela para uma variável booleana. Então nós podemos apenas vir aqui e fazer var está na fronteira parede. Mais uma vez, apenas mudar o nome um pouco para que seja distinto do corpo cinemático está na função Wolf. Assim como a parede na fronteira. Isso é apenas o resultado disso, está em testes de reformulação de parede. E agora podemos usar isso sempre que precisarmos ver se saiu da parede ou
se saltamos da guerra, seja lá o que for. Então, isso será muito útil. Certo, então vamos pegar esse valor e ir até lá para escolher o próximo estado. Então, depois disso, adicionará outro. Então aqui vamos fazer algo com isso e um segundo aqui. Mas por agora, vamos ter outro, se aqui embaixo. Então precisamos mudar isso de outra forma e para outra se, já que há apenas uma condição aqui de qualquer maneira, poderíamos muito bem puxar isso aqui. E eu colo-a assim. E agora, nesse caso, entraríamos no estado de salto duplo deve funcionar exatamente como antes. E agora precisamos de outro. Se ir mais abaixo, se todas as outras condições não foram atendidas, então aqui é onde vamos usar. Isto está na fronteira com a parede. Então, se estamos na parede basicamente, então queremos entrar no estado de deslizamento da parede. Então vamos fazer auto-ponto atual estado é igual a estado dot wall slide. E então, claro, vamos subir ao topo e adicionar isso na lista do nosso estado. Também podemos modificar isso um pouco também. Então, se o personagem estiver no ar e fizer o botão de salto, então geralmente queremos que o salto duplo ocorra, mas se estivermos na parede, queremos que os saltos sejam reiniciados. Então, basicamente, ele vai ser saltar de saltos são também deve fazer um saltos normais. Então o que podemos fazer aqui é colocar que IF está na fronteira parede, e então se esse é o caso, em vez de entrar salto duplo vai apenas entrar salto. Então auto estado atual escuro é igual estado ponto saltado. E o outro aqui em baixo, salto duplo. Então, enquanto estamos no slide de parede, vamos querer que o movimento seja um pouco diferente, mas ainda vamos executar a próxima função de estado PEC. Então vamos marcar outra partida para o estado atual. Então, se conseguirmos o deslizamento da parede, ainda vamos escolher o próximo estado. que basicamente já configuramos as outras condições que precisamos para isso na função de estado de piquenique. Mas para o movimento em si, vamos mudar como isso funciona quando estivermos na parede. Então eu vou criar uma nova função para a lei deslize telhado. E isso não vai levar qualquer entrada do jogador porque basicamente não vamos estar usando x input para determinar x movimento. Vai ficar preso na parede até que o personagem salte para longe da parede. Então vamos em frente e criar essa função aqui embaixo. Quadril. Então, função enquanto movimento ligeiro. Ok? E assim como as outras funções para se mover, nós vamos estar retornando um vetor. E para o x, vamos pegar
a velocidade atual e vamos apenas manter isso como está. Então, se não houver movimento x, não
estamos alterando o movimento x. E então, além disso, nós ainda vamos fazer homens tomando o menor dos dois valores. Então velocidade, por que a velocidade y atual e meio semelhante a antes, vamos adicionar a gravidade das configurações do jogo, mas vamos multiplicar isso por um valor de atrito. Então eu vou chamar isso de fricção de deslizamento de parede. E então, assim como a função normal, nós ainda queremos que a velocidade terminal seja a nossa velocidade mais rápida absoluta. Vamos segui-los. Então, obviamente, precisamos deste valor de fricção de parede. Então eu vou subir aqui até o topo e fazer uma outra variável de fluxo. E eu vou querer que isso seja abaixo de um porque o personagem deve deslizar mais devagar quando está na parede, tipo de agarrar a parede, então normalmente seria apenas queda livre. Então eu posso multiplicar isso por 0,5 e então ele vai deslizar pela parede bem devagar. E então isso basicamente nos dará nosso movimento de deslizamento de parede enquanto estamos nos estados de deslizamento de parede para que não possamos mudar nossa velocidade x. E o deslizamento pela parede vai ser mais lento do que estaria caindo. Então, em nosso código quando estamos no estado de deslizamento de parede, na maioria dos estados, podemos pressionar salto para saltar. Então, se estamos na fronteira com a parede, vamos obter esse state.com, caso contrário, estado ponto-ponto. E se nos lembrarmos, por causa da função sátiro para este estado atual, se viermos aqui, isso significa que vai executar a função de salto, que vai adicionar um impulso de salto para cima e aumentar o valor do salto. Então, isso geralmente é bom, mas queremos que ele funcione um pouco diferente quando estamos fazendo isso. Da parede.
25. Movimento de salto em parede: Então, se entrarmos neste estado Salta da parede, e podemos verificar por isso verificando o estado atual antes de realmente mudá-lo. Então o estado atual duplo é igual ao slide de perda de ponto de estado. E então apenas no caso de mudarmos para o estado Saltos de qualquer maneira sem pressionar salto, que nós não saltamos da parede. Então, por exemplo, se o personagem meio que desliza da parede, mas não sob o solo, e entramos no estado de salto para a animação. Não queremos que salte imediatamente. Então ponto de entrada é ação, apenas crista. E estamos a verificar se há salto. Ok, isso é um conjunto extra de parênteses. Ok? E se for esse o caso, então podemos fazer um salto na parede. Então isso seria semelhante ao salto, mas não exatamente o mesmo. Senão. Podemos fazer, o salto normal e outras circunstâncias. Então vamos até aqui para o salto básico e vamos criar um salto de parede. Então as coisas que vão ser as mesmas sobre o salto de parede. Então, para o salto na parede, vamos fazer a mesma coisa. A velocidade y será a mesma quando entrarmos naquele salto de parede. E porque entramos pela parede, os saltos devem sempre começar em um. Já que estamos considerando a parede como
o chão no sentido de que ela repõe nossos saltos. A outra coisa que vamos querer ter aqui, basicamente bloqueando nosso movimento de base para que possamos saltar para longe
da parede com alguma velocidade x além da velocidade y. Mas não queremos que isso seja algo que o jogador possa controlar por um segundo. Então aqui em cima, para o nosso movimento normal padrão, nós podemos realmente verificar aqui se o temporizador de salto de água, que estamos prestes a criar começou, e se ele não começou, então vamos fazer é um movimento normal. Mas se está funcionando, então vamos renunciar a esse movimento normal. Mesmo que estejamos no estado dos Saltos, a fim de fazer um movimento especial de salto na parede temporariamente. Então vamos criar um temporizador de salto de parede e nosso jogador. Então eu vou criar o temporizador, vou fazer um temporizador de salto de parede aqui. E nós vamos tirar o movimento normal do jogador para o ramo, digamos 0.15 segundos. Então, se você mudar o tempo de espera para 0.15, certifique-se de que um tiro é verificado porque uma vez que o temporizador é feito, nós não queremos que ele rode novamente até que nós reiniciemos um novo salto de parede em algum momento do jogo. Então agora precisamos fazer referência ao temporizador no script, assim como o temporizador invencível. Portanto, temporizador de salto log var inpronto é igual ao sinal do dólar salto parede temporizador. Então podemos verificar aqui se o temporizador de salto de parede está parado. E isso é uma função. Então, se for parado, então faremos o movimento normal aqui. Caso contrário, vamos fazer uma, outra jogada especial. Então esse movimento especial, Vamos fazer outra função para que podemos chamá-lo enquanto salta movimento. E mais uma vez, não precisamos da entrada porque isso é tipo de controle forçado para o eixo x. E vamos descer aqui. Então, funciona enquanto salta movimento. E a razão pela qual precisamos dessa função é porque ao contrário do salto, que é apenas um impulso rápido padrão, isso vai ser sobre alguns quadros. Então queremos que ele continue fazendo isso até que o temporizador no salto de parede esteja pronto. Então é por isso que precisamos rodar cada quadro até que o temporizador esteja ligado. Então podemos apenas retornar um vetor para aqui. E isso vai fazer velocidade de movimento. E outra variável terá de definir que é enquanto saltou a direção, que vai ser nessa função de salto de parede. Então, basicamente, a direção
em que o personagem salta para longe da parede vai ser a direção e continua se movendo até que o temporizador é feito. E então aqui em baixo, o movimento será o mesmo que um movimento padrão. Basta puxar a parede, ligeiro atrito. Então é apenas velocidade y mais gravidade. E agora precisamos criar a direção do salto na parede. Então vamos descer para a função de salto na parede. Novamente. Uma coisa que precisamos fazer é iniciar o temporizador enquanto o temporizador Jam começa. E também precisamos pegar a direção do salto na parede. E isso vai ser igual à direção oposta de frente para
a corrente no quadro onde começamos o salto de parede. Portão negativo virado para a direção. E isso é uma função. Então isso também é declarar esta variável aqui no topo. Neste deve ser um vetor dois. Então isso era um monte de código. Vamos definir o estado atual. E precisamos configurar um pouco aqui para quando entrarmos no estado da parede. Então vamos fazer o estado dot wall slide 11 na parede. Uma coisa que definitivamente queremos definir é os saltos iguais a 0. Já que estamos reajustando os saltos para o jogador. E também queremos que a árvore de animação vai definir o parâmetro é essa quantidade de mistura de barra de parede ON. E isso vai ser definido como um. E então isso precisa ser um para que a animação de slide de parede seja reproduzida. Ok, e parece que eu escrevi o nome dessa variável errado aqui em cima. Então vamos apenas colar isso enquanto Jam direção é o que queremos. Agora, por fim, também queremos que o is indesejado seja atualizado em cada quadro. Então estamos apenas checando se o personagem ainda está
na parede ou não e atualizando isso. Na verdade, talvez nem precisemos disso aqui, porque vamos apenas definir em cada quadro. Então vou cortar isso. E vamos até aqui para definir parâmetros de anime. E é isso que vamos fazer em vez disso. Então nós vamos tomar que é fronteira parede e convertê-lo em um um ou 0 dependendo se ele é verdadeiro ou falso. Então vamos escrever é sobre a lei e eu acho que eu posso declarar que isso vai ser uma otorrinolaringologia obviamente. E podemos fazer se está na
fronteira com a parede e se está na fronteira com a parede, estamos dizendo que está na parede. Então a variável deve ser um. Então está ligado, enquanto nT é igual a 1, caso contrário está na parede, vai ser igual a 0. E agora que é um inteiro, podemos definir o parâmetro. Assim, parâmetros de conjunto de pontos de árvore de animação está na quantidade de mistura de barra de parede. E isso vai ser qualquer hora que está em lei inteiro está definido para. Então agora nossa árvore de animação deve ser atualizada cada quadro para saber se devemos estar reproduzindo a animação deslizante de parede ou não. Vamos nos certificar que na árvore de animação temos esse parâmetro aqui. Então podemos ver os parâmetros estão na parede, misturá-los. E podemos ver essa configuração com o slide da parede.
26. Testando salto de parede e finalização Movimento em personagem: Ok, então depois de todo esse código, vamos em frente e realmente ver onde estamos. Vamos tocar no play. Ok. Vamos ver. Nós temos a parede deslizando, ok, e você pode ver quando saltamos da parede,
os parâmetros de animação se ajustam corretamente. Então esta é uma das razões pelas quais eu não estou usando sua própria verificação de parede porque quando você usa o webcast, eu só obtenho resultados muito melhores. Assim que chegarmos aqui, está checando aqui para o reelenco. Não encontra uma parede. Então, mudamos imediatamente para a animação de queda do jumper, que apenas parece muito melhor. Então, uma coisa que podemos notar aqui é que nosso personagem se move muito rápido atualmente, com a capacidade de saltar e fazer slides de parede. Isso é muito exagerado, então provavelmente vamos precisar diminuir isso. Outra coisa que eu notei é que nem sempre se sente bem indo até
a borda de um desses blocos e, em seguida, deslizando fora com esta cápsula formas 2D. Então, na verdade, mudou a forma do caractere para um retângulo também. Eu acredito que eu disse para o início deste curso, é meio que até você o que você prefere. E acho que neste ponto, prefiro que seja um retângulo. Então, uma coisa que não está funcionando muito bem no momento é que quando fazemos aquele salto de parede, ficamos presos nele. Então não tenho certeza se estamos verificando corretamente para ver se o temporizador parou. Porque uma vez que o temporizador é parado, você deve ser capaz de recuperar o controle de seu personagem. Ok, então vamos fazer a fruta de baixo pendurado primeiro no jogador, podemos mudar a forma de colisão. Então vamos mudar isso para uma forma de retângulo. E eu acredito que os tamanhos que eu queria colocar para este trabalho, 10707 e 10, eu acho que era. Então aproximadamente a forma do nosso personagem, mas, mas agora nossa forma de colisão fará com que não tenhamos qualquer deslizamento fora da borda e por que o B claramente está claramente fora. Eu acho que outra maneira de potencialmente se locomover que poderia ser usando Moving colide função em vez de mover e deslizar. Uma vez que os movimentos como função vai tipo de mover você ao longo do chão. Mas a função de colisão em movimento, se há algo no caminho, ele só vai parar o seu movimento inteiramente, grosso modo. Mas acho que vai funcionar muito bem por enquanto. Em seguida, eu quero tipo de limitar parte do movimento
no jogo para que possamos diminuir o impulso de salto. Eu vou puxar isso para 500 por padrão. E, em seguida, nas configurações do jogo, eu vou baixar a gravidade para 40. Vamos tocar em Play e ver como isso afeta as coisas. Talvez até queiramos diminuir a velocidade dos personagens um pouco. Então vamos ver no jogador, ok, ele ainda está usando 200. Então acho que podemos definir para 180. Ok, então ainda é bem rápido. Mas eu acho que com essa quantidade de gravidade, é um pouco menos ridículo. Destill seria uma plataforma bastante rápida, talvez para um sapo ninja, isso faz algum sentido. Então podemos deixá-lo nas configurações por agora. Ok, então nós temos o problema com um movimento de salto de parede está acontecendo por muito tempo. Então eu realmente vou pegar o temporizador de salto na parede e imprimir o tempo restante. Então vamos imprimir o tempo restante para o log do console e vamos ver quanto tempo isso realmente dura deve ser 0,15 segundos, que é muito rápido. Ok? Então levou um quadro, eles são essencialmente e depois disso, ele ainda está indo. Ok. Então você vê o que está acontecendo aqui? Quando saímos da parede, ainda está na parede. Estações de slide, então é por isso que não podemos controlar o movimento. Então o que nós poderíamos fazer aqui é apenas adicionar outra maneira de entrar no estado Saltos,
mas fazê-lo para que nós façamos isso sem realmente saltar. Então, já sabemos neste ponto que está na fronteira parede é falsa. Então não precisamos verificar. Então nós podemos apenas fazer auto-ponto atual estado aqui é igual a estado ponto-ponto. Então, quando entramos no estado assim, já que isso vai ser basicamente quando algo faz o personagem saia da parede que não está pressionando o botão de salto. Então queremos ter certeza aqui embaixo que entraremos sem pular. E foi por isso que escrevi esta parte aqui. Ok? Então isso é basicamente apenas para distinguir que existem diferentes maneiras de entrar no estado Saltos. E nem sempre estamos tentando realmente fazer uma função de salto, mesmo que estejamos reproduzindo aquela animação de salto. Então vamos em frente e jogar agora. E espero que o personagem seja capaz de, oh Deus. Certo, então vamos dar uma olhada. E claramente, não era isso que pretendíamos. Acho que precisamos de uma condição aqui. Então nós vamos fazer else-se não na fronteira parede, eu acho. Então vamos colocar o else-if e vamos verificar se
o estado atual é igual a state dot wa slide. Então nós só devemos ser capazes de arbitrariamente e para o estado de salto do estado de slide parede como este. E só assim é um pouco mais legível, compreensível também importante. E não está na fronteira com a parede. Então, se esse bit já foi executado, então isso já deve ser verdade. Então, não será realmente necessário. Mas acho que dá uma dica sobre o que está acontecendo aqui. Então vamos em frente e tocar no play. E não deveríamos ser capazes de entrar naquele salto desde o início porque não estávamos na parede, mas agora estamos no slide da parede. Vamos saltar da parede. E você pode ver que ele nos dá uma maneira de entrar no salto, mas sem realmente adicionar outra animação de salto. Então só temos aquele salto de distância da parede. E isso é o que estávamos procurando. Então podemos ver, embora o salto na parede seja forçado, podemos pressionar em direção à parede e ele volta muito rapidamente. Tecnicamente, isso está funcionando como planejado. Talvez ele se mova um pouco rápido demais e o ar, que
pudéssemos abrandar os caracteres padrão, movimento
aéreo ou aceleração horizontal ar se quiséssemos. Mas se você gosta da sensação do personagem agora, então ele deve ser muito bom para ir para todas as gravações de animações, configurar este personagem com talvez um pouco para deslizar ao redor do mapa. Mas muito disso vai ser apenas ajustar as variáveis. Então vamos cortar esse pouco que está imprimindo para o console registrar um monte. Só vou acertar o Controle F e checar as pegadas. Este está bem, eu acho. Mas vamos nos livrar deste salto parede Timer Text. Agora, mais uma coisa para mostrar. Antes, eu disse que quando estamos fazendo nosso webcast, queremos ter certeza de que isso só ocorre quando nossos personagens na parede assim. E talvez nem queiramos ter a parede abraçada se estivermos no chão e na parede assim. Então isso é outra coisa que podemos desligar. Talvez gostemos, não sei. Mas queríamos ter a certeza de que o porco não pode contar como parede. E você pode ver que claramente o porco não conta como a parede porque ele está em uma camada separada, ele está em sua camada inimiga, que torna as camadas físicas realmente úteis. Então ainda podemos saltar sobre eles. Ainda podemos, vamos ver se conseguimos um ataque e depois um John duplo. Está bem, Legal. E depois disso podemos ir para alguns deslizamentos de parede agradável em um salto ou enquanto desliza em um duplo, despejos, o que quisermos fazer. Então, nosso personagem está trabalhando muito bem aqui. Então, haverá mais algumas coisas que queremos adicionar ao jogo ainda como um segundo inimigo e realmente construindo alguns níveis. faz algum tempo desde que tocamos no conjunto de azulejos, mas pode ser divertido fazer a transição entre alguns níveis. Quando você bater o nível um, você pode passar para o nível dois, assim por diante e assim por diante. Então isso vai ser o que estamos vendo nos vídeos finais.
27. Correção de bug e: Certo, pessoal, então, à medida que chegamos perto do final deste curso, eu quero ter um vídeo rápido aqui para limpar algumas das coisas que estavam um pouco bagunçadas mais cedo. Começando com isso está aumentando a animação de salto duplo para 0,35 segundos. Então, se olharmos para o salto duplo, acho que termina um pouco abruptamente lá. E eu estava achando que, se aumentarmos a duração da animação um pouco, ela transita de volta para suas animações de queda ou salto um pouco mais suave. Então vamos para o player, o player de animação. E se encontrarmos a animação de salto duplo, podemos aumentar a duração aqui para 0,35 segundos. Altere este snap para 0,05 segundos. E vamos ampliar e mover essa animação finalizada para a marca 0.352. Então, agora, quando voltarmos ao jogo, acho que a animação vai um pouco melhor lá. A próxima coisa que quero fazer é adicionar um segundo porco ao jogo. Então ainda não estamos construindo nossos níveis. Mas acho que este terceiro waypoints está sentado aqui há muito tempo. E já que nosso porco irritado é completamente feito, uma pena se não reutilizarmos parte do código, vamos apenas selecionar nosso Pig na hierarquia e fazer um Comando ou Controle D para duplicá-lo. Se você manter a tecla Alt pressionada onde você está pairando sobre os porcos, selecionaremos e moveremos o selecionado atualmente. Então vamos mover este porco furioso para aqui para a direita. E agora vamos duplicar o waypoint 3. Então eu vou para Alt. Vou para o Comando D no Mac. E então eu vou para aqui para onde ele está no mundo do jogo. Segure Alt D para mover esse waypoint específico e como derramar aqui. Então, já que temos o código configurado muito bem, nós já criamos o caminho para a escolha irritada. Agora só precisamos definir que o porco irritado vai usar waypoints 3 e 4. Então vamos clicar em Angry escolhido para ir para a matriz waypoints. E vamos selecionar waypoint três em vez de um em waypoint quatro em vez de três. Outra pequena questão é que se olharmos para
a forma de colisão do nosso porco furioso e atingirmos o mundo do jogo, podemos ver que ele está realmente saltando um pouco acima de onde o solo está. Então isso não parece muito certo. Então, se entrarmos no porco furioso, podemos pegar nossa forma de colisão, a principal para as colisões reais no mundo. E então vamos apenas tomar a posição aqui e mudá-la para um dois de um três para a posição y. Então isso só aumenta um pouco. E agora ele colidirá com o chão muito melhor e parecerá mais correto. Então vamos apenas ir em frente e visualizar onde estamos até agora. Então nossos porcos estão um pouco mais contra o chão e temos esse segundo porco furioso. Sei como ele está remando distâncias muito mais longe, mas eu ainda trabalho da mesma forma que o primeiro porco irritado. E isso é muito legal. Era muito mais fácil criar o segundo inimigo. E então quando temos que codificar tudo do zero, reusabilidade, sim. Então um outro problema, e este é um tipo de coisa importante é que com a nossa mecânica de salto, às vezes se saltarmos em um ângulo como este, nós realmente danificamos o porco mesmo que estejamos subindo, que realmente não faz sentido. Então o que podemos fazer é adicionar não só um, foi os jogadores saltar caixa de hit colidindo de cima, mas foi a velocidade como ascendente ou descendente. Então só devemos danificar os porcos. Estamos caindo sobre ele. Não quando enviamos um ângulo como esse. É meio estranho. Então é uma solução rápida. Vamos para o script do jogador e então vamos descobrir onde estamos verificando para causar dano a um inimigo. Então eu acho que poderia ter sido em Jump Box entrou. E aqui podemos ver a linha para se causarmos dano ao inimigo. Ok, então esta linha é só para verificar se estamos atingindo o inimigo no caminho certo. Portanto, a posição deve estar acima. Então nós vamos descer aqui e adicionar uma condição extra, que é que o ponto de velocidade y. eu acho que queremos que seja menor que 0. Queremos ter certeza de que está indo para baixo na tela. Então vamos tocar no Play e dar uma olhada. Vai ser imediatamente óbvio. Então, se saltarmos para o inimigo, ok, o que é, na verdade é para o outro lado. E então é um pouco confuso, já que a direção y é uma espécie de invertida. Então, se estamos indo para baixo, isso é realmente positivo e negativo seria ir para cima na tela e nosso personagem está indo para baixo para pousar sobre o inimigo. Então vamos tocar em Play, testar de novo a que horas, apenas ter certeza de que podemos saltar. É isso que queremos. Mas agora não podemos fazer esse movimento estranho de dano inclinado. Na verdade, o que acontece é que ficamos danificados, que é como deve ser. Eu acho. A outra coisa com o porco irritado, e se entrarmos nele é visto e dar uma olhada nisso, Vamos desativar a colisão principal em forma 2D. Podemos ver que quando eu fiz a forma de colisão inimiga é realmente muito pequena. E isso paga muito ao jogador. Mas acho que até o ponto em que não faz sentido. Assim, o jogador pode estar aqui e ainda não receber qualquer dano do inimigo. Então eu vou aumentar isso um pouco. Então vamos pegar a forma de colisão inimiga sob a caixa de colisão inimiga, e vamos pegar as extensões e fazer isso 10. Então agora você pode ver que isso ainda não está realmente combinando com o quadro sprite. Então você pode ver que isso ainda é menor do que o próprio sprite. E se ligarmos a forma de colisão principal, aquela para se o porco colidir com o mundo, você pode ver que ainda maior. Então ainda há vôo. Então isso ainda favorece o jogador, mas talvez faça um pouco mais de sentido agora. Ok, então com essas correções, sair com os porcos irritados deve ser um pouco mais limpo. Então vamos tocar no play e testar tudo. Primeiro, certificando-se de que ainda podemos fazer um ataque contra o inimigo. Isso é tudo bom. E vamos tentar ser sorrateiros e evitar danos. Bem, obviamente podemos ver que as formas de colisão vão nos favorecer, mas
28. Jogo de tela e limites: Uma das próximas coisas que eu gostaria de acrescentar é a capacidade do personagem cair fora da borda e perder o jogo. Mas agora, temos uma câmera de acompanhamento sem limites. Então eu posso meio que mostrar o que vai acontecer agora, se sairmos do limite, você pode ver, não importa onde o jogador vai, ele vai continuar seguindo. Então seria meio estranho ter um jogo aqui. Então a próxima coisa que vamos querer fazer é pegar essa câmera e definir alguns limites para ela. Assim, com qualquer câmera, você pode definir manualmente limites usando a categoria limite aqui embaixo. Então você pode ver esquerda, superior, direita e inferior. Mas eu acho que uma maneira melhor de fazer isso é usar nós de posição 2D, a fim de definir onde o limite superior esquerdo está e o limite inferior direito é exatamente como nós definimos metas waypoint. E, em seguida, aplicar isso à câmera 2D e um script sempre que o script é carregado. Então vamos em frente e pegar esta câmera 2D. Vou renomeá-lo algo como seguir câmera para ser um pouco mais específico. Quando fazemos isso, isso nos dá um aviso sobre nossa transformação remota. Então você tem que redefinir o caminho para a câmera de acompanhamento neste caminho remoto aqui. Então agora vamos pegar essa câmera de acompanhamento, clique com o botão direito nela e transformá-la em uma cena reutilizável. Posso ser um pouco exagerado, mas acho que vou criar uma categoria aqui, uma foto melhor. Então, se eu clicar em Nova pasta e eu vou chamar essa câmera. Então, se você tem outras câmeras, então pode ser um pouco redundante. Mas eu criei uma pasta aqui chamada câmera. Basta clicar com o botão direito do mouse E entramos aqui e podemos salvar essa cena como objetos reutilizáveis, mas eles estão agora vamos mergulhar na cena das câmeras. E esta cena. Primeiro, vamos querer redefinir a transformação para 000 por padrão. E em segundo lugar, precisamos adicionar em alguma posição terças-feiras, mas não queremos que a posição deles mova com a câmera se a câmera mudar de posição. Mas preferimos que eles fossem uma posição mais global em nosso jogo. Assim, podemos ter certeza, mesmo que seja um filho que ele não vai herdar a posição clicando com o botão direito do mouse, Adicionar um nó filho e, em seguida, usando nó como base. Então eu poderia chamar isso de limites. E, em seguida, dentro deste nó limites irá criar a posição terças-feiras. O que você vai ter agora uma posição totalmente separada da câmera de acompanhamento. Então, com a posição 2D aqui, eu vou chamar isso de cima esquerda. Vou ao Comando D, duplicá-lo, e chamaremos isso de fundo. Certo. Agora vamos apenas definir alguma posição padrão para que saibamos que não está sentado lá na origem. Vou selecionar a parte superior esquerda, segure a saída, e mover a parte superior esquerda para a direita por aqui. E farei a mesma coisa com a parte inferior direita. Selecione-a, mantenha pressionada a tecla Alt e mova-a para a direita aqui. Agora no script, quando o script carrega irá definir o topo, deixe definir o médico esquerdo e superior aqui, e as posições inferior e direita para a câmera usando esta posição. Então vamos pegar a câmera fotográfica, clicar com o botão direito nela, adicionar um script. Claro, vamos chamar essa câmera de acompanhamento, salve-a na pasta da câmera. Agora, vamos precisar de já var ou superior esquerdo,
ligado, ou apenas superior esquerdo ou outro. E vamos definir isso igual ao cifrão superior esquerdo. Agora note, quando você tiver filhos aninhados, você precisa do caminho completo. Então vamos precisar de limites para cima à esquerda, mas Godot meio que já sabe é o que estamos indo para lá. Portanto, é muito fácil ter autocomplete. Então vamos fazer var inferior direito é igual a limites de sinal de dólar, inferior direito. Então agora em funk pronto podemos tomar os limites. Vamos fazer os limites de auto-visualização. Ok, acho que você tem que definir cada um individualmente, não como uma categoria inteira. Então vamos fazer auto-limites. Vamos começar com o topo. E isso vai ser um valor. Então, obtenha a posição, a posição global absoluta do mundo superior esquerdo. Então isso vai ser uma posição global do ponto
superior esquerdo, sublinhado superior esquerdo. E já que estamos lidando com o topo, estamos olhando para o valor y. Então a posição global ponto y. Agora precisamos de limite esquerdo é igual ao superior esquerdo, posição
global ponto x k. E salvá-lo não deve ter erros no momento. E agora fazemos a mesma coisa com o canto inferior direito. Então isso vai ser igual ao fundo, certo? Ponto posição global ponto x, porque direita está indo esquerda e direita, que é x. Então auto ponto inferior direito é igual inferior direito, posição
local ponto y, e isso não é inferior direito aqui, isso é Limites inferior. E aqui em cima deve ser limitado, certo? Então, agora que temos o conjunto só precisa fazer é ter certeza de que a câmera está no nível um e, em seguida, podemos definir os limites. Então agora há câmera de acompanhamento não está recebendo corretamente a cena, então eu vou apenas adicionar uma nova câmera de acompanhamento e eu apenas colocá-lo por aqui. Vamos apagar o antigo que não tem o salto. E então este, podemos renomear câmera de acompanhamento, vez que tem o mesmo caminho que o caminho de transformação remoto que tipo de conserta em si mesmo. E agora temos uma câmera com esses limites. Então o que precisamos fazer é clicar com o botão direito do mouse na câmera seguir, escolher crianças editáveis. E agora podemos editar os limites superior esquerdo e inferior direito. Então, os limites de cima esquerda, é assim. Eu não sei de algum lugar por aqui por agora. Então isso vai ser o topo e um limite mais à esquerda para a nossa câmera. E depois aqui em baixo, primeiro, vamos esconder o jogo na tela. Mas vamos pegar o canto inferior direito e vamos movê-lo para ou apenas tê-lo ajustado para a direita em torno de lá. Pode ser útil ativar uma grade de pixels por agora, se quisermos. Agora para mostrar que esses limites são separados da câmera em termos de sua posição, Vamos selecionar a câmera fotográfica, mantenha Alt pressionado e movê-lo. Então você vê, mesmo que nós movamos essa câmera seguir, os limites não movem sua posição, que é, nós configuramos esse nó limites. Então, agora para aperfeiçoar nossos limites, talvez
queiramos configurar uma grade de pixels. Talvez queiramos que o corte inferior da tela seja
bem aqui para que não possamos ver nada abaixo disso. Então vamos ligar o snap da grade e a ligase de encaixe inteligente. E agora vamos puxar isto para onde se alinha aqui na grelha. Então eu vou puxar isso por aí. E podemos verificar a transformação aqui. Podemos ver que este é um tipo de múltiplo de dois. Então eu acho que isso não é ser tão vai funcionar muito bem. Podemos sempre ajustá-lo mais tarde. Então agora vamos ter certeza que eu siga câmera está realmente funcionando ou hip plano. Ok, agora note, não importa o quão longe o personagem se move para a esquerda, nós não podemos realmente ir além deste limite esquerdo e o limite superior também. Então você pode ver que estamos chegando ao topo da tela lá. Então, ter restrições como essa significa que não temos que identificá-las. Então, ter restrições como esta significa que não temos que projetar um nível infinito. Então vamos ver quando cairmos da borda aqui, bem, nosso personagem se foi. Tecnicamente, ele ainda é capaz de se mover. Você pode ver que não temos jogo sobre isso ou qualquer coisa. Isso vai ser o próximo. Temos que criar uma espécie de zona morta onde terminamos o jogo para o nosso personagem. Também reative a visibilidade
do jogo sobre a tela se você quiser que ele ainda seja capaz de funcionar.
29. Zona de morte e mais sobre sinais: Então, em seguida, precisamos criar uma zona que basicamente quando o jogador entra, temos um jogo sobre o jogador morrer é citação unaspas, o que quer que você queira chamá-lo. Então essa área estará logo abaixo dos nossos limites. Então o personagem sai da tela, caindo abaixo da tela. E enquanto você começa o GameOver, plataforma
bastante padrão de coisas. Então, vamos começar criando essa área. Vou clicar com o botão direito no nosso nível. Vamos adicionar uma nota de criança. Haverá uma área 2D. E podemos chamar nossa área 2D do que quisermos. E talvez zona morta. Acho que vou pegar e chamar de fundo da tela. E agora precisamos definir a área para isso. Então eu vou clicar com o botão direito do mouse em Adicionar um nó filho, e vamos adicionar uma forma de retângulo, eu acho que funcionaria perfeito para isso. Então precisamos de colisão em 2D. E então eu vou tomar forma, fazer uma forma retangular, e vamos apenas meio que esticar o tamanho dele para que possamos dizer algo assim. Agora nós só precisamos movê-lo para uma posição onde ele está na borda direita da tela. Então vamos arrastá-lo para lá. Acho que é sobre o que precisamos que seja. Somos apenas uma espécie de precisão. Realmente não importa onde é esquerda e direita, já que vamos ter que ser pelo menos tão grande quanto o tamanho do nível. Então, tendo isso assim, tudo bem, ele só precisa estar bem ali abaixo do fundo do que podemos ver visivelmente. Então agora eu posso adicionar um script a isso. Então vamos fazer uma cena separada por agora. Então eu vou clicar com o botão direito do mouse nele e vamos salvar ramos é visto. Então nós poderíamos colocar isso em mapas ou talvez outra pasta para algo como Zonas são áreas especiais que usamos em todo o jogo pode ser ok. Então vamos salvá-lo e eles vão clicar com o botão direito do mouse e anexar um script. Então podemos deixar isso como parte inferior da captura de tela, GED. Ou você pode querer chamá-lo de jogo sobre áreas porque pode ser áreas
diferentes do jogo que não a parte inferior
da tela onde você gostaria de acionar um jogo imediato sobre. Por enquanto, podemos chamá-lo assim só para combinar com o nome da cena. Acho que é o mais simples. Então vamos criar isso. E agora vamos nos livrar desse código extra que não precisamos. Então, como já fizemos algumas vezes antes, se tomarmos uma área para D ir ao Inspetor, então temos a capacidade de escolher se ele está monitorando
e monitorando terrível e definir quais camadas vamos colidir ou checar. Então podemos desligar o monitor bowl porque nada vai precisar verificar isso. Então, a não ser que queiras fazer o contrário com o jogador verifica a zona. Mas eu acho que tipo de separá-lo com as zonas, dizer ao jogador quando ele entra e algo deve acontecer, mas o jogador descobre que em vez
do jogador constantemente verificando para diferentes zonas. Acho que acabar assim, faz com
que seja um pouco mais sentido para mim. Então vou desligar o problema do monitor. E, como tal, não precisamos de uma camada aqui para a colisão, mas precisamos verificar a camada de jogador. Então vamos pegar a máscara e definir isso para o quarto bit para jogador ou onde quer que você tenha configurado e suas configurações de física 2D. Então, nesta parte inferior da tela podemos
pegar quando um jogador entra na parte inferior da tela. Então, podemos ir para a nota, podemos fazer forma de corpo inserido, e podemos apenas criar um método receptor para isso dentro da parte inferior do script de tela. Então vamos adicionar isso. Então, vamos selecionar a parte inferior da tela aqui embaixo, conectando-se do objeto a si mesmo. Então, para o nosso corpo quando ele entra, deve ser um jogador. Portanto, ele deve ter toda a funcionalidade que um jogador tem. E se não, gostaríamos de ter um erro lançado para que pudéssemos descobrir como algo entrou nele e foi pego sem realmente ser um jogador. Então podemos pegar nosso corpo e basicamente executar qualquer função que esperamos que o corpo tenha nesse objeto. Alguns. Então talvez possamos chamar de “corpo ponto morrer “ou algo assim. E agora vamos para o jogador e só precisamos criar essa função. Então vamos descer aqui em direção ao fundo. Eu faria, eu vou colocá-lo aqui, função dy. E para isso, definitivamente vamos querer acionar o overstate jogo. Então vamos querer emitir o sinal como faríamos se nossa saúde caísse para 0. Então vamos emitir o sinal, colocar o seu morto, e passar a nós mesmos como o objeto jogador para aquele gerente de jogo. Ou melhor, não estamos passando diretamente para o gerente do jogo. Mas se você se lembra, no gerenciador de jogos, nós tínhamos a conexão aqui feita entre o gerenciador de jogo sempre que um jogador carrega no jogo para esse sinal de jogador. Portanto, não está dizendo diretamente ao gerente do jogo, mas sim emitindo o sinal para que qualquer coisa conectada a esse sinal possa responder à morte do jogador. O que significa que podem ser outros objetos. Ou dependendo de como nossos códigos ameaçam, o gerente do jogo pode não necessariamente responder a essa conexão, mas ele faz como vermelho. Então a outra coisa, é claro, é Q3. Agora, se você tivesse uma animação para o personagem morrendo, este seria um ótimo lugar para mudar para esse estado, criar um estado totalmente separado para ele. Execute a animação. Quando a animação é feito, então você q3. E assim para fazer fila para você imediatamente. Mas nós não temos essa animação, então nós vamos apenas fazer com Q3 simples e mover as coisas junto. Então eu acho que estas são realmente apenas vai
ser basicamente as duas coisas que realmente precisamos lá. Então, desde que não tenhamos erros, podemos ter tudo de bom agora. Então vamos realmente testar o jogo e ver se isso funciona. Então ainda podemos seguir, podemos nos mover para a borda, mas não podemos ver para baixo além da parte inferior da tela mais. Então vamos pular lá e ver o que acontece. Bem, parece que acabamos um jogo imediato. Agora, obviamente, é um pouco mais divertido se você tem uma animação, fazer um grande negócio com, uh, talvez alguma música, esse tipo de coisa. Mas essa é, pelo menos, a maneira mais simples de o fazer. Agora, você percebe uma outra coisa que é que com o nosso jogo sobre a tela aqui, não
é 0% transparente. Você pode realmente ver um pouco do fundo lá, que não é realmente muito ruim. Quero dizer, eu talvez eu realmente não queira que este fundo seja 100% transparente, mas como retina, não é suposto fazer isso. Então vamos rapidamente dar uma olhada naquele jogo sobre a tela. E você sabe qual é a razão. É o no quadro final onde o temporizador é parado, então eu acho que a razão para isso está no quadro final, se o tempo foi realmente interrompido. Não vai fazer a atualização final aqui. Então vamos ver se há uma maneira de atualizarmos isso. Então, se saltarmos para o jogo sobre a tela, provavelmente
podemos criar um método receptor com o temporizador. Então vamos para o nó. Vamos ver o tempo limite emitido quando o temporizador atinge 0. Sim, Perfeito. Certo, então vamos conectar isso ao roteiro do jogo. E agora temos um pouco aqui. Então, tudo o que precisamos fazer é definir a tela modular a cor e transformar esse valor final em um. Então lá vai você. Mais prática livre com conexões de sinal e você pode ver como eles ficam bastante úteis e muito fáceis de usar quando eles se tornam uma espécie de intuitivo.
30. Corte, correção de salto de jogador: Então, uma das coisas que tem estado em torno do jogo desde o início, mas nós realmente não fizemos nada com essas plataformas. Então eu realmente padrão plataforma e mecânico é a capacidade de cair para baixo. Então, uma plataforma e mecânica realmente padrão é estar acima de uma plataforma que é então assim. E ser capaz de cair abaixo dele, também, para ser capaz de revisar através dele de saltar de baixo. Então, como as coisas estão agora, se saltarmos para esta plataforma de baixo, vamos apenas bater o chapéu na plataforma, muito parecido com o celular. Então não é isso que estamos procurando. Além disso, vimos que acabamos de jogar muito rápido. Vamos mudar essa saúde de volta para três, só para que não acabemos acidentalmente um jogo de testes muito simples como esse. E agora precisamos configurar o mapa de mosaico para que, quando criarmos esses blocos, eles tenham uma colisão unidirecional para que possamos passar pelo fundo. Então, se clicarmos no mapa de azulejos e formos para o nosso conjunto de azulejos aqui, podemos clicar em nossas telhas de terreno. Vamos ampliar um pouco. E vamos procurar os azulejos que devem ter a colisão unidirecional, que estão aqui à direita. Então, se olharmos para o inspetor agora podemos ver colisão selecionada de uma maneira. Então nós só precisamos verificar isso para todas essas nove peças e quaisquer outras telhas que nós gostaríamos de ser capazes de passar por baixo. Então vamos fazer tudo isso. Agora vamos em frente e tocar no play. E podemos tentar saltar por isso. Podemos ver que somos capazes de saltar pelo chão, mas quando estamos no lado de cima, não
passamos por ele. Então vamos testar isso um pouco mais e parece que basicamente está trabalhando. Então, para que nosso personagem passe de volta para baixo, precisamos configurar algum tipo de função drop. Então neste jogo, como eu vou configurá-lo é que quando você pressionar para baixo duas vezes, o que você está para baixo é para nós agora que é S. Então ele vai soltar o personagem para baixo abaixo da plataforma. Nós não queremos apenas cair automaticamente através da plataforma porque então seria basicamente como uma telha sem colisão. Mas queremos ser capazes de sentar em cima dela, bem como cair através dela. Então, como podemos configurar uma função de queda seria com um temporizador de queda. Então vamos para o jogador e criar outro temporizador. A razão para este temporizador é que queremos verificar se foi
pressionado duas vezes em um curto período de tempo. E se assim for, então você tem sob a função de queda. Então eu vou clicar com o botão direito do mouse no jogador em um nó filho e vamos adicionar no temporizador. Então vamos chamar este temporizador, temporizador de interrupção. E eu vou definir o tempo de espera para 0,2 segundos. Isso deve ser pelo menos a duração de um ou dois quadros de animação. Então eu acho que o ponto está funcionando muito bem para mim mais cedo. Vamos para o script do jogador agora. Então você pode escolher onde você quer colocá-lo. Eu estava pensando em colocá-lo na entrada do jogador, mas isso é mais especificamente apenas para obter o movimento esquerda-direita, de cima para baixo. Então eu acho que vou colocá-lo bem abaixo dele. Então o que vamos fazer é verificar se o botão para baixo é pressionado. Então input.txt, e então vamos ver ação apenas pressionado. Então esse é o que queremos. Então precisamos escolher a ação para baixo. E se isso foi pressionado, então precisamos ver se o temporizador está funcionando ou não. Então, se o temporizador já está funcionando, isso significa que apenas pressionamos anteriormente, então devemos cair. Caso contrário, devemos iniciar o temporizador. Então, se, digamos que o temporizador está parado. Então, como basicamente como qualquer outro temporizador, mas precisamos declará-lo aqui em pronto var Schwab temporizador é igual ao cifrão sinal do dólar. Então, se ele parar, então nós queremos iniciar o temporizador. Então solte o temporizador. Caso contrário, o temporizador está em execução. Então nós queremos executar uma função drop no jogador que irá criar um segundo aqui. Agora note que não queremos que este temporizador faça loop. Nós só queremos que ele esteja em execução quando nós especificamente
iniciá-lo até a duração desse período descartado. Clique no temporizador de entrega e, em seguida, certifique-se de que um tiro está marcado. Isso é importante. Então agora só precisamos criar uma função de queda. Então eu vou colocá-lo meio aqui com as outras funções de movimento, salto, bola, salto. E, em seguida, vamos fazer a queda de função. Ok, então, para que nosso personagem
caia na plataforma quando há um colisor, há apenas para ajustar a posição do nosso personagem e nós podemos apenas fazer isso um único pixel. Então, se pegarmos o médico dot y e adicionarmos um a ele, então isso se moverá através do colisor nessas plataformas e nosso personagem cairá através da plataforma. Então, é realmente tão simples quanto isso. Então vamos em frente e tocar em Play e testar onde estamos. Nós viemos aqui, podemos pressionar S duas vezes. Nós caímos através da plataforma e ali também, deve cair por aquela. E este aqui. Então, qualquer plataforma que tenhamos configurado com essa colisão unidirecional deve funcionar para nós. E também devemos ser capazes de saltar direto através dela. Se você achar um pouco difícil de passar, às vezes você pode considerar aumentar o tempo de espera ou 2s ou 0,25 segundos. E se por algum motivo você achar que não é capaz de passar por uma das plataformas. Basta verificar o conjunto de peças e certifique-se de que a colisão unidirecional está verificada. Então isso é apenas para uma correção de bugs. Mas uma coisa que notei é que para nosso personagem tentando causar dano saltado em um inimigo, às vezes essa posição global nem sempre é consistente. Então eu acho que nós podemos ser capazes de apenas realmente nos livrar da verificação de colisão e então apenas verificar se a velocidade está caindo velocidade e deixá-lo assim. Então vamos em frente e tocar em Play e ver se isso vai funcionar para nós para que nosso personagem possa saltar. Vamos testar a partir de uma posição mais alta. Podemos fazer o seguinte enquanto salta. Ok, e depois lá também. E então vamos apenas testar novamente não deve ser capaz de causar dano de baixo. E sim, esse ainda é o caso. Então eu acho que neste caso mais simples é melhor. Então, eu vou deixar essa posição, dar uma
olhada nisso. Uma vez que às vezes a posição da caixa de sucesso pode estar um pouco abaixo da caixa de dano. Você também pode ter um ajuste maior em favor do jogador. Mas mesmo se você fizer isso, ainda pode
haver exemplos extremos onde os personagens acertam caixas. Por alguma razão, dez pixels abaixo da caixa de dano inimigos. Portanto, esta parece ser uma solução muito mais simples. Está bem? E agora podemos fazer um teste final, certificando-se de que todas as nossas plataformas funcionam e que podemos danificar os inimigos corretamente. Então isso parece ser muito, muito mais fluido e apenas melhor em geral. Então, isso é praticamente tudo para este vídeo rápido.
31. Transição de nível e criação de níveis 1 e 2: Neste próximo vídeo, eu gostaria de realmente criar um nível um, criar um Nível 2, e então criar uma maneira para nós irmos entre os dois. Então, como você desenha seu nível depende de você. Nós já criamos todas as ferramentas para isso. Então, se você quiser adicionar alguns blocos e plataformas extras, podemos ir para o mapa de mosaico. E, claro, criar porcos irritados adicionais será
apenas uma questão de duplicá-los ou arrastar a cena do nosso sistema de arquivos e criar novos pontos de passagem para eles irem entre eles. Então, primeiro, como um truque que você pode usar, você pode usar a função select quando você tiver o mapa de mosaico selecionado. E podemos apenas selecionar esses azulejos. Vou controlar X ou Comando X no Mac. E você pode ver que você pode colá-lo. Mas, na verdade, vou me livrar de tudo isso. Então vamos voltar para a ferramenta de lápis. Eu só vou ir em frente e desenhar o que eu preciso. Ok, então agora eu vou ir em frente e criar o Nível 2. Acho que a maneira mais rápida de começar, será duplicando o nível um. Então eu vou para a minha pasta de mapas, clique com o botão direito do mouse nível um, duplicar isso, e apenas meio que chamá-lo de nível 2. Agora podemos abri-lo e, obviamente, vou renomear o nó raiz para o nível 2. Então, para tornar óbvio que é um nível diferente, a primeira coisa que vou mudar, será o pano de fundo. Então vamos mudar isso para,
suponho, vamos ver o fundo de cor roxa. Então agora o nível um e o nível dois são distintos um do outro. Deixe-me ir em frente e criar um nível 2 cenários, basicamente indo para adicionar e criar um laboratório, um um, um nível 2, e nós temos um nível 3, mas isso é realmente apenas dito que o nível também, você pode fazer a transição para Nível 3. Então agora vamos em frente e criar o nosso caminho para o personagem passar do nível um para o nível dois. Então eu vou usar a área para D para o interruptor vai acionar esse evento onde saltamos níveis. Então, vou clicar com o botão direito do mouse no nível 1, adicionar um nó filho. Queremos a área 2D na parte inferior. Vou mudar o nome disto e podemos chamar-lhe “mover”. Podemos não necessariamente chamá-los de níveis, por isso queremos ser um pouco genéricos aqui, além da pasta é chamada de mapas. Com a jogada do Matt, vou guardar isto como uma nova cena. Clique com o botão direito em Salvar cena E vamos colocá-lo em zonas. Uma vez que esta é uma área que desencadeia algum tipo de evento, tipo como a parte inferior do forno GameOver tela. Então vamos salvar isso aqui e então vamos mergulhar na cena. Então, para a nossa área de movimento do mapa, vamos precisar de um desencadeamento de uma forma de colisão. Então vamos fazer uma colisão em forma de 2D. Vou tornar o padrão para isso uma forma de retângulo. E então podemos vê-lo em nosso nível um. Então eu vou selecionar o movimento do tapete e vamos segurar Alt e movê-lo por aqui. Então claramente isso não será uma forma de colisão grande o suficiente para realmente justificar ser o fim do nível. Então, provavelmente vamos fazer isso maior. Mas outra coisa que queremos fazer é realmente dar aos jogadores uma maneira indicar que é o fim
do nível para que eles saibam o objetivo que estão atirando. Então, dentro da arte para este jogo, podemos verificar o nosso pixel aventura um e ir para baixo para itens e ponto de verificação. E podemos encontrar uma bandeira muito legal que podemos usar para o final deste nível. Então eu vou para a cena de movimento do mapa, e vamos adicionar um sprite aqui. Então, se eu arrastar este ponto de verificação para a tela, podemos ver que há um monte de quadros de animação para isso. Então eu vou apertar o Controle Z para desfazer a adição do spray. E um nó perfeito para nós seria um nós de sprite animado. Então eu vou procurar por isso. E então vamos pegar essa bandeira ociosa e colocá-la em quadros. Bem, primeiro temos que criar um novo sprite frames. Então clique em quadros, esvazie novos quadros sprite. E agora vamos adicionar a animação ociosa da bandeira. Então eu vou renomear o anúncio de animação e eu vou clicar aqui, adicionar quadros da folha de sprite. Então ele vai para itens, pontos de controle, ponto de controle preto, ocioso. Ok, e vamos pegar todos esses quadros. Parece que há 10 deles. Então, queremos dez horizontais, uma vertical. Em seguida, selecione Limpar todos os quadros, adicione-os. E, em seguida, certifique-se de que esta animação está em execução e coloque o FPS em 20. Agora também vamos querer mover esse objeto sprite animado para cima. Então eu vou segurar Alt e movê-lo para cima. Ter estalo pode ajudar aqui. Então vamos também pegar a forma de colisão e movê-la para cima também. E se você precisar, em qualquer momento, você também pode desativar o Snapping. Não é um requisito. E queremos redimensionar a forma de colisão para ser um pouco maior que a nossa bandeira. Então este será um bom final do ponto de nível para o nosso personagem alcançar. Agora podemos olhar para o Nível 1 e podemos posicionar esta meta de movimento do mapa. Acho que vou colocar por aí. Agora, se voltarmos ao nosso movimento do mapa, podemos definir as camadas de colisão
que precisamos, que basicamente será pegar quando o jogador entrar nele. Então colisão aberta à direita, como fizemos em todas as outras áreas. Desligue a máscara do mundo e a camada do mundo e, em seguida, coloque o jogador como a máscara. E você também pode desligar mono terrível porque isso vai ser, porque isso vai ser um evento unidirecional. Então só vamos checar o jogador. Ok, então agora só precisamos adicionar um script simples para o nosso mapa mover. Então eu vou anexar um script que é criado. E neste script vamos precisar de um, receber um método que vai vir da área 2D. Você provavelmente sabe onde eu estou indo com essa forma de corpo inserida na seção de nó à direita. Forma do corpo entrou conectar-se ao script de movimento do tapete. E aqui deve ser apenas os jogadores que entram. Quando o jogador entrar nesta área, queremos mudar de nível. Então podemos ser vistos ponto mudar a cena 2. E vamos precisar de uma cena cheia aqui. Então, como podemos definir nossa cena embalada para o script é criar uma variável de exportação. Então, vamos exportar um pacote visto variável. E podemos dizer cena de destino. E agora é claro que precisamos usar essa variável como nosso parâmetro. Então, cole isso lá em baixo. Agora, se clicarmos em nosso movimento do mapa, devemos ser capazes de ver que podemos definir um destino visto aqui. Então, no nível um, eu vou pegar nosso movimento do tapete e vamos definir o destino visto como nível dois. Então você pode clicar aqui um lótus vendo. E claro que vamos para o nível 2 do Mapas. Você pode ver uma pequena prévia para a nossa cena lá. Vamos para o nível 2 e vamos adicionar uma cena de movimento do mapa. Vamos colocá-lo bem aqui para o fim deste nível. Certifique-se de que não está no mapa de mosaico, é claro. Mas em termos de hierarquia, você pode querer acima do jogador para que ele mostre atrás do jogo em vez de na frente dele. Então, vamos mover isso. Ok, eu vou desligar o estalo aqui para que possamos acertar. Isso parece certo. Vamos pegar o destino visto aqui e torná-lo nível três, mapas nível 3. Ok, agora nós podemos tipo de jogar testar nosso jogo aqui um pouco. Vou tocar no play. Então eu vou correr por este nível bem rápido. Ok, tenho que passar por este porco sem sofrer muito estrago. Apenas tipo de ignorá-lo e fazer a função drop-down para chegar aqui, Eu exigi que intencionalmente e apenas um pouco de um salto preciso lá. Vamos para o segundo nível. Está bem, e deparou-se com esta questão mais cedo. Então, verifica-se que verificar se um objeto não é nulo não é bom o suficiente aqui. Então o que você realmente quer usar aqui, e isso está de volta no script do gerenciador de jogos que configuramos. A instância é válida? E, claro, isso vai ser jogador ativo. Então, se você criou um objeto em seu jogo e você quer
ter certeza de que ele ainda está lá antes de executar algo. Este é o código certo. Se você verificar, se ele não for igual a nulo, então isso pode acabar correndo em vez disso, que obviamente não vai funcionar quando os jogadores ativos já foram removidos da cena. Então agora podemos ir em frente e executar novamente o nível e ele deve ser executado desta vez. Então vamos nos vingar daquele cara. Observe o ataque de dano. Isto é um pouco complicado aqui em termos de design de jogo. Isso pode ser um pouco injusto, mas ainda estamos testando a quantidade. Então vamos para o segundo nível e, em seguida, boom, entramos no nível 2. Claro, podemos querer uma transição de algum
tipo, como fizemos com o jogo sobre a tela. Aqui temos que saltar para baixo, ok, temos um porco zangado para lidar com o salto aqui em cima. E aqui é um pouco complicado porque temos que ficar longe do fundo da tela. Então isso vai exigir um salto duplo. E então temos que continuar pulando por aí fora. Parece ser um pequeno inseto lá com aquela colisão de sentido único. Acho que está na direção errada. Então eu vou ter que verificar isso porque como você pode ver, ele pode cair por lá, mas eu não posso voltar para cima. E então para o resto do nível 0, por que eu tenho que consertar o salto da câmera? Mas você pode ver que eu fui para o nível três lá e, mais uma vez, a colisão de sentido único é a direção errada lá. Então vamos consertar as bandas da câmera e nível 2, eu vou bloquear o mapa de azulejos para que eu acidentalmente não mexa com isso. Vamos pegar no canto superior esquerdo e movê-lo para aqui. Na verdade, deve estar alinhado com o lado esquerdo. Então esse é o nosso limite. E depois aqui em baixo. E, em seguida, aqui na parte
inferior direita , iria configurar isso para ser bem ali, eu acho. Ok, então aqui está um problema quando você está construindo seus mapas de mosaico. Você tem que ter certeza de que você não girar acidentalmente seus azulejos. Então você pode ver aqui que essas plataformas estão obviamente indo para baixo. Então, se você pressionar um S e possivelmente algumas outras teclas como Z e X no seu teclado, você pode realmente girar os blocos que você está colocando. Então, se você quiser um bloco unidirecional que vai muito basicamente de baixo,
você pode saltar para cima, então você quer ter certeza de que ele está virado para o topo assim. Mas se você acidentalmente apertar a tecla Z, você vai estar jogando o porquê para baixo. E então isso vai inverter a direção para suas colisões unidirecionais. Então, da mesma forma, eles vão vir aqui e corrigir este porque ele não deve estar no topo, mas virado para o fundo com z, mas deve ser apenas superior virado. Então isso deve evitar que o personagem caia acidentalmente
pelo chão aqui sem realmente fazer o movimento de queda. Isso seria muito irritante. Então vamos mover esta bandeira um pouco para baixo. E agora essa plataforma deve funcionar como esperado. E da mesma forma, no nível três, é meio bobagem se jogarmos o jogador direto no oceano aqui. Então vamos consertar esse também. Então vamos ver o título automático. Vamos colocar esta plataforma e remover a que está no topo. Então lá vamos nós. Isso deve resolver esse problema e até aprendemos algo no processo. Então agora podemos ir em frente e testar o jogo mais uma vez. Agora que consertamos os limites da câmera e fixamos as direções da plataforma. Está bem. Então chegamos lá em cima, não sofremos nenhum dano ficando assim. E chegamos ao nosso nível 2. Ok, sofreu alguns danos, eles vão fazer o salto complicado. E tudo bem, lá vamos nós. Agora isso está funcionando corretamente. E é só terminar o jogo e osso. Está bem. Tudo está funcionando bem.
32. Interface de saúde: Ok, em seguida, vamos criar uma interface de usuário de saúde simples para que
possamos mostrar a saúde do jogador a qualquer momento. Então eu vou até a camada de lona. Então, se quisermos manter as coisas simples, podemos apenas adicionar um controle simples e, em seguida, este controle vai ser a barra de saúde. Então, abaixo da barra de saúde, vamos precisar adicionar um retângulo de textura. Então, vou clicar com o botão direito do mouse aqui na barra de integridade em um nó filho e, em seguida, escolher textura, correto. E então para a textura dentro desta textura, vou usar o indicador de saúde do kiwi. E então eu basicamente tirei essa imagem da fruta kiwi do pixel Adventure One. Você pode ver esta imagem aqui. Acabou de extrair o primeiro quadro e é 18 por 18 pixels agora. Então eu trago isso para a textura e ele vai aparecer lá. E se mudarmos o modo de estiramento para telha, podemos continuar repetindo isso tanto quanto precisamos. Então, se controlarmos o tamanho do nosso vect textura, tipo assim. Mas em código, então podemos mostrar
quantos pontos de saúde o jogador deixou em qualquer ponto. Vamos nos livrar dessa textura e, em seguida, vamos tocar e meio que certifique-se de que ele aparece lá no canto superior esquerdo. Talvez também queiramos um pouco de margem. Então eu posso pegar a barra de saúde e podemos dar-lhe uma margem superior e esquerda de cinco. Ok, isso parece posicionado um pouco melhor agora. Então agora a barra de saúde vai precisar saber quantos pontos de saúde o jogador tem em um determinado momento. Então ele sabe quantas palavras-chave mostrar. Um é igual a um kiwi. Então eu vou adicionar um script à nossa barra de saúde. o botão direito no script anexado à barra de integridade E vamos ver, não vai estar nos mapas. Isso deve ir para a pasta de interface do usuário. Então barra de saúde, isso é aberto e criar. Então, em nossa barra de saúde quando o script é carregado, podemos tentar encontrar o jogador que deve estar no gerenciador do jogo. Então eu vou colocá-lo em uma leitura funk. E nós vamos basicamente definir o jogador ativo igual ao jogador ativo do gerenciador de jogos. Então vamos criar um jogador ativo var. E é devido flare é igual ao jogador ativo do jogo manager ponto. E isso não é, vamos criar um sinal para o nosso jogador, mas em vez de colocá-lo no player, vamos realmente colocá-lo no caractere dot g, d. Então qualquer personagem pode emitir este sinal, mas nós não necessariamente precisamos se conectar a para cada objeto, como os porcos furiosos. Então vamos criar um sinal de caráter. E isso vai ser mudado. E vamos passar por uma nova saúde aqui. Então, antes de atribuir o valor, a nova saúde para a variável saúde, podemos ver se eles são os mesmos. E se não, então emitimos saúde alterada porque o número é diferente agora. Então, se mais não for igual ao valor, então emitiremos a saúde do sinal alterado e passaremos o valor como o novo total de saúde que vamos enviar para qualquer coisa conectada a este script. Então, agora com nossa barra de saúde, podemos nos conectar a esse documento de camada ativa e promulgar. E queremos nos conectar à saúde alterada. O objeto receptor é nós mesmos que casca de saúde. E vamos criar uma mensagem sobre saúde alterada. Desta forma, usando um sinal em vez de verificar a saúde em cada quadro, é apenas um pouco mais eficiente. Então vamos escrever func sobre saúde mudou aqui. E isso realmente vai levar a nova saúde. E então vamos fazer referência à nossa textura rect. Então aqui em cima eu vou fazer em pronto nosso extra destruído é igual a textura do sinal do dólar ereto. E multiplicaremos a largura dessa textura em rack igual
à nova Saúde vezes 18 pixels porque essa é a largura da imagem sprite. Então certifique-se de que você é um vetor de textura é igual ao número de saudável que eu multiplicei pela largura do seu tamanho de imagem. Então vamos fazer textura destruída. Pontos. Vamos ver, seria com, ou podemos realmente clicar nele e apenas verificar. Então, então eu acho que isso é o tamanho do ponto destruído ponto x. Então vamos encontrar esse ponto destruído tamanho ponto x. e vamos fazer isso igual a largura Sprite vezes a nova saúde. E nós podemos fazer uma variável aqui para que possamos definir o sprite com no inspetor. Então vamos ver, exploit ENT estão certos, largura é igual a 18, já que esse é apenas o padrão que estou usando. E podemos ver se isso realmente funciona. Então eu vou em frente e tocar no play. Está bem. Vimos aquilo ali. Vamos ver o que acontece quando ele sofreu danos. Nada ainda, porque esqueci o sublinhado aqui em cima. Então esse é um método que não existe. Agora eles têm o mesmo nome. Então vamos sair e tocar no Play e ver se conseguimos pôr isto a funcionar. Ok, nós levamos o estrago. Vamos continuar. Inválido, índice destruído na textura. Então, parece que você realmente quer sublinhar o tamanho. E então podemos definir o valor x disso. Então o tamanho do vetor é um vetor dois e nós só nos preocupamos com o x. então nós estamos configurando isso lá. Vamos em frente e tocar no play e ver se isso conserta tudo. E sim. Está bem. Isso pareceu funcionar. - Sim. Está bem. Ainda temos uma saúde e depois, é claro, depois disso, perdemos o jogo, mas não está atualizando com essa última saúde. Então, parece que com as configurações padrão, ele não pode realmente ir menos do que uma imagem de textura. Então, provavelmente há um punhado de maneiras de resolvermos isso. Mas eu acho que a maneira mais rápida que vem à mente
seria apenas desabilitar a textura em rack se a saúde for 0. Então, se a nova saúde é, digamos menor ou igual a 0, então vamos apenas levar a textura ereta, visível e vamos definir isso como falso. Senão. Eu acho que se alguma vez atingimos 0,
mas, em seguida, por algum motivo
ou um maior, ou apenas dizer que é visibilidade é igual a verdadeiro. Então, agora podemos tocar no Play. E vamos ver o que acontece. Certo, primeiro, definimos a saúde para 2, então ela se expandiu, desce, e então agora é desativada completamente porque a saúde está definida como 0. E agora vendo isso no início do jogo, ele realmente só mostrou um. Precisamos de um pouco mais de código. Então, quando isso é configurado, nós devemos realmente definir a Barra de Saúde para ser igual à vida inicial do jogador. Então vamos fazer isso uma vez também. Nós vamos querer a saúde do jogador,
assim como a saúde do ponto do jogador ativo. E, teoricamente, não precisamos mais manter uma referência a isso já que estamos realmente usando o sinal para responder a ele. Então x2 bar jogador ativo, o jogador se conectar. Na verdade, apenas um jogador ativo var conectado. Então, obtemos o jogador ativo, nos conectamos à camada ativa. Nós configuramos a barra para a vida do jogador atual e sempre que o jogador sofrer dano, nós respondemos a isso. Ok, agora tudo deve estar funcionando bem. Então, no início do jogo, nós temos três pontos de vida, então não, ele se expandiu para isso e nós recebemos um dano. Vamos tomar outro dano. E agora, bem, se perdermos nossa terceira saúde e é o fim. Então é basicamente assim que montamos a barra de saúde. Apenas certifique-se de salvá-lo como uma cena para que você possa reutilizá-lo em todo o jogo. Então eu vou bater para cima, eu vou colocá-lo em UI saúde cena Bardot e podemos ter certeza de que ele está nos níveis futuros. Mas para ir um passo além disso, acho que uma boa maneira de fazer isso seria configurar uma camada base de tela que usamos para cada jogo. Então eu vou chamar este jogo UI. E vamos criar uma cena a partir deste ramo tão seguro como visto, e este será o nosso objeto pai da interface do jogo. Então podemos ir para o nível 2 agora. E eu vou cortar isso fora. E vamos cortá-lo do nível 3 também. E então nós vamos apenas colocar no jogo UI visto. Se precisarmos adicionar algo a todos os níveis do nosso jogo agora, tudo estará em uma única interface do usuário. E se você precisar ver qualquer uma das crianças em qualquer momento do tempo,
você pode clicar com o botão direito do mouse na interface do usuário do jogo e nas crianças editáveis do UX, e ainda poderá ver a Barra de Saúde e o jogo na tela. Portanto, certifique-se de que seus níveis estão salvos. E se você bater em play, espero que ele ainda funcione e tudo mais. Então vamos bater. Certo, e vamos pular para o próximo nível. Nível VSA, nosso reinício de saúde porque é um novo jogador. E bem, é basicamente isso aí. Agora, quando o nível termina e não recebemos dano para realmente causar a derrota. Também podemos querer adicionar apenas a remoção dessa barra de saúde também. Então eu acho que o que podemos fazer com nossa barra de saúde é apenas responder
ao jogo sobre evento do nosso gerente de jogo. Já que temos que fazer referência ao gerente do jogo no não preparado do nosso Health Bar. De qualquer forma, podemos muito bem apenas referenciar este sinal e ter um jogador no morreu ou no GameOver. Então vamos ao nosso ajudante. E quando tivermos o Game Manager, também
podemos nos conectar a isso. Então vamos ver um game manager dot connect game over, self on game over. E colocar o sublinhado lá para um método receptor e vamos criar esses métodos receptor. Então função sublinhado no jogo over. E nós só precisamos pegar a visibilidade do vetor de textura e definir isso como falso. Então vamos copiar este código, colá-lo lá dentro. E agora, se acabarmos um jogo por qualquer outra razão, então o jogador sofrendo dano, como por exemplo, está caindo do limite aqui. Então isso vai mostrar invisível, que é o que esperaríamos.
33. Configurando o Bee Enemy: Então nesta parte, que pode ser a última para o curso, vamos construir um segundo inimigo, uma
espécie de atividade mais divertida. E o inimigo que vamos criar é um B que voa por aí com um projétil, será capaz de reutilizar parte do mesmo código de porco furioso, possivelmente movendo parte dele para o script inimigo para que seja reutilizável. E então vamos adicionar coisas extras a ele. Obviamente projéteis ou algo que ainda não fizemos para este jogo protótipos, então precisamos adicionar isso. E assim como o porco irritado, as abelhas também vão se mover entre pontos de passagem, mas também será capaz de se mover verticalmente. Eles não vão apenas para a esquerda e para a direita, e eles também não vão responder à posição do jogador da mesma forma que oporco irritado faria onde
o jogador
entra nesta área e, em porco irritado faria onde
o jogador seguida, o peg irritado se move mais rápido. Então podemos mover o código waypoint para a classe inimiga para inimigos que vão usar o waypoint. E então podemos fazer com que cada um
deles tenha seu próprio método de movimento onde eles descobrem o quão rápido eles estão se movendo e em que direção. Então vamos em frente e abrir o roteiro do Pig furioso. Então, basicamente, vamos pegar tudo aqui e movê-lo para o script inimigo como uma função chamada Waypoint Blue. Então vamos em frente e escrever isso aqui e vamos passar delta para ele. Então agora em nosso script inimigo, vamos subir aqui e podemos escrever função waypoint move, que vai pegar delta e colar isso lá. Então, quando fazemos isso, podemos ver que não temos a posição de ponto de passagem, então precisamos tirar isso do porco furioso também. Então o B ou outros inimigos vão ter todas essas coisas aqui. Waypoint chegou a distância para mudar waypoints, uma matriz de waypoints para ir entre a posição inicial do waypoint, índice disso, e provavelmente também enfrenta a direita também. Então vamos cortar isso no roteiro inimigo. E podemos posicionar isso aqui em cima. Então, enquanto o inimigo o tiver,
isso vai esclarecer todos os problemas que temos para o porco furioso também. Então, obviamente, temos um erro onde não temos esse método de índice de waypoint definido, então precisamos tirar isso do porco irritado também. Então vamos cortar e colar isso no roteiro inimigo. Outro erro que temos é para nossos porcos movimento específico. Então, em vez de tudo isso e o script inimigo, vamos criar uma função que
podemos implementar em cada inimigo específico para seu próprio cliente. E então podemos chamá-lo de velocidade de movimento. E isso vai tomar o delta e também a direção em que estamos nos movendo. Então calculamos isso descobrindo para onde o waypoint vai. Então, se estamos fazendo um movimento de waypoint,
estamos nos movendo em direção àqueles que estavam se movendo em direção a esses waypoints. Então agora só precisamos ter certeza de que temos uma função virtual aqui embaixo. Então obtenha velocidade de movimento. Então isso vai tomar delta n direção. E se executarmos isso, vamos querer imprimir um erro porque ele não foi implementado. Então você pode apenas escrever uma mensagem de erro como essa. Então a idéia é se quando o script está realmente em execução, ele executa esta versão inimiga do método, nós obtemos um erro. Devemos implementá-lo no personagem de nível superior, aquele porco irritado ou o B. Então isso está apenas nos dizendo, Ei, precisamos escrever mais código para que esta função possa funcionar corretamente no inimigo final. E isso aqui vai retornar
a velocidade para que possamos usá-la para o nosso movimento e deslizamento. Então vamos apenas colocar nossa velocidade igual a velocidade de se mover. Ok, então agora para tudo que nós cortamos fora que deve ser aqui. Só levamos isso para um porco raivoso. Então vamos para o porco irritado e implementar essa função. Tão sublinhado, bom. Mova para velocidade, direção delta. E então basta colar esse n. E em vez de definir a velocidade, nós vamos estar devolvendo isso. Nós também podemos querer tirar a velocidade var daqui porque nós realmente não precisamos mais dela no script no momento. E certifique-se de que isso é uma guia para a esquerda. Então, para o outro bit de código, nós estávamos usando isso antes para determinar se ele deve se mover para a esquerda e para a direita. Uma vez que estamos passando na direção de frente para esta função, vamos colocar isso em dois lugares diferentes. Então, para trás e sente-se e o script inimigo, eu vou colar isso para que possamos usá-lo para verificar se ele deve ficar virado para a direita ou para a esquerda. Então, por último, precisamos obter essa velocidade retornada, armazená-la em uma variável aqui. Então velocidade barrada é igual a obter velocidade movida. Passamos isso aqui em baixo. Sprite animado. Vamos mover isso do porco furioso para a nossa classe inimiga, assim como para a árvore de animação também. Praticamente todos os inimigos vão precisar dos dois. Então vamos colá-los lá dentro. Ok, então a seguir devemos voltar para o porco irritado e ter
certeza que os erros são resolvidos aqui. Aqui podemos ver um de velocidade y está sendo adicionado à gravidade do jogo. Então o personagem basicamente ainda tem sua gravidade. Então, por essa razão, o que realmente devemos fazer aqui é definir a nova velocidade igual a esta velocidade MOOC. E, em seguida, ter uma variável aqui em cima que todos os tipos de inimigos serão capazes de acessar. Então, se nossa velocidade e isso será um vetor para, poderíamos até inicializá-lo para um vetor para 0 por padrão. E então os movimentos deslizam, eu acredito que retorna a velocidade. Então, se tivermos alguma colisão. Deve atualizar a velocidade para nós também. Então agora a velocidade é declarada aqui. E se formos checar o porco irritado e aqui, então essa velocidade vai usar a velocidade y do inimigo. Outra maneira de fazer isso, se você acha que é um pouco menos confuso, é que poderíamos passar a velocidade atual e como uma variável e então usar isso no script e devolvê-lo de volta para fora. Isso deve funcionar por enquanto, então não estou muito preocupado com isso. Então agora o que devemos realmente fazer é garantir que a cavilha irritada funcione da mesma forma que antes. Mesmo que tudo o que fizemos foi mover coisas do porco furioso para o script inimigo. Então vamos em frente e tocar em Play e testar isso. Sim, parece que nosso inimigo ainda está se movendo. Então agora o que podemos fazer é pegar nossa cena de porcos furiosos e duplicá-la e o sistema de arquivos e usar isso como base para o nosso B. Então eu vou descer aqui onde temos cena de porco furioso. Eu vou fazer um Alt D e duplicar isso e vamos chamar isso de B dot t SCN. Então isso é o nosso ser visto. Agora podemos abrir essa cena. E primeiro vou renomear o personagem para estar aqui no topo. Então, em seguida, podemos descer cada um destes e remover e adicionar o que precisamos. Primeiro, não precisamos de uma zona de detecção de raiva no script. Então vou me livrar completamente disso. E se você ver erros aparecerem aqui embaixo, não
é deixar você ver o inspetor, basta mudar para outra cena e voltar. E agora isso deve para cima para que possamos remover a cena de detecção de raiva. Para o sprite animado. Vamos querer redefinir isso para os sprites do nosso personagem B. Então eu sei que o bebê tem uma animação de sucesso e animação
ociosa em um ataque ele e excluir os que não são relevantes para nós aqui. Então vamos fazer essa. E agora podemos adicionar N e atacar. E certificando-se de que são 20 FPS. A animação Hit vai manter em 10 FPS os homens e fazer a mesma coisa para um hit e ataque. Então, vamos excluir todos os quadros atuais, ir para bater cinco horizontal, um vertical, selecionar tudo, adicionar animação de ataque cada quadro. Então, oito horizontais, um vertical, selecionar tudo em, Ok, e lá está nossa pequena animação de ataque tocando sua próxima na árvore de animação. Podemos configurar isso para nosso novo personagem também. Então, primeiro, não há variações de acertos. Haverá apenas uma animação de sucesso para este personagem, que
possamos nos livrar de tudo isso. Em seguida não vai ser qualquer zona de detecção de jogador. Há apenas uma animação ociosa que vamos usar para a abelha voando por aí. Então também não precisamos disso. Mas vamos precisar de mais um tiro para um ataque. Portanto, isto irá antes de acertar um tiro, receber dano sendo atingido tem prioridade sobre fazer um ataque. Então, um tiro, e então este é o ataque, graças à saída alimenta a entrada para isso. E precisamos da animação Hit para entrar aqui. Vou apagar isso por um segundo. Precisamos atualizar nosso player de animação. Então, no player de animação, indo para renomear hit um para apenas hit. E, em seguida, para a animação, certifique-se de que esta está selecionada como HIT. Podemos deixar a animação Hit concluída porque vamos criar uma versão disso para o nosso B também. Aperte dois, vamos apagar isso. E então Ídolo, acho que podemos deixar esse como está. Apenas certifique-se de que eu sempre a animação correta reproduzindo no sprite de animação e, em seguida, executar, nós excluímos isso e, em seguida, andar. Podemos deletar isso ou você pode simplesmente renomeá-lo para atacar. Então vou mudar o nome para atacar. E eu sei que mais tarde isso vai ser um tiro único. Então eu vou mudar a duração para 0.4 e não fazer loop 0.4 porque ele tem oito quadros em 20 quadros por segundo. E então aqui embaixo, nós podemos adicionar uma faixa chamada Method Track no B. Mas nós não criamos o método, então nós realmente não podemos adicioná-lo lá ainda. Então nosso ocioso se parece com isso. Nosso HIT terá a animação terminada acontecendo lá, e então o ataque é por aqui. Ok, então agora de volta na árvore de animação para os tiros, certifique-se de que eles estão desaparecendo e desaparecendo tempo é 0. Queremos que eles sejam reproduzidos imediatamente após entrar nessas animações. Isso é importante. E, em seguida, para o primeiro off, eu vou mudar a animação padrão para crianças ociosas. Lanterna na tela o tempo todo é bastante irritante. Então aqui em baixo, vamos clicar com o botão direito do mouse, adicionar uma animação e vamos fazer hit, conectar isso a um tiro. E então para o único tiro aqui, o ataque, queremos a animação de ataque. Então, ataque de animação, conecte isso no único tiro. E então, para todos os outros casos, só queremos que ele faça a animação ociosa. Então conecte isso aqui. Então esta é basicamente a nossa árvore de mistura de animação mais simples ainda. Apenas certifique-se que você tem 21 tiros. O acerto vai antes do ataque e ambos têm o tempo de desvanecimento definido como 0. Eu então conecto as animações conforme você precisa. Ok, então este personagem ainda vai ter uma
caixa de salto ferido já que não estamos mais verificando para a posição nas caixas feridas, eu acho que apenas fazer uma forma maior pode realmente ajudar um pouco para o jogador bater o personagem . Eu não sei, eu só vou torná-lo um pouco maior lá para
que haja mais área para o jogador bater. Então eu estou apenas pegando o valor y e definindo como três. Não é realmente necessário, mas, mas eu não acho que dói também. A caixa de colisão inimiga ainda usará isso para o nosso inimigo. Todos os inimigos vão ser capazes de encontrar o jogador para causar dano a ele. Este personagem também será capaz de lançar um projétil. Ok, então agora nós precisamos separar o script Pig irritado deste b. Então se eu clicar em desanexar e eu vou clicar com o botão direito do mouse em anexar um script. Então estamos criando um novo script na pasta de personagens inimigos. Vai se chamar BDD. E isso realmente vai herdar do inimigo. Então vamos mudar aqui e vamos digitar o inimigo, apertar Criar. Então agora, quando criamos o script no topo, ele estende o inimigo. É isso que queremos ver. Vamos cortar isso. E agora podemos começar a trabalhar neste script B. Assim como outros personagens do jogo, ainda
vamos ter estados em certo sentido. Então eu vou colocar estado
enum e os três estados para este personagem vai ser ocioso. Acertar quando sofrer dano e atacar quando estiver reproduzindo a animação de ataque, vamos nos certificar de que o inimigo não pode se mover enquanto estiver atacando. Para este script, eu acho que vai fazer com que o inimigo não se mova enquanto ele está atacando apenas wilds e o estado ocioso, embora você poderia tê-lo atacando movimento ao mesmo tempo. Depende do que você quer. Também vamos precisar de uma velocidade para o personagem se mover. Então exportar, flutuar, var, Lightspeed, e eu vou definir isso para 50 por padrão. Então mais tarde vamos montar um projétil, é claro. Então podemos incluir isso como algo que podemos gerar uma instância de para o nosso B por ter uma variável de cena empacotada de exportação. Então exporte cena cheia. E então nós apenas dizemos ao B com esta variável o que viu do nosso projeto. Isso é um TSC e arquivo que queremos criar uma cópia, e isso seria apenas um projétil var. Nós também vamos precisar de uma variável de estado atual e, em seguida, uma função de estado atual definido. Então acho que podemos colocar isso no inimigo também. Então, este caractere também vai precisar de uma variável de estado atual e um set get para o estado atual definido. Então este caractere também vai precisar de uma variável de estado atual e uma função setter de estado atual definido. Então podemos considerar puxar essa linha de código de porco irritado para o inimigo para que basicamente cada personagem tenha um estado atual para definir. E então podemos definir um método de estado atual de conjunto personalizado para cada um. Então, um porco furioso, eu só vou puxar isso para fora. Assim como as paredes do jogador vão precisar de um estado atual, sua variável. Então, um estado atual variável, e vamos definir isso igual ao ponto de estado AIDL. Por padrão, vamos escrever um conjunto de funções para o seu estado atual definido. Então, quando entramos em um estado, queremos que certas coisas aconteçam para esse personagem. E também vamos precisar de uma direção de ataque e um alvo de ataque para lançar projéteis. Então o, então a direção vai ser a direção para lançar o projétil n. E então aqui embaixo nós vamos ter o alvo de ataque. E aqui em baixo vamos ter o alvo de ataque. Quando um jogador entra no raio do B para atacar, ele vai estar travando para aquele jogador. E ele vai continuar lançando projéteis
naquele jogador até que o jogador saia da zona de ataques. E nós vamos querer que o projétil seja lançado periodicamente, não em cada quadro, mas mais como uma vez a cada segundo ou você pode até mesmo abrandar mais do que isso. Então vamos querer um temporizador, então eu vou clicar com o botão direito do mouse em nosso inimigo em uma nota infantil, vamos criar um temporizador. E isso pode ser atacado temporizador. Certifique-se de que é um tiro único à direita. E você pode fazer o tempo de espera o tempo que quiser entre lançamentos de projéteis. Então, um tempo de espera de 1 segundo significa que ele lança um ataque por segundo. Agora podemos obter referência ao temporizador de ataque. Então var não pronto, temporizador de ataque é igual a temporizador de ataque sinal de dólar. E há alguns outros nós e nossa hierarquia que precisamos ter acesso,
como a caixa de colisão inimiga para que possamos ligá-la e desativá-la dependendo do estado. Então var não pronto, colisão inimiga, caixa de
hit é igual ao sinal do dólar, colisão
inimiga bater dólares. Ok, então a seguir podemos escrever nossas funções de processo físico. Então sublinhar o processo físico, nós só queremos que o personagem se mova em um estado, então vamos combinar o estado atual. E se o estado estiver ocioso, então vamos nos mover, então estado ponto ocioso, e então vamos fazer waypoint move delta. Então lembre-se que nos requer para configurar como o personagem se move se
voltarmos para o inimigo e podemos ver Waypoint mover tem essa função, precisamos implementar. O que fazer isso em um segundo, mas tudo o resto sobre mover-se entre pontos de passagem é cuidado para nós. Então metade disso já está escrito. E é apenas uma espécie de economia de tempo como os quadros estão sendo executados. Se estamos no estado ocioso, então podemos começar a atacar o jogador se ele estiver lá. Então eu vou colocar um comentário aqui para nos informar para adicioná-lo mais tarde. Então vamos marcar isso em um minuto. Agora vamos trabalhar no movimento do nosso personagem. Vai ser super central para o B. Então estamos implementando velocidade de movimento, que leva Delta e, e direção. Tudo o que precisamos fazer é retornar a nova velocidade, que será a velocidade da mosca vezes direção. Então a direção é basicamente a mesma, mas a direção vai estar apontando para o waypoint. Então eu chutei ele apenas se move em direção ao waypoint 1 seu fim o estado ocioso na velocidade da velocidade do vôo. E isso é tudo o que precisamos para isso. Devemos também implementar uma função get hit. Isto vai sofrer danos e flutuar. Então todo inimigo precisa ter alguma versão disso. Então self.age menos é igual a dano e mudará o estado atual para o ponto de estado atingido. Precisamos implementar definir estado atual, estado novo. Agora precisamos escrever esta função aqui. Então função definir estado atual e este seria novo estado 3 pode certificar-se de que o estado atual é igual ao novo estado. E, claro, vamos adicionar mais aqui para quando nossos personagens entrarem em um determinado estado, queremos que as coisas aconteçam. Mas vamos ver onde estamos. Mas vamos ver onde estamos agora. Então vamos para o nível 1, e vamos adicionar uma cópia do B aqui. Então nosso B, precisamos de novos pontos de passagem para, então duplique os waypoints com comando ou controle D. E vamos apenas mover esses waypoints. Eu não sei. Vamos colocá-lo aqui para fins de teste, eu acho. Ok. E então waypoints seis, B se moverá para cá, e então transitará para se mover desta forma. Mas isso é apenas se nós realmente configuramos para aqueles como os waypoints. Então clique em B e criar a. Defina a matriz waypoints para o tamanho de dois e conhecimento escolher waypoints cinco e waypoints seis. Certo, agora podemos tocar no Play e ver como está funcionando até agora. Ok? Parece que temos o erro onde a posição do waypoint ainda não foi definida. Então vamos fechar isso. Vamos ao porco raivoso onde acho que precisamos desta parte e do inimigo. Portanto, o índice waypoint precisa ser definido para o waypoint inicial no início do script. Ou melhor do que ter isso, poderíamos fazer um bar barulhento. Assim, o índice waypoint será o ponto de partida. Vamos apagar isso. Vá para o inimigo. O índice Waypoint vai para o padrão para o waypoint inicial. E temos que fazer isso em var pronto. Então, dessa forma, podemos ter esta configuração sem ter uma função pronta e possivelmente substituir um antigo. Assim, podemos resolver esse problema sem ter criar uma função pronta dentro daqui para isso. Então vamos em frente e tocar em Play e ver onde estamos de novo. Ok, então aqui em cima, nós também precisamos definir a posição de waypoint por padrão. Então eu acho que podemos fazer isso com um, com uma posição waypoint e nós vamos obter os waypoints no waypoint inicial. E então, a fim de obter isso para fora já barra, Vamos obter o nó no, vamos obter o nó na posição 0 deste caminho nó, esse waypoint inicial. Então queremos waypoints no waypoint inicial da posição da matriz, que é 0. E então podemos obter a posição disso. E isso. E então podemos obter a posição disso,
que deve ser um vetor 2D. Vamos tocar em Play e ver se isso ajuda. Ok, sim, isso parece funcionar. Então IB está indo entre os waypoints, são porco irritado vai entre os waypoints. Vamos ver se podemos danificar o bico atualmente. Sim. Ok. Atualmente você pode, mas não está reproduzindo a animação Hit. Então, tudo até agora, tão bom.
34. Estados de inimigos de Bee e projetil: Ok, em seguida, no nosso estado atual definido para o B, vamos igualar o novo estado. E vamos configurar algumas coisas para acontecer dependendo de qual estado é inserido. Então, se entrarmos em um ponto de estado AIDL, queremos pegar a caixa de colisão do inimigo e ativá-la, que
significa que este inimigo pode correr para o jogador e causar
dano ao jogador quando ele está no estado ocioso. Então isso vai ser colisão inimiga, caixa de
poço, ponto, ponto, ponto definido diferido. Desde então, quando você está definindo essas propriedades
na área 2D é que tem que ser feito com um método diferido definido. E o que está desligando? E estamos ligando o monitoramento. E estamos ligando o monitoramento. O que significa que tornamos isso verdade. Ok, então isso vai significar que nosso personagem pode causar dano aos jogadores novamente. E nós também queremos tomar a variável pode ser atingido e definir isso como verdadeiro também. Então este é o que o jogador está atualmente verificando para qualquer inimigo para ver se ele pode fazer um ataque de salto nele e causar dano a ele. Em seguida, queremos ataque de ponto do estado. Então vamos configurar isso com antecedência. Então, no ataque estatal, só por precaução, por alguma razão, não é. Queremos que o monitoramento seja verdadeiro aqui, então ele ainda pode colidir com o jogador quando está fazendo um ataque de projétil. E também queremos que ele seja capaz de atingir o estilo do jogador. Então eu vou dizer que eu vou copiar colar isso. A única diferença aqui que queremos
ligar o perímetro da árvore de animação para o ataque ativo. Então pegue a árvore de animação e vamos definir os parâmetros ataque ativo. E estamos definindo isso como verdade. Assim, desde que não esteja reproduzindo a animação Hit no momento, ela reproduzirá a animação de ataque como uma prioridade sobre ociosidade, que é o que gostaríamos e o estado de ataque. E então, por último, ou estado ponto cabeça, queremos pegar o monitoramento e desligar isso. Então, o que desabilitar a capacidade do inimigo para causar dano ao jogador. Nós também podemos querer desligar, pode ser atingido para que o inimigo não possa ser ferido. Watts e o estado de sucesso. Caso contrário, o personagem pode apenas continuar saltando em cima dele e matá-lo muito rapidamente. E, em seguida, também queremos definir o parâmetro da árvore de animação aqui. Só vou copiar a pasta. Exceto que agora estamos mudando para o parâmetro hit em vez do parâmetro de ataque. Então, quando o inimigo for atingido, não
queremos que ele lance um projétil de repente no jogador. Acho que isso seria um pouco injusto. Então podemos começar nosso temporizador de ataque aqui também. Então eu vou fazer o temporizador de ataque ponto start. Nosso temporizador ajustado para 1 segundo. Então, enquanto esse temporizador estiver rodando, nenhum ataque será feito. O que significa que quando o inimigo for atingido, haverá pelo menos um segundo de atraso antes que ele comece a atacar novamente. Agora para que possamos limpar as animações. Mas vamos também criar algumas funções. Quando os nossos tiros acabarem, queremos voltar ao estado ocioso. Então vamos criar função, animação Hit, terminado. Então, neste ponto, nós só queremos voltar para o estado ocioso. Então o estado self.contents é igual ao ponto de estado ocioso. E, em seguida, vamos também configurar animação de ataque concluída. Assim como animação Hit concluída ou fazer auto-ponto estado atual é igual estado ponto AIDL. Mas se olharmos para a animação de ataque, podemos ver que este é o acúmulo para o personagem lançando seus ataques. Então o tempo que realmente queremos lançar o projétil vai ser no final da nossa animação. Então este é um lugar perfeito para colocar projétil lançado, que vamos configurar em um pouco. Então lançou projétil. E então vamos em frente e criar essa função de projétil lançada. Por enquanto, vamos passar. Agora vamos para o player de Animação e é configurar essas funções de retorno de chamada. Então vou inserir uma chave aqui. Ok, vamos ver, esse é o ataque. Então nós queremos fazer em um tack terminado onde quer que tenhamos a animação de ataque terminada, e apenas certifique-se de que esse é o caminho certo sendo chamado aqui. Agora vamos bater. E depois queremos no hit terminado. Então eu vou clicar lá. Parece que já está montado do porco irritado. Então, espero que possamos ir entre hit e ocioso corretamente agora. Então eu vou tocar no play, eu pulo no B, ok? Parecia acertar o, hit animação e ele não retorna para ocioso. Depois disso, 0,5 segundos é feito. Só para testar mais uma vez. Está bem, parece estar a funcionar bem. Ok, a seguir precisamos criar um projétil para o nosso B2B capaz de almoçar. Então vamos criar uma nova cena. Eu vou criar isso como um corpo cinemático 2D, vez que ele vai se mover. E nós vamos adicionar, é claro, uma forma de colisão a ele, esta forma de colisão. Então eu vou renomear o ataque aqui, abelha ou o projétil de outro. E vamos salvar isso em uma nova pasta. Vou chamar isso de projéteis. E guardaremos isso lá dentro. Então, nossa colisão. Agora também precisamos deste brilhante para a nossa picada de abelha. Então eu vou adicionar um sprite. E então vamos para a nossa arte e encontrar o ataque, então B, e então temos a bala aqui. Então eu vou colocar isso na textura. Continuando com nosso projétil de picada de abelha, a forma de colisão principal para o corpo cinemático 2D. Bem, eu só vou ter uma colisão com o mundo por basicamente apagar o projétil. Mas para causar dano ao jogador, teremos uma área separada que verifica basicamente usando camadas de colisão. Se for um jogador e depois causar dano a esse jogador antes de excluir o projétil. Então vamos pegar o objeto string B e definir a colisão padrão. Camadas para basicamente apenas ser mundo e soldar. Então, para o nosso corpo cinemático picada de abelha hoje vamos desligar o mundo das camadas. Este objeto só vai tentar colidir na camada mundial. Então acho que é tudo o que precisamos lá. E então vamos definir a forma de colisão para isso. Então vamos usar uma forma de cápsula. Acho que se encaixa neste pequeno ferrão, que parece um dente para mim. Isso é ajustar o tamanho e a forma dele. E também vou posicionar isto aqui acima para que possamos ver a forma da colisão. Coloque em cima do sprite. E isso parece-me muito bom. Eu poderia até mesmo apenas toni-lo apenas um pouco mais jogador favorito quando se trata de colisões com este objeto. Agora precisamos de outra área para D para causar dano ao jogador. Então vamos adicionar uma área a D. E então eu vou apenas duplicar esta forma de colisão 2D. E nós vamos apenas colocá-lo aqui para isso também, é basicamente a mesma forma para colisões mundiais e para colisões de jogadores. Mas na área para D, procuramos jogadores e no corpo cinemático procuramos inimigos. Então aqui vamos desligar a bolha do monitor. Vamos desligar a camada e a máscara para o mundo. E nós vamos ativar a máscara para o jogador, que eu defini para a quarta opção aqui, a quarta. Mas agora podemos renomear algo como área de ataque, suponho. E podemos colocar um roteiro para nossa picada de abelha. Então, por agora, vamos ter isso herdado do corpo cinemático 2D. E vamos em frente e clicar em Criar. Certo, então nosso roteiro de picada de abelha vai ser relativamente direto. Vamos apagar tudo isso lá em cima por agora. Então nosso projétil vai precisar saber quanto dano ele causa. Portanto, a exportação de dano flutuante ou VD é igual a um por padrão. Para exportação de flutuador para a velocidade de movimento deste projétil também, vamos torná-lo um pouco mais rápido do que o próprio B, velocidade de
movimento de 100 por padrão. E agora vamos precisar de uma variável para a direção do alvo. E vamos usar isso como padrão para o vetor dois ponto 0. Agora vamos precisar atualizar esse objeto para cada quadro existente no mundo. Então vamos executar o processo de física. E aqui teremos a colisão que ocorre quando nos movemos. E nós vamos fazer um movimento e colidir até este ponto no jogo que temos feito mover e deslizar, mas nós realmente não queremos que o projétil deslize ao longo da borda de qualquer coisa. Então estamos fazendo colidir em movimento. E então se colide com qualquer coisa que atualmente só vai estar na camada mundial para o próprio corpo cinemático 2D, então nós vamos apenas excluí-lo. Então estamos usando movimento colide em vez de mover e deslizar. Portanto, não haverá nenhuma funcionalidade de slide. E precisamos da velocidade de movimento, que declaramos lá em cima, vezes a direção do alvo, que obteremos do objeto de lançamento quando formos em frente e criarmos isso. E então multiplicaremos isso por Delta. Lembre-se de que mover colide não contabiliza automaticamente o Delta, que é o tempo entre os quadros. Então você precisa multiplicar por delta quando você está usando colide movendo. Você não precisa fazer isso para mover e deslizar, o que temos usado para o resto deste curso. Vamos manter isso em mente. E se temos uma colisão, então eu vou fazer se é instância válida nesta colisão, então nós vamos para a fila três, que apenas remove este projétil do jogo. Então agora precisamos nos preparar quando acertarmos um jogador. Então vamos usar esta área de ataque, ir até um nó e fazer a forma do corpo entrar e conectar isso à nossa picada de abelha. Então agora temos uma área de ataque forma corpo entrou. Eles devem ser sempre um jogador. E quando não é um jogador, Nós provavelmente queremos que ele envie um erro de algum tipo, surtos, fazer ponto corpo obter dano atingido. Qualquer jogador deve ser capaz de fazer isso. E eu acho que nós realmente configuramos isso para caráter, mas isso deve funcionar para agora. E depois de causar dano ao jogador, nós q3 porque estamos removendo o projétil do jogo, e é isso para o nosso roteiro de picadas de abelha. Então agora vamos para o ser visto. Vamos clicar no Inspetor B. E vamos carregar o projétil n para a cena cheia de projéteis. Então aqui, carregar, vamos aos projéteis e escolher picada de abelha ASEAN. Ok, então devemos ser capazes de ver uma pequena pré-visualização do nosso B lá. Podemos ver recursos do projétil picada de abelha, ponto-ponto ASEAN. Então isso deve ser capaz de criar isso.
35. Lançando projetos: Agora precisamos criar o método para lançar o projétil do feixe. Então ele criou o projétil lançado, mas não fizemos nada com ele. E nós vamos realmente precisar passar um parâmetro para aqui, que vai ser a direção do alvo, que estará passando para a picada da abelha também. Então um vetor de direção 2D, e então essa direção virá de uma direção de ataque. E vamos preparar isso em um minuto. Então, quando lançarmos o projétil primeiro, temos que criar uma instância dele. Então eu vou fazer var lançado projétil aqui, e isso vai ser igual a instância de ponto de projétil. Então essa cena cheia, estamos criando uma cópia dela dentro de nosso nível, vendo quando nós, sempre que executamos esse método. Então, com o novo projétil, precisamos definir a posição dele. Então lançou a posição global do ponto de projétil. E queremos que seja igual à posição do nosso objeto B. Então, criando o projétil na localização do B, e então ele se move de lá. Assim, é igual a posição global deste objeto. E então precisamos definir a rotação do lançamento um projétil para combinar com nossa direção de ataque. Caso contrário, vai parecer um pouco engraçado. Isso só fará com que a animação pareça melhor. Então lançado projétil, e eu vou fazer mais iguais no ângulo porque nós podemos ter
que ajustar isso na cena do projétil em si para configurar a direção padrão para o projétil. E então isso muda. Ele, gira para onde deve estar voltado com base em sua trajetória. Então vamos fazer o ângulo de direção do alvo. Então isso basicamente converte esse vetor 2D um ângulo que a rotação pode realmente entender. Assim, uma vez que a rotação do ponto do projétil deve estar à
esquerda e, em seguida, mais é igual ao ângulo de direção Em seguida, vamos adicionar o projétil lançado à nossa cena atual. Então pegue a árvore e, em seguida, obter a cena atual. E adicionamos uma criança a isso. Então estamos adicionando a criança deste projétil lançado. Então essa linha de bits basicamente significa que quando estamos em nosso nível 1, ele vai encontrar esse objeto de rota de nível um e nós
vamos adicioná-lo como uma criança aqui embaixo para existir dentro de nossa pia. E então a última linha que precisamos aqui é
definir a direção do alvo do lançamento, o projétil. A direção do alvo do ponto do projétil é igual à direção do alvo. Agora, qual é a direção do alvo e como nós realmente configuramos o lançamento do projétil aqui em cima? Então, a fim de atacar o jogador primeiro, temos que identificar que o jogador entrou em uma zona de ataque. Não montamos uma zona de ataque. Então vamos criar outra área para D em nosso B. Então eu vou clicar com o botão direito do mouse aqui em uma área de nó filho 2D, podemos chamá-lo de ataque de projétil ou área pode fazer com que seja um pouco mais sentido que áreas de ataque de projéteis, mas eu vou com, Vamos clicar com o botão direito do mouse adicionar uma colisão em forma 2D. É como todas as outras vezes, e vamos fazer uma forma de círculo. Então essa forma de círculo, eu vou pegar o raio, a expansão lá em cima, e eu vou fazer um 100. Então, é um raio bastante grande para onde diremos que atacamos o jogador se acontecer de estar dentro daqui. Então, se clicarmos na área de ataque de projéteis e irmos para o nó, você pode ver que não há um sinal para o jogador existente lá, mas há um para a forma do corpo entrou em acidente forma de corpo, assim por diante entrou, vamos definir o jogador alvo para ser o jogador que acabou de entrar. E na saída, removeremos o jogador alvo do alvo atualmente referenciado. Então, se não houver alvo, não
lançará um projétil. E se houver e outras condições forem atendidas, então lançaremos projéteis depois de cada temporizador de ataque ser executado. Então vamos conectar forma de corpo inserido no script B e também forma de corpo saiu no script. Vou levar estes pedacinhos aqui em cima, sim, por aqui. E agora vamos definir o alvo de ataque. Então isso é realmente simples. Só precisamos fazer o alvo de ataque é igual ao corpo. Então esta é a coisa que o corpo cinemático ou o jogador neste caso, entrou em nossa área de ataque e nós estamos registrando como o alvo para tentar atacar. Agora, quando esse objeto sair, vamos apenas dizer que o alvo de ataque é igual a nulo. Agora aqui em cima em nosso processo de física, que vai continuar funcionando à medida que o jogo progride. Queremos ver em nosso estado ocioso se devemos fazer a transição para um estado de ataque. Então primeiro vamos ver se o alvo de ataque é válido. Então, se instância válida, e vamos fazer alvo de ataque aqui. Mas também que o tempo de ataque ou está atualmente parado, então vamos fazer um temporizador de ovo é interrompido. Então, o frio do último ataque acabou. Temos um alvo para atacar, portanto, vamos atacá-lo. Então vamos fazer auto-ponto atual estado é igual a estado ponto ataque. E agora vamos definir a direção de ataque para ser igual à direção para o topo, para ser igual à direção para o alvo de ataque. Então, uma direção tecnológica é igual à direção do ponto da posição do alvo do ataque. E então vamos começar o temporizador. Porque só queremos que isso ocorra uma vez a cada 1 segundo ou por muito tempo que você definir o tempo de ataque ou para ser. Então, temporizador de ataque ponto de partida. E isso precisa ser direção também. Então isso nos coloca em estado de ataque. Quando estivermos no estado de ataque, nossa animação ativa de ataque será executada graças a este parâmetro. Então a animação de ataque carrega o ataque. E então temos a animação de ataque terminada, que vai lançar o projétil em direção
ao jogador com base nessa direção de ataque. E vamos voltar ao estado ocioso até que nosso roteiro nos diga o contrário. Então vamos em frente e aperte Salvar e ver onde estamos. Certo, então o projétil está sendo lançado. Você pode ver que enquanto estiver no estado de ataque, o B não se move. que talvez eu não goste talvez eu queira que ele seja capaz de mover ataques de água porque isso parece um pouco desajeitado, não é? Então, vamos configurar outro estado de correspondência e permitirá que ele faça waypoint mover para baixo em. Portanto, agora apenas no estado HIT ele não será capaz de se mover. Vamos tocar no Play, está bem? E agora o nosso B como atacar enquanto se move. E nós temos que girar o projétil de base para que isso esteja realmente apontando para o nosso jogador. Então, se bem me lembro, se formos para a picada de abelha, a maneira correta de tê-lo virado para cima. Então, se eu me lembro corretamente, tomar a picada de abelha e, em seguida, definir
a rotação da base para 270 ou 90 negativos para torná-lo rosto para
a direita vai ser a maneira correta de fazê-lo rosto quando você adicionar no ângulo do lançamento do projétil. Certo, então se formos em frente e
apertarmos Play, podemos ver que ele não está atacando nosso jogador. Atualmente, um deles está atacando é o próprio mundo. Então, se verificarmos nossa área de ataque de projéteis, você pode ver que o monitoramento ainda está ligado. O que queremos usar como o masker é jogador, desligar máscara como o mundo e camadas o mundo. E também vamos desligar o Mano terrível. Então agora ele deve pegar no alvo certo para atacar o que deve ser apenas o jogador. Então, quando o jogador não está nesta área, ele não está atacando nada. Mas podemos ir nesta área para que ele ataque. E parece que a direção do projétil é mais precisa. Para que pareça mais correto. Só que um problema é que ele não está realmente entrando na animação de ataque atualmente. Então vamos em frente e dar uma olhada em nossa cena B e meio que depurar por que a animação não está em execução. Verifique aqui. Você pode ver que a animação de ataque não está em execução. Podemos checar o hit por on, e isso funciona. Então por que o ataque não está correndo? Então vamos verificar o sprite animado. Vamos nos certificar de que tudo está bem aqui. E parece ser. Então podemos entrar no player de animação. E uma coisa que podemos fazer aqui é recriar a animação de ataque que pode resolver os bugs. Então vamos em frente e remover a animação de ataque, e então vamos adicionar um novo chamado ataque. Então, mais uma vez, reconfigurando que vamos levar
a animação de sprite animada no quadro 0. Nós inserimos a chave para definir a animação para atacar que também precisamos da faixa de método de chamada no B. Então, em, Eu acho que é 0.4 segundos. E queremos clicar com o botão direito do mouse e inserir na animação de ataque concluída. E também queremos fazer a duração total dos textos que são 0,4 segundos. Encaixe aqui 0,05 segundos também. Então agora vamos para a árvore de animação e vamos adicionar a animação mais uma vez. Ataque. Conecte-o ao único tiro, e vamos verificar o único tiro. Então agora está indo, não posso explicar por que isso aconteceu. Agora. Parece estar funcionando para que possamos ir em frente e bater no play. E vamos ver se ele realmente reproduz a animação. Então faz, está bem. Também tocou a animação, mas acho que não a devolveu a nenhum outro estado. Então nós temos que ter certeza que isso no ataque de animação terminou realmente ocorre. E o problema aqui, se ampliarmos é que está em 0,5 segundos, onde você quer em 0,4 segundos. Então isso é importante. Vamos em frente e tocar no play. E podemos ver agora que vai funcionar. Vamos fazer com que os projéteis sejam lançados. E vai ser meio que rastrear o jogador ao redor para lançar os projéteis. Então ainda podemos saltar para atingir o B. E notar que quando atingimos o B, que há definitivamente um atraso para ele começa a atacar novamente, já que reiniciamos o temporizador quando atingimos o B. Então agora nosso B está basicamente funcionando. Nós só precisamos criar alguns clones dele
no jogo e definir pontos de passagem para que eles se movam entre eles. Então vamos clicar no B e talvez ele comece um pouco aqui. Deixe-me tê-lo atacar o jogador quando ele está meio que na plataforma e seu movimento nós 0.56, onde nós queremos que ele seja. Esta parte é totalmente até você apenas posicionar as coisas onde você quer que eles vão entre e onde você quer que o local de partida para ser. E talvez vamos duplicar o B novamente e colocar um B aqui em cima. E talvez para fins de teste, vamos realmente não dar isso ser nenhum waypoints. Então eu vou redefinir a matriz waypoints aqui para 0. E vamos em frente e tocar em Play e ver se isso nos dá um bug. Então ele faz. Então, basicamente, isso só pode realmente executar se houver realmente um waypoint na matriz. Então, neste ponto, poderíamos fazer uma grande função. Então funk, sublinhado pronto. E então vamos colocar isso aqui. Então posição waypoint é igual a isso. Em vez de torná-lo em vírus muito, isso pode nem sempre ser capaz de realmente ser configurado. Portanto, apenas configure isso se o tamanho do ponto de waypoints for maior que 0, maior que 0. Lá vamos nós. Vamos tocar em Play e ver se isso esclarece todas as áreas. Então aqui temos outro, que é que basicamente se não há waypoints, não
há posição waypoint. E se não há posição de waypoint, então basicamente não podemos realmente fazer um movimento waypoint. Então podemos fazer um check-in aqui. Se o tamanho do ponto de waypoints for maior que 0, se não for, então basicamente o movimento do waypoint não deve fazer nada. Então, vamos apenas anotar tudo. E se não houver pontos de passagem vão pular tudo isso. Pode haver casos em que não queremos que o inimigo se mova. Então agora isso parece ser basicamente resolvido. Certo, por alguma razão o B está lançando projéteis de uma posição estranha. Podemos trabalhar nisso em um minuto. Mas vamos subir aqui e ver sobre este B. Também lançar projéteis de uma posição estranha, mas pelo menos funciona sem que o B realmente tenha um ponto de passagem. Então talvez usar a posição em vez da posição global para projétil do
almoço funcionaria um pouco melhor e vamos em frente e tocar em play e dar uma olhada nisso. Está bem, agora está a ser lançado a partir do “B”. Então, acho que funciona. E vamos ver aqui em cima, lançando a partir do b real também
podemos adicionar um ponto específico, como uma posição para D onde ele vai lançar o projétil. Na verdade, eu gosto mais disso porque já que é um ferrão B, não deveria vir do centro do BA, deveria vir até aqui. Vamos adicionar isso. Então vamos mergulhar no B dizendo ir para 2D vista. Vamos adicionar uma posição 2D adicionar nó filho, médico 2D, vai chamar esta posição de lançamento. Eu vou segurar Alt e nós vamos arrastar isso aqui para baixo para o fundo dos Stingers, mais ou menos bem ali. Agora podemos fazer referência a isso em nosso roteiro. Então vamos fazer na barra pronta, lançamento é igual à posição de lançamento do sinal do dólar. E então vamos obter a posição desta posição 2D. E é aí que vamos criar o projétil lançado. Então vamos em frente e tocar em Play agora. Certo, isso não funcionou. Talvez precisemos de uma posição global para a posição lançada. Ok, digamos que tocar nota que causa esse problema novamente. Ok, então podemos ver que a posição de lançamento deste objeto não é realmente uma conformidade com o mundo muito bem ali. Então, como eu encontrei, eu acidentalmente mudei para a posição do mundo longe de 000. Assim, poderíamos adicionar a posição
do mundo à posição global do projétil lançado. Ou podemos apenas ter certeza de que o nível está sempre em 000. Então, se posicionarmos em mil como deveria ser, então vamos pegar o nível e vamos bloqueá-lo. Então agora não podemos editar sua posição. Só podemos editar as crianças. Então, se apertarmos o jogo agora, isso deve resolver esse problema. E agora os nossos ferros ou lançamentos da posição alvo nós colocamos lá em baixo. E isso parece muito melhor. Então podemos progredir através do nosso nível. Certo, aquele porco ainda é meio chato. E aqui temos que ter cuidado, porque assim vai continuar atirando em nós. Então vamos montar algumas abelhas no nível 2 também. Então vou procurar o nível 2. Vamos abrir a cena de nível 2. Então vamos montar um par de B aqui, B, k nós temos a cena B, podemos apenas deixá-lo lá dentro.
36. Finalização de bees com o movimento vertical: Podemos posicioná-lo lá e então vamos duplicar alguns pontos de passagem. Imprimimos cinco ou 8,6, e vamos movê-los para a posição que precisamos deles. E, em seguida, certifique-se de que a nossa posição B está aqui em cima com os outros inimigos vai estar usando pontos de passagem de dois. E vamos atribuir waypoints seis e waypoint cinco. Agora podemos acrescentar que só tinha duas abelhas extras. Por que não? Ok, então eu vou cair em um b bem aqui e um B bem ali. Vamos fazer um tipo de difícil. Teremos três “Bs”. E cada uma dessas abelhas não as cria sob as outras abelhas. Vamos ver. Eles não devem ter pontos de passagem. Eles não vão mover o que vai ser uma espécie de dor para nós. Agora, se você quiser testar a cena atual em vez da cena inicial para o jogo, você pode usar esta opção aqui, jogar cena no Mac, que é Command são imaginados, que é Control R no Windows. Então podemos começar a partir desta cena e pular o Nível 1. Então vamos subir aqui. Podemos ver que nosso B vai tentar nos atacar quando estivermos dentro da esfera. Se você queria ir um passo adiante, Use o re-elenco para ver se há uma linha de visão entre aqui e o jogador. E então quando a taxa de lançamento colide com este mundo, iria impedi-lo de fazer o lançamento. Mas nós vamos apenas configurá-lo assim. Eu também vejo outro bug, que é que nós não estamos nos movendo no Y, então eu preciso, ok, e vamos continuar. Então vamos fazer alguns saltos de parede. E agora viemos aqui para ser inimigos. Sim, isso é um pouco de uma plataforma difícil, então temos que ser meio cuidadosos. Ok. Eu não posso pular duas vezes fora de sofrer danos, o que está funcionando como planejado, mas não podemos ir um pouco acima do inimigo. Isto é realmente muito complicado. Ok? Então pule e pule. Ok, tenho aquele salto. E lá podemos vencer o jogo como ele é. E então chegamos ao nosso estágio três. Então eu acho que vou pegar este b aqui e talvez
me livrar do B3 ou da demo deste jogo, porque isso é um pouco difícil. Mas vamos descobrir rapidamente por que aquele B não estava se movendo nesse nível. Então eu vou realmente mover o jogador para cá. E só para que possamos chegar ao teste um pouco mais rápido, vou ao Comando R para entrar na cena naquela área. E vamos ver, ele não parece que ele está realmente executando o método move em tudo. A próxima coisa que podemos testar é o estado atual. Vamos imprimir isso. Deve estar executando o caso do processo físico
no comando promissor R. e parece que está no estado 0, então não é o estado ocioso. Posso mudar para o estado de ataque, isso também. Vamos clicar no B. Tem pontos de passagem,
tem uma velocidade de mosca. Então acho que a próxima coisa a verificar é qual é a direção? Então vamos imprimir a direção aqui. Ok, bem, naquela cena eles têm uma direção, mas vamos ver aqui, não imprime a direção. Certo, aqui está o problema. Estamos apenas verificando a distância x. Não
estamos verificando a distância total até os pontos de passagem. Então talvez o que deveríamos fazer em vez de aqui, ainda
podemos ter isso especificamente para o porco. Mas vamos fazer outro método para fazer a distância padrão dois waypoints porque agora a distância para x é 0 em que B, há apenas para cima e para baixo. Então faz todo o sentido porque não está se movendo. Então vamos criar um var e vamos chamá-lo de distância. E isso será igual para obter distância, para obter distância para waypoint. Acho que isso só precisa da posição de ponto de passagem. Então talvez nós passamos a posição waypoint e ok, e em vez de distância x, vamos apenas dizer distância aqui de algum valor. Ok? Então vamos precisar escrever a função aqui. Essa distância até o waypoint. Coloque um sublinhado aqui para uma posição de waypoint virtual. Ok, então eu vou passar isso. E o porco irritado, eu vou colar na versão de porco irritado. Então vamos escrever uma função que sublinhou obter distância dois waypoints, posição
waypoint, vetor 2. E então nós vamos colar isso e nós vamos devolver isso,
já que esse é o porco raivoso x única distância. Agora, para um inimigo padrão terá uma implementação padrão para ele. E como vamos fazer é fazer a auto-posição ponto distância dois, uma posição waypoint. Ok? E precisamos devolver isso, é claro. Mas o sublinhado lá. Certo, e isso deve esclarecer os erros. Então vamos voltar ao nosso nível para cantar, indo para o Comando R. e podemos executar a cena como está. E nosso b deve estar se movendo porque a distância agora está verificando tanto o x quanto o y para caracteres como este. Mas note que nossos porcos ainda estão se movendo com sua própria versão da função. Para provar isso, vamos para o nível 1. E vamos realmente mover o waypoint um acima dos porcos tinha, e o waypoint dois acima dos porcos também tinha. E embora a distância seja definitivamente maior que 10 pixels, eu vou fazer isso pesar mais de 10 pixels lá. O personagem não vai se mover porque ele está apenas verificando a distância no eixo x. Então podemos ver que não temos um porco em movimento, mesmo que a distância a esses pontos de passagem seja bem à frente, ele não muda entre os waypoints. Então vamos desfazer essas posições. E isso deve limpar nossos problemas para o bebê não se mover. Então vamos voltar para o nível 2. Vou bloquear este nível dois para não mudarmos a posição. Certifique-se de que transformar o servicer. E vamos trazer o jogador para cá. E vamos comandar R ou controlar R. e vamos fazer a cena atual. Então vamos testar isso mais uma vez. E claro que vou me livrar dessa informação de depuração. Então vamos apenas fazer uma corrida rápida através deste nível e você pode ajustar a dificuldade dele como você precisa. Obviamente, se o salto na parede é muito complicado, pode ser um pouco demais para algumas pessoas, um homem muito duro. Você pode realmente querer fazer a plataforma tão pouco maior que 1 quadrado, pelo menos alguns deles. Está bem, mas de qualquer forma, tudo parece estar a funcionar. Então, vamos voltar ao roteiro uma última vez. Vamos limpar a impressão. Então vou procurar o aluguel onde quer que o tenhamos. Eu só vou cortar isso. Não precisamos mais dele. E isso é muito bonito para o nosso jogo de plataforma. Então nós temos configuração, scripts de
movimento para o nosso jogador. Ou o jogador pode saltar sobre os inimigos, causar dano a eles. Nós montamos dois tipos de inimigos. Nós criamos um mapa de mosaico. Com auto mosaico, podemos fazer a transição entre os níveis. Temos um jogo sobre DeathZone, um jogo sobre tela e uma interface de usuário de saúde. Portanto, observe a maioria dos componentes básicos que você
precisaria para criar um jogo de plataformas completo. Espero que este curso tenha ajudado vocês a começar no Godot para entender como configurar um jogo de plataformas. Então, muito obrigado a todos por assistirem e espero ver alguns de vocês em alguns dos meus futuros conteúdos também.
37. Fix de bug de bees: Então temos um último vídeo de correção de bugs para o curso. Se você configurar o B exatamente como eu fiz, Você pode correr para o problema onde, especialmente depois de adicionar uma segunda batida, que ele simplesmente não parece reproduzir as animações consistentemente. Então eu descobri que uma solução para isso é apenas recriar o player de animação. Então eu vou cortar isso fora e depois adicioná-lo novamente. Então vamos clicar com o botão direito do mouse na abelha e adicionar um player de Animação. Só precisamos recriar as mesmas animações novamente. Então aqui, vamos fazer uma nova animação ociosa, vamos adicionar a animação de sprite animada da trilha. E, em seguida, no quadro 0, isso precisa para reproduzir a animação ociosa. Certifique-se de que loops. Ajuste ajustado para 0,05. E vamos adicionar n as outras animações. Então ataque anúncio trilha animação sprite animada. E então isso vai ser um ataque. E eu acredito que tinha um ponto zero 35 segundos tempo com 0.05 snap. E os ídolos devem estar em loop. Adicione este conjunto a 0,25. Agora vamos em frente e criar a animação. Então hit propriedade e fez animação sprite. Ok, e então a chave aqui no quadro 0, e vamos pegar aquela animação Hit lá. Então este foi 0,05 para o snap e 0,45 para a animação, eu acredito. Agora nós só precisamos adicionar nesses métodos de chamada onde nosso B estava basicamente dizendo hit terminou, assim por diante hit concluído. Agora vamos nos certificar de que ele se encaixa em 0 45. E agora vamos atacar o método de chamada trilha de anúncio b. Inserir chave. Animação de ataque terminada. E nós podemos ampliar apenas certifique-se de que ele se encaixa na hora correta. Obrigado. Então agora temos um ataque ocioso. Então agora só precisamos pegar nossa árvore de animação e redefinir nossas animações aqui. Então, clique com o botão direito do mouse em animação, ocioso vai para o primeiro n. Então precisamos de ataque para ir para este primeiro tiro. E, em seguida, para o segundo nós batemos. Então vamos ligar isso aqui. E agora podemos verificar ativa para nossa árvore de animação. Podemos testar nossas animações verificando o em para o tiro único e para o segundo tiro. Agora vamos em frente e bater em play e ver se ele realmente funciona no jogo. Então aqui temos nossa animação trabalhando magicamente. Então eu estou supondo que o que realmente aconteceu foi apenas falta cronometrar algo por 0.05 segundos. Talvez tenha sido o momento das chamadas de animação. Mas isso parece consertar o que estamos acontecendo. E vamos saltar para o nível 2 e certificar-nos de que ainda é o caso. Então vamos fazer um Command R neste nível, e vamos testá-lo muito rapidamente. Ok, então aquele B está funcionando muito bem. E agora vamos subir aqui, ou menos três “B”. Acho que deixei cair para dois IP temporários. Então esse é o tipo de questão da ONU. É claro que você pode verificar as configurações de suas animações como elas estão. Mas recriar tudo pode ser uma maneira um pouco mais demorada para corrigir o seu problema. Então, se você está tendo algum problema com animações para o seu b, seu jogador ou o porco irritado. Espero que isso ajude a resolver alguns dos seus problemas.