‫Olá e bem-vindo de volta.
‫Agora estamos prontos para começar a lidar com a entrada do usuário.
‫Isso significa que gostaríamos de pressionar as teclas do teclado e mover o mouse e clicar com o mouse e ver
‫nosso tanque reagir a essa entrada.
‫Agora, para fazer isso, primeiro precisamos realmente obter essa entrada e primeiro vamos começar a fazer
‫isso usando mapeamentos de eixo.
‫Então vamos falar sobre isso.
‫Agora aqui no projeto, vamos para as configurações de edição e projeto.
‫E se rolarmos para baixo e selecionarmos entrada, veremos nossas ligações aqui.
‫E sob ligações existem mapeamentos de ação e mapeamentos de eixo.
‫Vamos primeiro entrar em mapeamentos de eixos.
‫Agora você pode ter alguma experiência com isso, mas vamos mergulhar um pouco mais fundo no
‫que eles fazem e como funcionam.
‫Então nós temos três deles.
‫E se eu clicar na seta suspensa, verei aqui W e SW e estão falando sobre as teclas W
‫e SW no teclado.
‫Eles são atribuídos a esse mapeamento de eixo específico, chamado Move Forward.
‫Então, vamos discutir como esse mapeamento de eixos funciona.
‫Então vimos no The Unreal Editor que temos esse mapeamento de eixo chamado Move Forward e tem W
‫e SCS atribuídos a esse mapeamento de eixo.
‫Então o que isso significa exatamente?
‫Bem, no Unreal Engine, temos algo chamado mapeamento de eixo.
‫E o mapeamento de eixos é algo que é processado em cada quadro do jogo.
‫Você atribui chaves a um mapeamento de eixo.
‫No nosso caso, atribuímos W e S.
‫Agora dê uma olhada ao lado da tecla W aqui.
‫Na minha pequena amostra de captura de tela à direita, diz escala.
‫E ao lado da escala há um número 1. 0.
‫E você deve ter notado ao lado do SQ, a escala é -1. 0.
‫Portanto, esses são valores que afetarão essas informações de entrada.
‫Veja como funciona um mapeamento de eixo.
‫Nosso mapeamento de eixos para a frente tem a capacidade de ser associado a uma função em C++.
‫Agora, quando se trata de mapeamentos de eixos, se associarmos uma função a um mapeamento de eixos, ela precisa receber
‫um parâmetro de entrada do tipo float para que possamos criar uma função em nosso lago chamada MOVE que recebe um
‫float.
‫Vamos apenas chamar esse valor de parâmetro de entrada.
‫Agora há uma maneira de pegar essa função e associá-la ao nosso mapeamento de eixo de avanço.
‫Ele disse que vinculamos a função de movimento ao mapeamento do eixo.
‫Assim, cada quadro do sistema de entrada do Unreal Engine do jogo vai verificar se estamos pressionando a
‫tecla W ou a tecla.
‫E vai calcular um valor de eixo dependendo se estamos ou não pressionando essas teclas e cada
‫quadro.
‫Ele vai chamar essa função que temos que seguir em frente e passar o valor do eixo.
‫O que quer que aconteça dentro dessa função depende de nós como desenvolvedores C++.
‫Agora aqui está como funciona.
‫Se não estivermos pressionando W ou as teclas, este valor de eixo tem o valor zero.
‫Portanto, a função de movimento que está vinculada ao mapeamento do eixo de avanço é chamada a cada
‫quadro e o valor flutuante passado é zero.
‫Agora digamos que estamos pressionando a tecla W.
‫A tecla W tem sua escala definida como 1. 0.
‫Isso significa que nosso valor de eixo será 1. 0 e é isso que é passado para a função MOV.
‫Portanto, a cada quadro, a função de movimento é chamada com um valor de 1. 0 passou.
‫Agora digamos que estamos pressionando o SRC que tem um valor de escala de -1. 0.
‫Isso significa que a cada quadro a função de movimento será chamada e -1. 0 será passado.
‫Agora, no caso em que estamos pressionando W e S, ambos os valores são somados.
‫Assim obtemos o 1. 0 pressionando a tecla W e obtemos -1. 0 de pressionar o SRC.
‫Agora, ambos se cancelam.
‫Então, se estivermos pressionando os dois ao mesmo tempo, a função move será chamada com zero passado.
‫Portanto, dependendo de qual combinação de teclas estivermos pressionando, obteremos um valor diferente passado para
‫nossa função MOVE e podemos fazer o que quisermos com esse valor, como usá-lo para mover o peão.
‫Falaremos sobre realmente mover o peão em breve.
‫Por enquanto, vamos apenas trabalhar nos configurando para que possamos lidar com essas informações do
‫sistema de mapeamento Axis.
‫Ok, agora que sabemos como o mapeamento do eixo funciona, é hora de criar uma função de retorno de
‫chamada que podemos vincular ao mapeamento do eixo de avanço.
‫Então, vou fechar as configurações do projeto e voltar para o código VS.
‫Então, aqui no código VS, gostaríamos de criar uma função que podemos vincular ao mapeamento do eixo de avanço.
‫Então aqui no tanque H podemos criar uma função privada.
‫Agora vai ter.
‫O tipo de retorno void, e eu gostaria de chamar esse movimento.
‫Agora ele precisa ter um parâmetro de entrada float, e vamos chamar esse valor.
‫Então vamos pegar nossa função de movimento e defini-la aqui no Tank.
‫CP Vou colocá-lo aqui logo abaixo do construtor e precisamos de um tanque com o operador de resolução de escopo antes
‫do nome da função.
‫Portanto, temos essa função de movimento e estamos prontos para vinculá-la ao nosso mapeamento de eixo de avanço.
‫E isso é feito dentro de uma função chamada setup player input component.
‫Isso deve soar familiar.
‫De fato, se abrirmos nosso explorador e voltarmos à Base Pont H, podemos rolar para baixo e ver na seção pública
‫o componente de entrada do player de configuração da função.
‫Veremos que isso é uma substituição de uma função virtual herdada.
‫Agora, a classe base de spawn não precisa realmente configurar nenhuma entrada, e é isso que esta função é
‫para manipular a entrada de um jogador.
‫Agora, nossa classe de vínculo base não precisa lidar com entrada, mas nossa classe tanque sim.
‫Então, o que podemos fazer é tirar essa função da base pond h, mas vou copiá-la porque precisamos dela
‫no tanque.
‫Então copiando esta função, vou até o Tank H e aqui na seção pública vou
‫colá-la.
‫E como não precisamos dele na base pond, vou removê-lo da classe base pond.
‫E, de fato, vou entrar no tanque base CP e removê-lo daqui também.
‫Então vamos em frente e excluir o componente de entrada do player de configuração do Base Pond.
‫CP E agora não está mais na classe base da lagoa.
‫Então vamos em frente e salvar nossas alterações e fechar a base Pond H e CP.
‫E agora temos o componente de entrada do jogador de configuração declarado no Tanque H, mas também queremos defini-lo e o tanque.
‫CP Então aqui no Tank.
‫CP Vou adicionar a definição logo acima da função de movimento.
‫Portanto, isso é nulo e é um componente de entrada do jogador de configuração do tanque.
‫Agora vamos voltar ao Tank H e ver qual é o tipo de parâmetro de entrada.
‫Você verá que é forward declarado aqui dentro dos parênteses.
‫Isso é algo que você pode fazer se quiser encaminhar, declarar um tipo de classe em um arquivo de cabeçalho.
‫Então é forward declarado aqui e precisamos que você insira o tipo de ponteiro de componente e o parâmetro é chamado de
‫componente de entrada do player.
‫Então, precisamos deste parâmetro de entrada no tanque.
‫CP Então, nos parênteses para configurar o componente de entrada do player, teremos um componente de entrada U que
‫é um ponteiro e é chamado de componente de entrada do player.
‫Portanto, agora a assinatura da função corresponde à declaração da função.
‫Agora, de volta ao arquivo CP, vamos dar a esta função um corpo de função e estamos sobrescrevendo esta
‫função e é uma boa ideia chamar o componente de entrada do player super configurado.
‫Agora, como estamos chamando a versão pai do componente de entrada do player de configuração, temos que passar uma
‫entrada do tipo que você insere componente.
‫Vamos passar o parâmetro de entrada para esta função aqui.
‫Dessa forma, a classe pai chamará sua versão.
‫Agora, o tanque base da lagoa não está implementando esta função.
‫Acabamos de removê-lo.
‫Mas a classe pai para base -- chamará sua versão.
‫E sempre que você substituir uma função virtual como essa, chamar a super versão é uma boa ideia.
‫Portanto, não perdemos nenhuma funcionalidade implementada na versão pai.
‫Então, por que estamos fazendo isso?
‫Para que serve o componente de entrada do player de configuração?
‫Bem, uma das coisas boas para isso é vincular funções para acessar mapeamentos.
‫Gostaríamos de vincular nossa função de movimento ao mapeamento de eixo de avanço.
‫E fazemos isso aqui.
‫Fazemos isso usando este componente de entrada do player de parâmetro de entrada.
‫É para isso que este objeto foi projetado.
‫Pegamos o componente de entrada do player e nesse ponteiro usamos o operador de seta para acessar uma função
‫chamada eixo de ligação.
‫Agora Bind Axis recebe alguns parâmetros de entrada.
‫A primeira é uma string literal, o que significa que vamos usar a macro de texto.
‫Agora, o que colocamos nas citações?
‫Colocamos o nome do mapeamento do eixo.
‫Vimos no editor que esse mapeamento de eixos se chama avançar.
‫Então, estamos escolhendo esse mapeamento de eixo para vincular ao segundo parâmetro de entrada.
‫Este será um ponteiro para o objeto onde vincular a função para isso é um ponteiro para
‫a instância da classe específica onde n e como estamos na classe tanque, isso apontará para a instância
‫do peão do tanque no jogos.
‫Agora, o terceiro parâmetro é o endereço da função que estamos vinculando.
‫Então temos um movimento de tanque.
‫Muito importante que precisamos totalmente.
‫Qualifique o nome da função com o nome da classe.
‫E bem aqui na frente do nome da função, precisamos do endereço do operador.
‫Agora, se você não está familiarizado com fazer algo assim, isso é simplesmente pegar o endereço de
‫uma função.
‫As funções podem ter endereços assim como as variáveis.
‫Portanto, usar o endereço do operador é uma maneira de passar funções para outras funções.
‫Então é por isso que precisamos desse endereço de operador.
‫Portanto, temos nossa chamada de função para vincular o acesso.
‫Agora você provavelmente está percebendo que o ponteiro de erro do IntelliSense para o tipo de classe incompleto que o componente de entrada
‫não é permitido.
‫Agora sabemos o que pode causar isso.
‫Por um lado, pode significar que precisamos incluir um arquivo de cabeçalho.
‫Outra possibilidade é que seja um erro falso.
‫Você pode descobrir facilmente compilando, então vamos tentar compilar.
‫Veremos que temos uma compilação bem-sucedida.
‫Portanto, sabemos que este é um erro falso.
‫Mas, novamente, se você quiser, pode adicionar a inclusão apenas para removê-la.
‫Então não está incomodando você.
‫Agora sabemos que o tipo de classe que está reclamando é seu componente de entrada.
‫Então aqui está o componente de entrada na documentação e aqui está o include.
‫E se adicionarmos isso aqui no topo do arquivo CP do tanque, nos livraremos desse erro falso irritante.
‫E, novamente, porque estes têm o pragya quer incluir guardas, sabemos que os componentes de entrada não serão
‫incluídos mais de uma vez e lá se vão os rabiscos, eles desapareceram.
‫Então agora sabemos que essa função de movimento será chamada a cada quadro e o valor
‫terá um valor flutuante específico dependendo se estivermos pressionando W ou ask.
‫Agora, simplesmente saber que a função de movimento está destinada a avançar não é suficiente.
‫Como desenvolvedores, é bom ter algum tipo de confirmação de que as coisas estão funcionando.
‫Então, o que eu gostaria que você fizesse como seu desafio é usar o log YUI na função MOV para imprimir
‫o valor que está sendo passado para mover esse float chamado value.
‫Portanto, use percent f em uiy log para registrar o valor do valor float no log de saída e, em seguida, teste o jogo e
‫pressione essas teclas e veja o que você obtém impresso no log.
‫Pause o vídeo e adicione isso à função de movimento agora.
‫OK.
‫Então aqui na função mov, vou adicionar um log uii.
‫E isso pode ser um aviso de temperatura de log.
‫E para a macro de texto.
‫Vou simplesmente colocar o valor percentual F e o valor.
‫Agora tudo bem.
‫Se você usou um tipo de verbosidade ou aviso diferente, se você sabe como fazer essas coisas.
‫Isso é totalmente bom.
‫Vou usar apenas um aviso aqui e sei que você usou coisas como percent se e formatou seu log
‫com um valor de string.
‫Porcentagem F, se você não estiver ciente, é como você pode formatar seu log de interface do usuário com um valor flutuante.
‫Então, vamos compilar isso e de volta ao editor, vou abrir o log de saída e pressionar play e verificar onde estou
‫enviando spam para o log de saída com inúmeras mensagens.
‫Agora vou clicar na viewport e pressionar a tecla W.
‫Aí está o meu valor de um que vou liberar.
‫Está de volta a zero.
‫Eu vou apertar a tecla e é um negativo.
‫E se pressionarmos os dois ao mesmo tempo, obtemos zero.
‫E assim é exatamente como esperávamos.
‫Perfeito.
‫Tudo bem.
‫Então, neste vídeo, configuramos nosso lago para lidar com algumas entradas do usuário.
‫Falamos sobre mapeamentos de acesso e vinculamos nossa função move ao mapeamento de acesso avançar.
‫Em seguida, imprimimos esse valor de acesso usando o log YUI em nossa função MOVE, mas na verdade gostaríamos de mover nosso tanque
‫em vez de apenas imprimir alguns valores no log de saída.
‫Então, nas próximas palestras, vamos configurá-lo para que possamos realmente começar a mover nosso tanque.
‫Vejo você em breve.