Introdução ao desenvolvimento de jogos Javascript: Parte 1 | Chris Dixon | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


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

Introdução ao desenvolvimento de jogos Javascript: Parte 1

teacher avatar Chris Dixon, Web Developer & Online Teacher

Assista a este curso e milhares de outros

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

Assista a este curso e milhares de outros

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

Aulas neste curso

    • 1.

      1 Introdução

      2:12

    • 2.

      Compartilhe seu trabalho em Skillshare!

      1:09

    • 3.

      Configurando a tela HTML

      6:37

    • 4.

      Gritos e Co-Ordinates

      1:27

    • 5.

      Desenhando na tela

      10:48

    • 6.

      Texto, linhas e caminhos

      8:32

    • 7.

      Looping

      8:21

    • 8.

      Movendo objetos com o teclado

      5:32

    • 9.

      Detectando colisões e saltos

      10:24

    • 10.

      Contato de pás

      9:05

    • 11.

      Marcações de rastreamento

      3:33

    • 12.

      Terminando o jogo

      7:38

    • 13.

      Começar e re-iniciar o jogo

      8:41

    • 14.

      Direção aleatória

      6:17

    • 15.

      Movimento de computador

      3:54

    • 16.

      Salto aleatório

      6:26

    • 17.

      Mantendo a rema na tela

      2:52

    • 18.

      Considerações finais

      0:31

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

Gerado pela comunidade

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

363

Estudantes

4

Projetos

Sobre este curso

Folha de referência gratuita para download:

https://github.com/chrisdixon161/HTML5-Canvas-Quick-Reference

Etapas de projeto para comparação:

https://github.com/chrisdixon161/Introduction-To-Javascript-Game-Development-Course-Part-1

Se você já se perguntou como construir jogos simples em 2D que funcionam no navegador, então esse curso vai ser exatamente o que você está procurando!


Como o Javascript é construído em todos os principais navegadores, é perfeito para criar jogos baseados em navegador e, durante esse curso, vamos construir um jogo simples de estilo pong para aprender o que você precisa saber.

Começando com o Canvas HTML5. Esse elemento é usado para desenhar dentro do navegador, incluindo imagens, formas, textos e animações. Tornando-o perfeito para jogos 2D. Se você ainda não usou isso antes, olhamos para tudo o que você precisa saber para desenhar, incluindo como o sistema de grade funciona.

Junto com isso, também olhamos para:

  • Texto, linhas e caminhos
  • Coordenadas
  • Cálculos de matemática
  • Looping
  • Movendo objetos com o teclado
  • Detectando colisões e saltando das paredes e pás
  • Acompanhando as pontuações
  • Começar e terminar o jogo
  • Acrescentando a aleatoriedade ao saltar para tornar o jogo menos previsível
  • Movimento de computador
  • Restringindo o movimento na tela

Tudo isso combina em um jogo 2D que abrange todos os elementos essenciais que você precisa para construir mais jogos por conta própria.

O curso é amigável para iniciantes e tento explicar tudo como vamos, porém uma pequena experiência de Javascript vai realmente ajudar sua compreensão e experiência. Também tenho aulas sobre esse assunto, se necessário.

Ansioso para vê-lo na primeira aula!

Conheça seu professor

Teacher Profile Image

Chris Dixon

Web Developer & Online Teacher

Top Teacher

Hello, My name is Chris and I am a Web Developer from the UK. I am an experienced trainer leading web development bootcamps and also teaching online courses.

My main areas of interest are Vue.js, WordPress, Shopify, Javascript, eCommerce, and business. I am passionate about what I do and about teaching others. 

Whatever your reason for learning to build websites you have made an excellent career choice.

My personal motivation was to become my own boss and have more freedom and flexibility in my life. I also enjoy the technical challenge it provides and the way it constantly evolves. I built my first website back in 1999 and I have watched the web evolve into what it is today.

I try to make my courses enjoyable and try to remember what it was like wh... Visualizar o perfil completo

Level: Beginner

Nota do curso

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

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

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

Transcrições

1. 1 Introdução: Você já se perguntou como criar jogos 2D simples que funcionam dentro do navegador, então essa classe foi projetada para você. Como o JavaScript está integrado em todos os principais navegadores, é perfeito para criar jogos baseados em navegador. Esta aula ensinará todos os conceitos que você precisa saber ao construir um jogo estilo Pong, colocar tudo em prática. Esta classe não foi projetada para ir muito fundo ou se você tiver algum conhecimento de JavaScript existente, ela realmente o ajudará à medida que você progride. Vamos tentar abordar todos os principais conceitos que você precisa para criar jogos 2D básicos no navegador e, para isso, começamos configurando o HTML Canvas. O Canvas é uma maneira ideal de desenhar dentro do navegador. É perfeito para desenhar nossa área de jogo, coisas como a bola, as poças. Também podemos usar JavaScript para movê-los no Canvas também. Mas, trabalhando com um Canvas, precisamos de um pouco de conhecimento sobre o sistema de grade. Isso é tudo coberto nesta classe também. Mas não se preocupe, é muito fácil de pegar. Vamos dar uma olhada em todas as funções básicas de desenho como desenhar texto, como linhas, como desenhar quadrados e retângulos, círculos e como também podemos aplicar loop para que possamos repetir processos que tornam um jogo realmente suave. Vamos dar uma olhada também como podemos interagir com nosso jogo e mover objetos usando o teclado. Claro, que tipo de jogo de Pong estaria completo? Não lidamos com a bola saltando de vários itens. A bola precisa saltar de todos os lados do nosso jogo. Precisamos quebrar uma pontuação se ela atingir um lado em particular. Precisamos saltar das remos em movimento. Tudo isso está coberto por dentro desta aula. Você não precisa de ferramentas adicionais ou para fazer compras para essa classe. Tudo o que precisamos é de um navegador da Web e de um editor de texto livre. Se isso soa como algo que o excita e você quer aprender, entre na aula e eu o verei na primeira lição, onde começaremos configurando o HTML Canvas. 2. Compartilhe seu trabalho em Skillshare!: Ao fazer qualquer curso, é muito importante não adquirir o hábito de acompanhar apenas para marcar outra palestra. Reserve um tempo para processar cada lição, revisar o código que você escreve e pensar em como você mesmo pode abordar essas soluções. Com isso em mente, esta aula é baseada em projetos e isso lhe dá a oportunidade de realmente criar algo pessoal e único. Você não precisa se perder e se afastar da aula, e pode até mesmo dar um passo atrás depois de terminar a aula e voltar e fazer algumas mudanças no projeto posteriormente. Isso realmente lhe dará uma boa chance de praticar o que aprendeu fora da aula. Além disso, lembre-se de compartilhar seu projeto também aqui no Skillshare e só vou dar uma olhada, mas também inspirará outros estudantes. Para obter mais informações sobre o projeto da turma, acesse a guia Projeto e Recursos onde você pode não apenas fazer o upload do seu projeto, mas também ver outros projetos de classe. Com isso em mente, estou ansioso para ver o que você cria e carrega aqui no Skillshare. 3. Configurando a tela HTML: Como estamos criando um jogo 2D, precisamos de uma maneira de criar várias formas e vários elementos e colocá-los na tela. Para fazer isso, faremos uso intenso da tela HTML5. O Canvas é apenas um elemento HTML como uma div ou mesmo uma imagem. Ele tem uma etiqueta de abertura e fechamento, e por si só não faz nada. Mas assim que tivermos isso no lugar, podemos fazer uso da API de tela para desenhar gráficos. Também podemos fazer muito mais para casos de uso excessivo, como manipulação de fotos, alterando os pixels e as animações, para citar alguns. Este curso será mais focado em gráficos 2D. Muitas outras APIs e bibliotecas também estão disponíveis para lidar com recursos 3D. Para acessar esses recursos 2D, a API de tela tem uma interface disponível chamada CanvasRenderingContext2D. Isso não é algo que você precisa memorizar. Mas saiba que é por isso que temos acesso aos recursos de desenho 2D na tela usando JavaScript. Aqui, você pode ver uma seleção de algumas das propriedades e métodos aos quais temos acesso , que nos permitirão desenhar na tela. Você verá mais alguns desses durante o curso. Vamos agora entrar no editor de texto e configurar as coisas com um novo projeto. Primeiro, precisamos de uma nova pasta de projeto para armazenar todos os nossos arquivos dentro do. Deixe-me chamar esse jogo, qualquer coisa que você quiser, mas eu quero chamar este jogo e clicar em “Enter”. Abra o Visual Studio Code. Se preferir, você pode usar um editor diferente, se quiser. Arraste isso. Então precisamos de dois novos arquivos para começar. O primeiro que você pode clicar no ícone Novo arquivo aqui, isso criará um novo arquivo. Vou chamar isso de index.html. O segundo arquivo que precisamos será para o nosso script, o script.js. Isso vai lidar com todas as nossas funções de desenho em nosso código de jogo. Vamos começar de novo em nosso index.html. Aqui dentro, o Visual Studio Code tem um atalho prático chamado html:5, que nos dará toda a nossa estrutura HTML básica. O título é o mesmo. Não precisamos de muito conteúdo dentro da seção do corpo, mas a primeira coisa que precisamos é a tela. Como mencionado anteriormente, a tela tem as etiquetas de abertura e fechamento. Se salvarmos isso e abrirmos isso dentro do navegador, você não verá nenhum conteúdo ainda na tela. Se copiarmos a página de índice de caminho, cole-a em, você não verá nenhum conteúdo dentro do navegador. Para realmente ver a tela, precisamos desenhar coisas dentro do nosso arquivo JavaScript ou também podemos adicionar algum estilo dentro daqui para tornar nossa tela mais visível. No estilo, então tudo que queremos fazer aqui é pegar nossa tela, definir uma cor de fundo para tornar isso mais visível. Você pode fazer isso qualquer cor que quiser , mas eu vou buscar um valor rgb. O vermelho de 61 e 59 para o verde e o azul. Isso nos dará essa cor de fundo mais escura. Agora podemos ver a tela dentro do navegador. Você pode ver por padrão que é uma tela bem pequena. Por padrão, a tela será renderizada como 300 pixels de largura e 150 pixels de altura. Podemos substituir isso dentro do nosso roteiro. Para fazer isso no centro, podemos fazer isso exatamente como faríamos com outros elementos HTML regulares. Primeiro, defina o tipo de exibição como o valor do bloco. Em seguida, podemos definir a margem como zero na parte superior e inferior e , em seguida, automaticamente à esquerda e à direita. Salve e atualize, e isso agora aparecerá dentro do centro porque eu dividi automaticamente o espaço à esquerda e à direita. A última coisa a fazer dentro da nossa página de índice, logo abaixo da tela é o link nosso arquivo de script. Colocando a fonte que aponta para o nosso script.js. Em seguida, podemos passar para esse arquivo para adicionar algum conteúdo. A primeira coisa que precisamos fazer dentro daqui é realmente pegar nosso elemento de tela. Fazemos isso como faríamos com qualquer outro elemento HTML. Temos acesso aos nossos elementos usando coisas como QuerySelector, GetElementById, GetElementByClassName, e podemos armazenar isso dentro de uma constante chamada canvas. Para esse acesso, o documento completo, vou usar o QuerySelector passando nosso elemento de tela. Agora, isso armazena nossa referência aos nossos elementos dentro dessa variável ou constante. Agora podemos acessar isso logo abaixo. Começando por substituir esse padrão, tamanho de 150 por 300 pixels. Pegue nossa tela. Podemos definir a largura desse elemento como qualquer valor que você quiser. Digamos que 800. Em seguida, a altura de 400. Isso agora deve ser atualizado dentro do navegador. A última coisa que precisamos fazer dentro desse arquivo é acessar as funções de desenho 2D de telas com GetContext. Podemos armazenar isso dentro de uma constante chamada ctx, pegar nossos elementos de tela e, em seguida, chamar um método chamado GetContext. Passando uma cadeia de 2D para nos dar acesso aos recursos de desenho 2D. O nome constante de ctx depende de nós, mas esta é uma convenção de nomenclatura comum para acessar o contexto de renderização, e essa constante agora pode ser usada para desenhar para a tela quando precisamos. Usaremos essa abundância ao longo deste curso. Esta tela agora está pronta para desenharmos também. Mas pouco antes de fazermos isso, no próximo vídeo, vamos dar uma olhada em como podemos trabalhar com grades e coordenadas, que realmente nos ajudará a entender as colocações de nossos objetos em a tela. 4. Gritos e Co-Ordinates: Não vamos sair muito longe para o Canvas, se primeiro não entendermos algumas coordenadas básicas. Você já pode entender alguns desses, e não precisamos ir muito fundo, mas se não, agora vamos ter uma rápida recapitulação. Quando o desenhamos para o Canvas, ou na verdade, maioria dos sistemas de grade 2D, temos duas direções que precisamos saber. Este é o eixo x e y, x é horizontal da esquerda para a direita e y é vertical de cima para baixo. Ou seja, se você quisesse localizar o canto superior esquerdo desta grade, x e y, ambos serão zero, mas e algo como esse quadrado de muitas formas como esta? Embora ocupe vários espaços de grade, o local inicial é o canto superior esquerdo. É aqui que temos esse ponto vermelho. Novamente, a partir do canto superior esquerdo desta grade, vamos atravessar três espaços no eixo x e para baixo dois espaços no eixo y, que nos dá nossa posição inicial. Depois disso, uma vez que tenhamos nossa posição inicial no canto, podemos definir a altura e a largura de qualquer forma que você queira. Isso é tudo o que você realmente precisa saber para começar. Podemos então definir o tamanho dos gráficos e fazer outras coisas quando os criamos também. Isto é o que vamos ter vindo a seguir. 5. Desenhando na tela: Para ajudar com o desenho para a tela, criei um download para você usar durante este curso e também no futuro. Tudo o que você precisa fazer é acessar este link que você pode ver na tela, baixar o PDF e mantê-lo em um lugar seguro. Agora vamos entrar em nosso roteiro e dar uma olhada em como podemos usar alguns desses. No vídeo de coordenadas anteriormente, analisamos um exemplo de desenho de um quadrado. Vamos começar com isso. Observe também que os quadrados e retângulos usam o mesmo método de desenho. Acabamos de mudar os valores de largura ou altura Para desenhar um retângulo ou um quadrado usando a tela, o que precisamos fazer é primeiro acessar nossa variável de contexto, então ctx, e isso tem um método disponível chamado FillRect. Isso preencherá um retângulo com uma cor sólida ou mesmo algo como um gradiente. Vamos analisar em valores diferentes do ano 4. Assim como olhamos com o vídeo de coordenadas anteriormente, os dois primeiros valores são o local onde queremos colocar esse retângulo. Como isso é baseado no canto superior esquerdo do retângulo ou quadrado, quero começar este exemplo mostrando isso no canto superior esquerdo. A parte superior esquerda será x, 0 e y, 0. Em seguida, analisamos a largura e a altura que queremos que a forma seja. Para tornar isso um quadrado, podemos analisar em alguns valores pares como 100. Isso colocará um quadrado de 100 por 100 pixels no canto superior esquerdo da nossa tela. Também podemos empurrar isso pelo eixo x ou no eixo y, qualquer valor que quisermos. Se mudarmos o eixo y para 50, isso empurrará isso mais para baixo na tela. Assim como o método FillRect, também podemos alterar isso para ser traçado, então StrokeRect. Em vez de preencher uma cor sólida como estamos vendo, traço colocará um contorno ao redor da forma. Isso nos dará um contorno de um retângulo ou um quadrado. Para a maioria das coisas que desenhamos para a tela, teremos um traçado ou uma alternativa de preenchimento. Vou mudar isso de volta para ser preenchido. Também podemos criar um retângulo alterando a altura ou a largura. Se mudarmos isso para 200, por exemplo, isso nos dará um retângulo. Por padrão, teremos essa cor preta sólida. Podemos mudar isso acessando uma propriedade nesse contexto chamada FillStyle, logo acima do FillRect, novamente, acesse nosso contexto como faremos com todos esses recursos de desenho. Podemos acessar a propriedade chamada FillStyle. FillStyle será igual a uma string e definirá isso igual a uma cor como vermelho. Se atualizarmos o navegador, isso agora atualizará a cor de fundo. Se estivéssemos usando o StrokeRect em vez de preencher, como vimos antes, para fazer o esboço, também precisaríamos atualizar isso para ser o StrokeStyle para corresponder. Isso mudará a cor do contorno para vermelho. Vamos apenas desfazer essas duas alterações e sair como preenchimento. Como seria de esperar, esses retângulos serão úteis dentro do nosso jogo. Poderíamos usá-los para desenhar o jogador e também o remo do computador, que será usado para acertar a bola. Vamos dar a isso uma chance começando com os jogadores remar à esquerda. Para começar, como temos uma tela de altura de 400 pixels, podemos começar colocando isso no centro alterando o valor y para 200. A largura da tela, vamos definir isso como um valor de oito e a altura de 80. Atualizar. Você esperaria que o remo estivesse no meio, já que definimos esse valor y como 200, que é metade da altura. Mas, como já aprendemos, a posição inicial das coordenadas x e y está na posição superior esquerda da nossa forma, o que significa que a parte superior da forma está no centro da tela e não na centro do nosso retângulo. É aqui que precisamos começar a pensar sobre as coisas com mais cuidado. Para que o remo esteja corretamente no centro da tela, precisamos agora deduzir metade da altura do remo. Como sabemos que a altura do remo é de 80 pixels, poderíamos deduzir 40 da posição inicial. Isso funciona, mas uma opção melhor seria alterar esses valores para fazer uso de variáveis. As variáveis seriam usadas para realizar esse cálculo para nós, e também seria útil no futuro se mudássemos algum desses valores. Apenas ambos, podemos criar algumas variáveis. A primeira é a largura do remo usando os mesmos valores, então a largura de oito pixels. Então o segundo é para a altura do remo. A altura do remo é de 80 pixels, assim como já temos. Em seguida, podemos fazer uso desses em nosso método FillRect. A largura do remo, também a altura, e isso ainda deve funcionar exatamente da mesma forma. Mas agora, em vez de codificar esse valor de 160, o que vamos fazer agora é calcular isso usando JavaScript. Podemos pegar a altura da tela, que atualmente é de 400 pixels, dividir isso por dois para obter o centro que atualmente nos dá o valor de 200. Mas, como sabemos, 200 não colocarão isso no centro da tela. Também precisamos deduzir metade da altura da pá, então tela.altura dividida por 2. Também vou tirar a altura do remo dividida por dois. O que temos aqui é exatamente o mesmo de antes. Temos o valor de 200, takeaway 40. Isso é exatamente o mesmo de antes, mas usando variáveis. Salve e atualize. Agora, para o remo do computador, que vai acabar à direita, e isso tudo deve parecer bem parecido, tudo o que precisamos fazer é mudar a posição x para ficar à direita. Podemos alterar o FillStyle para ter uma cor diferente também. Movendo-se para baixo, todo o código a partir de agora terá uma cor diferente alterando o FillStyle. Vamos para o azul. Em seguida, usamos CTX.FillRect. Como mencionado, a única diferença entre o remo dos jogadores e o remo do computador é que queremos empurrar isso para o lado direito. O remo dos jogadores tem a localização inicial x de zero, que está à esquerda. O que queremos fazer para a versão do computador é colocar isso à direita acessando o canvas.width, que atualmente é igual a 800. Mas como essa posição inicial é baseada na parte superior esquerda do retângulo, isso realmente empurraria isso para fora da borda da tela. O que precisamos fazer é trazer isso de volta, deduzindo a largura do remo. Os últimos três valores são exatamente os mesmos que acima. Isso vai começar no centro. Podemos usar isso, e a largura e a altura do remo também foram definidas. Pegue todos esses três, adicione-os logo após a vírgula, deixando-nos com duas pás agora no lugar na tela. A próxima coisa que precisamos desenhar é uma bola. Você pode estar esperando um método chamado FillCircle ou algo ao longo dessas linhas. Mas para círculos, usamos um método chamado arco. Novamente, no contexto, chame o método arc. Isso é usado para criar um arco ou uma curva. Podemos formar um círculo girando essa curva de volta para a posição inicial. Ao contrário de um retângulo, como um arco é curvo, a forma não tem um canto superior para localizá-lo. Em vez disso, nós o localizamos pelo centro. Para colocá-lo no meio da tela, poderíamos fazer algo assim. Poderíamos acessar a divisão canvas.width por 2. Isso está colocando isso no centro do eixo x. Então também o mesmo para a altura. Ainda não terminamos. Em seguida, vem o raio do círculo, que é a dimensão do centro do círculo até a borda externa. Basicamente, metade da largura do círculo. Vamos colocá-lo em 50, separados por uma vírgula. O próximo valor no sentido horário é o ângulo inicial e final. Para iniciar isso efetivamente na vertical às 12:00 horas, começamos com a posição de zero. Para que a posição final gire isso ao redor e crie um círculo, precisamos girar isso em 360 graus. Mas ao usar o método do arco, essa rotação é em radianos, não em graus. O equivalente a 360 graus em radianos é 2 vezes Math.pi. É assim que podemos fazer isso usando JavaScript. Agora, se salvarmos isso e atualizarmos o navegador, atualmente não veremos nenhum círculo na tela. Ainda não vemos nosso círculo na tela, porque primeiro precisamos declarar se queremos que esse círculo seja um preenchimento ou um traço. Podemos fazer isso com ctx.fill. Este é um método, então precisamos dos suportes logo depois. Atualizar. Isso agora preencherá nosso círculo com uma cor de fundo sólida. Como seria de esperar, também poderíamos usar o método do traçado para nos dar o contorno do nosso círculo. Vou manter isso como preenchimento. Altere também a cor de preenchimento logo acima usando FillStyle e defina isso igual a cinza. Como 2 vezes Math.pi é um círculo completo, você provavelmente pode adivinhar que metade desse valor é um meio círculo, então, em vez de cronometrá-lo por dois, podemos apenas dizer Math.pi. Este será um meio círculo. Novamente, se você quiser que essa seja uma linha, você pode mudar isso para ser traçado. Você também pode reduzir ou aumentar o valor de Math.pi. Se dividirmos o valor de Math.pi por 2, isso nos dará um quarto de círculo. Como você pode imaginar, esse arco é um método bastante versátil. Mas como precisamos de uma bola, vou restabelecer isso para ser 2 vezes Math.pi, assim como tínhamos antes. Também podemos alterar isso para ser uma cor de preenchimento, e também um raio de bola menor de 10 pixels. Este é apenas um primeiro olhar básico sobre o desenho para a tela. Como seria de esperar, há muito mais para aprender e muitas outras coisas que você pode fazer. Começaremos a ver alguns desses no próximo vídeo. 6. Texto, linhas e caminhos: Continuando com o vídeo anterior, agora vamos descobrir mais algumas técnicas que podemos usar para desenhar para o Canvas, desenhar algumas linhas e também algum texto. Isso vai ser muito útil para o nosso jogo. Começarei desenhando textos para o Canvas, que será usado para desenhar a pontuação do usuário e também solicitar que o usuário comece o jogo. O desenho de textos na tela temos dois textos de traçado, mas um contorno, e o FillText, ou uma cor sólida. Vamos começar na parte inferior do nosso roteiro. Acesse o contexto e começaremos com FillText. Para FillText, a primeira coisa precisamos adicionar é uma string, que é o texto que queremos exibir, então ei, seguido pelas posições x e y onde queremos colocar isso. Vamos para 150. Salve e atualize. Podemos ver esse pequeno texto no Canvas, mas é muito difícil de ver porque o tamanho padrão é 10 pixels com uma fonte sans serif. Mas, é claro, podemos mudar isso em nosso JavaScript. Primeiro de tudo, vamos alterar o FillStyle para ser igual a qualquer cor, como vermelho e também para alterar o tamanho e também a família de fontes. Podemos acessar ctx ou fonte. Defina isso igual a uma string. Isso leva exatamente a mesma sintaxe que faríamos com a propriedade CSS on para que possamos passar uma string do tamanho do pixel. Vamos para 30 e depois a família de fontes de Helvetica. Atualize e isso entra em vigor. O que seria bom ter é a pontuação do jogador exibida em ambos os lados da tela. Se tivéssemos a pontuação do jogador no meio da metade esquerda e a pontuação do computador no meio da metade direita. Para simular isso para a pontuação do jogador, precisamos efetivamente nos empurrar em um quarto da largura da tela. Para simular uma pontuação, podemos colocar em qualquer valor dentro daqui, como três, e depois empurrar mais de um quarto da largura. Podemos primeiro pegar a tela, essa largura e dividir isso por 4. A pontuação do computador, isso precisa ser de três quartos do caminho através do Canvas e podemos duplicar isso. Altere a pontuação por enquanto. Mas em vez de dividir o Canvas por 4, vamos multiplicar isso por 0,75, empurrando nosso texto três quartos do caminho através da tela. Finalmente, também podemos armazenar esses dois valores em variáveis para que possamos acessá-los e usá-los mais tarde no curso. De volta ao topo, usando LET para que possamos atualizá-los à medida que o jogo está progredindo. A primeira variável é a pontuação do jogador. Temos um valor inicial de 0, seguido pela pontuação do nosso computador. Essas variáveis agora podem ser usadas dentro do nosso método FillText. Remova o valor codificado e esta é a pontuação do jogador. A segunda é a pontuação do computador. Outra coisa que o Canvas nos dá é a capacidade de desenhar usando linhas. Temos dois métodos úteis disponíveis chamados ferramenta de movimentação e ferramenta de linha. Vamos dar uma olhada nestes. CTX.moveto e CTX.Lineto. O primeiro de movimento para é usado para mover para a posição inicial e, em seguida, linha para é o que realmente desenhar uma linha na tela para a posição final que definimos. Mover para é como levantar a caneta pouco de papel e movê-la para uma determinada posição. A linha para é usada para realmente desenhar a linha. O que vou usar isso é desenhar uma linha central verticalmente na tela e também no círculo central também. Primeiro, vamos começar com essa linha vertical e precisamos primeiro mover a posição da caneta para estar no centro da tela e no topo. Os valores para isso, em primeiro lugar, para x é metade da largura da tela e a posição y é 0, já que queremos manter isso no topo. Mova-se dependente para estar nessa posição aqui. Agora, precisamos usar a linha para método. Na verdade, desenhe uma linha para o local final, que está na parte inferior, passando no local final para que isso ainda esteja no centro da tela para que possamos pegar a largura da tela dividida por 2 e a posição y final está na parte inferior. Esta é a tela.Altura. Isso então definirá onde queremos desenhar nossa linha mas na verdade coloca no Canvas, precisamos usar o método de traçado, então ctx.stroke e há uma linha de cima para baixo. Isso é muito bom, mas se olharmos de perto, também temos uma linha indesejada adicional em torno desta bola. Isso acontece porque, no momento, não temos nenhuma separação entre todos esses caminhos do Canvas e os gráficos que criamos. Por exemplo, logo acima, desenhamos um círculo usando o método do filme. Nós desenhamos isso, como seria de esperar com essa cor cinza, mas o código continua sendo executado todo o caminho para baixo e também desenha o mesmo círculo usando o método de traçado também. É por isso que a bola tem um preenchimento e também um contorno do golpe para. Quando isso acontece, podemos separar cada uma dessas seções usando um método chamado start path. Vamos chamar isso logo acima nossa seção de linha com ctx.beginpath. caminho inicial eliminará efetivamente todos os caminhos existentes acima e iniciará um novo a partir desta linha. Salve e atualize e agora nossa linha foi removida do círculo, deixando apenas a linha vertical que pretendemos , bem como essa linha sólida. Também podemos alterar isso para ser uma linha tracejada também. Podemos fazer isso antes de traçarmos nossa linha com ctx.setlinedash. Set line dash é um método que leva uma matriz dentro dessa matriz JavaScript, definimos o tamanho de forma que os traços e também as lacunas entre cada um deles. Se fizermos algo assim, 10, 10, 20, 20 e 30, isso definirá todos os valores para nossos traços e espaços para que tenhamos o tamanho do primeiro traço, o tamanho do primeiro espaço, o tamanho do segundo traço, o tamanho do segundo espaço e, em seguida, o tamanho do terceiro traço e, em seguida, ele será repetido até o final da linha. Dez pixels para a primeira linha e, em seguida, 10 pixels para a primeira lacuna e depois passamos para 20 e depois 30. Para manter isso simples, vou passar um único valor de 6 e isso garantirá que cada um dos nossos espaços e também nossos traços estejam em igual valor. A última coisa a desenhar será um círculo central. Sabemos como desenhar um círculo usando o método de arco. Mas desta vez também definiremos uma linha tracejada até o final e começaremos uma nova seção com ctx.beginpath. Para o nosso círculo, ctx.arc. Assim como nossa posição de bola inicial, precisamos colocar isso no meio da tela com tela Largura dividida por 2 e também a mesma para a altura. Pegue isso, cole-os. O terceiro valor é o raio e como temos uma bola de 10, vamos fazer disso um valor de 20. Para o círculo, a posição inicial é 0 e um círculo completo é 2 vezes math.pi. Na verdade, desenhe o círculo que você precisa para chamar o método do traçado deixando nosso círculo central agora no lugar na tela. Isso é a maior parte do que precisamos para nossos jogos em funções de desenho e a grande parte sobre o uso variáveis como essa é que no futuro podemos atualizar esses valores para mover nossos objetos no Canvas. 7. Looping: Looping será uma parte muito importante do movimento das coisas dentro do nosso jogo. Se você pensar sobre isso no momento, atualmente estamos desenhados coisas como uma bola e também os pedais na tela. Mas o que precisamos fazer é atualizar esses valores para movê-los para uma direção diferente, e então precisamos redesenhar e repetir continuamente isso usando um loop. Isso é o que vamos dar uma olhada agora. Na parte inferior do nosso script, a primeira coisa a fazer é criar uma função que você deseja chamar repetidamente loop. Você pode dar a isso qualquer nome de sua escolha, eu vou ficar com loop este. O objetivo desta função é desenhar autográficos repetidamente , como a bola e remos depois que eles se movem de posição. Para chamá-lo, podemos usar um método JavaScript chamado setInterval. setInterval repetirá nossa função de loop após vários milissegundos. Chamamos isso na parte inferior, isso vai levar duas coisas, a primeira coisa é a coisa que queremos repetir e, no nosso caso, é nossa função de loop. Vamos passar isso, seguido um atraso de tempo em milissegundos. Vamos definir isso atualmente para 15, e você pode aumentar isso para o jogo mais lento e reduzir isso para um jogo mais rápido. Esta função de loop acabará por repetir muitas partes do nosso código que temos acima, mas, por enquanto, vamos colocar em um simples log de console para que possamos verificar se isso está funcionando. Então, qualquer texto dentro daqui, salve isso, e agora podemos entrar no console e verificar nosso setInterval está chamando nossa função, inspecionar, pular para o console, e agora, se atualizarmos, podemos ver que isso é chamado a cada 15 milissegundos. Vamos começar substituindo este registro do console pela nossa bola. Para desenhar nossa bola, poderíamos cortar e colar o código que usamos para desenhar nossa bola, que é o método ctx.arc. Ou, em vez disso, poderíamos envolver isso em uma função e chamar isso diretamente. Logo acima disso, criará uma nova função chamada DrawBall. Isso vai envolver todo o nosso código logo abaixo. Abra os suportes encaracolados assim, e então podemos cortar e colar e mover isso diretamente para dentro da nossa função. Agora, podemos chamar nossa função DrawBall de dentro do nosso loop, substituir o registro do console, passar nossa função DrawBall e chamaremos isso a cada 15 milissegundos e atualizaremos o navegador. Algumas coisas a serem observadas aqui, a primeira coisa que você notará é que nossa bola agora é grande demais. Parece que temos um conflito entre os caminhos que estamos desenhando novamente, que pode ser corrigido com CTX.BeginPath. Vou adicionar isso dentro da nossa função DrawBall, atualizar e isso agora corrige nosso primeiro problema. O próximo problema é que a bola na verdade ainda não está se movendo. Isso pode ser esperado porque, embora tenhamos desenhado essa bola repetidamente a cada 15 milissegundos, sempre a desenhamos no mesmo local. Na função DrawBall, sempre desenhamos isso para o centro, e podemos alterar esses dois valores com algumas variáveis que podemos atualizar. Para a largura, que é a exposição, substituímos isso por BallX e Bally pela posição Y. Ainda queremos que ambas as variáveis estejam inicialmente no centro da tela. Primeiro de tudo, BallX, será igual à largura da tela dividida por 2. Coloque isso inicialmente no centro e, em seguida, para Bally logo abaixo, dividiremos a altura da tela por 2. Como esperaríamos se salvássemos e atualizássemos, ainda não vemos nenhuma porque realmente precisamos atualizar os valores de BallX e Bally cada vez que o quadro for repetido. Podemos fazer isso novamente em nossa função DrawBall depois que isso foi desenhado. Assim que passarmos para o próximo loop, atualizaremos o valor de ambas as variáveis , além de igual a 2. Além disso, adicionaremos o valor de dois à nossa variável BallX e, em seguida atualizaremos a variável, Bally é igual. Vamos manter isso curto, já que não temos tantos problemas no eixo y, então o valor de um está bom. Atualize isso. Agora vamos ver a bola viajando na tela. Isso agora está atualizando, mas ainda temos essa trilha sólida na tela, já que a posição anterior da bola precisa ser removida. Podemos consertar isso com um método de tela chamado ClearRect, que limpará todos os desenhos existentes da tela antes de redesenharmos nossa bola até o nosso loop, coloque-o no início, pouco antes de nós repetido para chamar nossa função, passando ClearRect, que está disponível no contexto. Se quisermos ter a opção de limpar apenas peças pequenas ou uma seção específica da tela, em nosso estojo, limparemos a tela completa. Primeiro, passamos no local inicial que está no canto superior esquerdo, que é a coordenada de 0, 0, e depois limpamos a largura total e a altura total. Primeiro de tudo, passando em tela.width, separada por uma vírgula, tela.height e, novamente, substitua isso por pequenos valores. Se você quiser remover apenas uma pequena parte da tela para o navegador, a bola agora se move como esperado sem sair dessa trilha sólida. Vá para a bola, agora se move como esperamos, e não vemos mais nada agora na tela, já que a limpamos com o ClearRect. Estamos limpando a tela cada vez, chamamos essa função de loop. O que precisamos fazer é pegar nossas funções de desenho de cima e também movê-las para o nosso loop. Além disso, os benefícios adicionais de todas essas funções de desenho estarem no loop é que muito em breve vamos atualizar a posição do remo com um teclado, e isso também atualizará a posição na tela em cada loop. Mas, por enquanto, iremos até onde desenhamos nossas formas, e faremos o mesmo que fizemos com a bola, que é envolver todo o código relevante em uma função autônoma. Então, ele pode ser chamado de dentro do nosso loop. Primeiro, a função de desenho foi o remo do jogador, que está aqui logo abaixo de nossas variáveis. Recorte isso e crie uma nova função chamada DrawPlayerPaddle, cole isso de volta em nossa função. segundo é desenhar um remo de computador, e isso é para toda a seção azul. Recorte isso e crie nossa nova função chamada DrawComputerPaddle. Mais uma vez, cole em nosso código, função DrawBall ainda está em vigor. O próximo foi FiltText, e isso é para desenhar a pontuação na tela. Então, corte isso, crie uma nova função chamada DrawScore e, em seguida, cole isso de volta no corpo. As próximas duas seções são para desenhar nossas linhas para a tela. Este era para a linha central e também para o círculo no meio. Colocaremos ambos em uma única função chamada DrawCanvas. Cole isso em. Agora podemos chamar todas essas novas funções do nosso loop: DrawplayerPaddle, que foi o primeiro, seguido por DrawComputerPaddle, DrawScore e, finalmente, DrawCanvas. Vamos experimentar isso, vamos ver o navegador. Agora, depois de limpar nosso retângulo junto com a bola, todas as outras funções de desenho agora estão funcionando. Como seria de esperar, esta é uma parte muito importante do nosso jogo e um grande passo na direção certa. na próxima lição, vamos dar uma olhada em como podemos usar o teclado para mover os jogadores cima e também para baixo até a bola. 8. Como mover objetos com o teclado: Agora chegamos à parte divertida onde podemos realmente fazer as coisas se moverem no Canvas usando controles como o mouse ou o teclado. O objetivo deste vídeo é ouvir quando o usuário pressionar o botão para cima ou para baixo no teclado, então vamos mover o remo dos usuários. Podemos fazer tudo isso com JavaScript regular. No momento, temos esse jogador remo à esquerda. Se formos para a função de remo do jogador de desenho , que controla isso , aqui, podemos ver com o local das coordenadas x e y. Embora isso acabe à esquerda porque temos o valor x para ser 0 e o valor y está definido para estar no centro. Para atualizar nosso remo com o teclado, precisamos substituir esse valor y por uma variável. Para mantê-lo posicionado no centro e não no canto superior esquerdo, ainda podemos manter essa altura de peddle dividida por 2. Mas a altura da tela dividida por 2 pode ser substituída por uma variável chamada posição do jogador. Uma posição precisará ser criada no topo com o resto de nossas variáveis. Usamos let, pois isso precisa ser atualizado. Jogue a posição e defina isso igual a Altura da tela dividida por 2. Para começar, isso deixará nosso jogador no centro da tela, como antes. Mas agora temos uma variável que podemos atualizar. Isso também será verificado em cada loop pois chamamos nossa função do nosso loop. Com essa variável agora configurada, podemos começar a ouvir eventos de teclado, mover a posição do jogador. Logo abaixo disso, o que precisamos fazer é ouvir um evento de teclado com addEventListener. Este é apenas um documento JavaScript regular . ADDEventListener. Vamos ouvir o evento de um usuário. O evento que queremos ouvir é uma tecla que está sendo pressionada, o que acionará uma função que vou chamar de MovePaddle. Função MovePaddle. Como isso não é evento, precisamos acessar as informações do evento para descobrir exatamente qual tecla o usuário pressionou, precisamos passar as informações do evento para nossa função. Comece, começaremos com um log de console transmitindo o valor de e. Podemos ver exatamente quais informações de eventos temos para o nosso evento chave para baixo. Pule para o console, atualize. Isso não fará nada para começar até que o usuário tenha pressionado a tecla. Vamos começar com a tecla para cima, que imprimirá todas as informações de nossos eventos de teclado. Há muitas informações aqui que não precisamos. Mas a principal coisa que você precisa para este projeto é essa propriedade de código. Você pode ver que esta é uma sequência de seta para cima. Se agora fecharmos isso e pressionarmos a seta para baixo, o código que você precisa para este é Seta para baixo. Podemos acessar e.code e verificar se cada um deles é igual à seta para cima ou a seta para baixo, então podemos definir o valor da posição do jogador. Vamos remover o log do console pois sabemos o que estamos procurando agora e substituí-lo por uma instrução de switch JavaScript. O valor que queremos verificar, como acabamos de ver, é e.code. Como somos apenas a lista atual agora para a seta para cima sendo pressionada ou a seta para baixo, ela pode substituí-la por instruções if else, se você preferir. Mas eu quero usar uma instrução switch para que possamos estender isso mais tarde para usar o teclado para iniciar o jogo. Para começar, o primeiro caso que precisamos ouvir é Arrow Up. Certifique-se de que isso corresponda à string exatamente como vemos dentro do console. Cada palavra começa com uma maiúscula. Se a seta para cima tiver sido pressionada com a necessidade de atualizar a posição do jogador deduzindo um valor. Porque lembre-se, o valor de y no topo é 0. Isso é atualizado à medida que a posição do jogador se move para baixo passando nossa variável de posição do jogador. Para isso, faremos uso do operador de atribuição de subtração, que subtrairá nossos valores específicos, como 15 do nosso valor atual e, em seguida, reatualizará essa variável. Cada um de nossos casos precisa ser seguido com uma cláusula break. Saia da nossa instrução switch se este caso estiver sendo correspondido. Também precisamos colocar em dois pontos dentro daqui. Nosso segundo caso está logo abaixo. Este será para o caso de Seta para baixo : Desta vez, atualizaremos a posição do jogador com o operador de atribuição de adição, que adicionará 15 e, em seguida, reatribuirá nosso novo com o valor atualizado. Vamos sair disso se este for verdade. Como nossa posição do jogador é usada dentro da nossa função quando desenhamos o remo, agora devemos poder atualizar isso quando pressionarmos as teclas para cima e para baixo. Também podemos mover qualquer outra coisa na tela usando a mesma técnica. Em um vídeo futuro, veremos como mover o remo do computador para cima ou para baixo, mas este precisa ser feito automaticamente. Em seguida, vamos cobrir como lidar com a bola saltando de nossos objetos. 9. Detectando colisões e saltos: Que tipo de jogo teríamos se a bola não saltasse dos lados ou também das remos? Bem, este é complicado porque envolve algum trabalho porque todas as nossas coordenadas atuais são baseadas nas linhas centrais de coisas como a bola e também o remo. Mas faremos o nosso melhor para descobrir as coisas e seguiremos para isso agora. Se localizarmos essa função de draw ball, sabemos que essas duas linhas de código no final são responsáveis por mover nossa bola. Cada vez que a bola é desenhada para a tela, vamos mover o valor da bola X e também o valor da bola Y. Além disso, sabemos como mudar a direção. Se agora atualizarmos isso, isso passará em uma direção positiva. Também podemos mudar a direção alterando qualquer um desses valores para ser um número negativo. Esta será a base de saltar de nossas paredes e também do remo. Para fazer isso, em vez de ter nossos valores codificados assim, vamos atualizar essa função para usar variáveis. Mova x para o local x e mova y para a direção y. Isso tornará a atualização desses valores dinamicamente muito mais fácil para que possamos reverter a direção quando houver uma colisão. Na parte superior, vamos configurá-los como variáveis. Primeiro de tudo, mova x e, por enquanto, vamos manter os mesmos valores codificados que tínhamos antes. Mover y isso era igual a um. Mas você pode atualizá-los para valores diferentes, se quiser. Também mais uma variável para o raio da bola, que é um valor inicial de 10. Vamos precisar muito disso quando estamos calculando as colisões. Isso ocorre porque a bola está posicionada a partir do ponto central do círculo, mas quando ela chega ao topo, por exemplo, também precisamos levar em conta o raio da bola. Também podemos atualizar nossas funções para fazer uso do raio da bola logo abaixo. De volta para desenhar bola. Aqui estamos definindo o raio da bola para ser também alguns pixels, ou podemos atualizar isso para usar nossa variável. Agora, vá para a função para verificar se há uma colisão. Vamos configurar uma função na parte inferior logo acima do nosso loop. Vou chamar minha função de colidir. Então essa função será responsável por verificar quatro coisas diferentes. A primeira coisa é saltar de cima e de baixo. Também queremos verificar se há contato à esquerda ou à direita do nosso jogo, então precisamos verificar a pontuação no eixo x. Isso se aplica a ambos os lados. Também queremos verificar se há contato com o remo dos jogadores. Além disso, o mesmo para o remo do computador também. Bom. Agora sabemos o que queremos fazer dentro dessa função, e podemos chamar isso logo abaixo do nosso loop. Isso significa que verificaremos todos os pontos de colisão em qualquer quadro do nosso loop. Verificaremos o contato sempre que algo se mover. Agora temos um pouco de trabalho para fazer dentro dessa função de colisão. Pouco antes de começarmos a trabalhar nossos quatro pontos de contato, vou desenhar uma bola temporária na tela. Podemos mover isso e garantir que temos os pontos de contato corretos. Primeiro de tudo, começaremos um novo caminho. Ele não interfere em nenhum outro desenho. O estilo de preenchimento. Você pode fazer isso qualquer cor que quiser apenas para que ele se destaque, eu vou para o roxo. Então ctx.arc para desenhar nossa bola na tela. Qualquer local por enquanto, qualquer local aleatório está bom, 10 pixels no x e y como no raio da bola. Para fazer nosso círculo, o ângulo inicial pode ser zero e, em seguida, 2 vezes Math.pi. Desenhe isso, a última coisa que precisamos fazer é ctx.fill, save, e há uma bola no canto superior da nossa tela. Certo. Os primeiros pontos de contato que queremos verificar são a parte superior e inferior da tela. Começando pela parte inferior. Vamos mover nossa bola temporária até a parte inferior da tela e garantir que temos o ponto de colisão correto. O eixo x não importa por enquanto, mas precisamos mudar a direção y. Mas antes de tudo, passaremos na tela.height, salve isso. Como você pode ver, isso empurrará isso para fora da borda da tela, então precisamos puxar essa metade do raio da bola. Já temos isso armazenado como uma variável, para que possamos deduzir isso da altura da nossa tela. Lá vamos nós. Este é o ponto de colisão na parte inferior da tela que queremos tomar cuidado. Agora, podemos fazer uso disso em uma declaração if. Queremos verificar se algo é verdade. A verificação que você deseja fazer é se a bola y, que é a localização no ponto central da bola, é maior do que a localização da bola que acabamos de desenhar; se a bola foi mais longe abaixo desse ponto atual, ele é considerado fora da tela, e então precisamos girar a direção. Pouco antes de fazermos isso, vamos testar que isso está funcionando bem com o log do console do hit bottom. Entre no console e atualize o navegador. Assim que o ponto de contato chegar à parte inferior da tela ou se apagar, queremos que nosso log do console seja executado dentro daqui. Saltar esta bola é bem simples. Atualmente, quando o jogo começa, a bola vai em uma direção positiva ou descendente, mas podemos reverter isso mudando isso para um número negativo, assim como vimos no início deste vídeo. Agora, nisso e como estamos trabalhando na direção y, podemos substituir nosso log do console atualizando a variável. Mover y, que é o local atual, é igual a uma versão negativa do movimento y. que efetivamente reverterá o positivo para um negativo e um negativo para um positivo. Vamos salvar isso e experimentar isso. Atualize, e devemos ver um salto fora do fundo. Claro que ainda sai do canto do lado direito da tela, mas tudo bem. Agora podemos ver que nosso salto está funcionando. Bom. Agora precisamos explicar a colisão na parte superior da tela também. Dentro da instrução if, adicionaremos uma condição ou. Desta vez, queremos verificar se a localização da bola y está apenas tocando a parte superior da tela. Não queremos verificar se isso é igual a zero porque se fosse, por causa do raio da bola, isso seria meio desligado e meio na tela. Também queremos deduzir o raio da bola. Verificamos se isso é menor ou igual a zero. Se for, ele deve saltar da parte superior da tela. Atualmente, quando recarregamos o navegador, a bola se move na direção descendente. Mas para testes, podemos mover a direção y de movimento para ser um número negativo, e isso fará com que a bola se mova em uma direção ascendente. Este é o básico de como podemos saltar uma bola. Na verdade, é principalmente um caso de apenas verificar se nossos pontos de contato estão corretos, e também garantir que também consideramos o raio da bola também. Agora vamos adicionar uma condição para verificar se a bola atinge o lado esquerdo ou direito da nossa tela e, posteriormente, isso aumentará as pontuações. Este será todo baseado na localização da bola x para o lado esquerdo e direito do nosso jogo. Volte para a nossa função, que está colidindo. Então, logo abaixo dos nossos comentários, também queremos colocar em uma declaração if. Primeiro de tudo, para verificar se a bola está colidida no lado esquerdo. Atualmente, nossa bola temporária é exatamente onde queremos que o ponto de contato esteja, que é definido como um valor de 10. Tudo isso funciona bem porque nosso raio de bola está definido para 10. Queremos verificar se a localização armazenada dentro da variável da bola x é menor ou igual ao raio da bola. Efetivamente, se a bola estiver à esquerda, onde está agora, queremos passar uma pontuação para o computador. Forneceremos uma maneira de fazer isso mais tarde, mas, por enquanto, basta colar em um registro do console da pontuação do computador. Então, abaixo disso, uma seção else-if. Isso será para o nosso cheque ver se o jogador marcou movendo a bola para o lado direito. Para este, passamos na localização da bola x. Queremos ter certeza de que a bola está tocando o lado direito da tela. Novamente, a posição x verticalmente está no centro da bola. Também queremos verificar se a bola x mais o raio da bola é maior que igual à largura total da nossa tela. Podemos pegar isso com a largura da tela. Em seguida, colocando um registro de console para a pontuação do jogador, teste isso no console. É um pouco maior. Você tem um erro de digitação na linha 85. Isso só quer ficar juntos, sem espaço no meio. Vamos experimentar isso agora. Se a bola se mover para a direita, vemos que há uma pontuação de jogador. Se subirmos à nossa localização x no topo, pode ser apenas um número negativo. Podemos então testar a pontuação do computador. Aqui vamos nós. Isso agora tudo funciona como esperado. As coisas estão realmente começando a tomar forma agora com o nosso jogo. Em seguida, vamos dar uma olhada em outra seção importante, que é saltar a bola das remos em movimento. 10. Contato com pá: De forma semelhante a saltar dos lados da nossa tela, agora também precisamos explicar a bola batendo nossas pás móveis também. Isso envolve um pouco mais de trabalho porque precisamos explicar não só a bola batendo na frente do remo, mas também precisamos verificar se a localização da bola está entre a parte superior e a parte inferior do remo também. Começando com o remo do nosso jogador, para verificar se estamos trabalhando corretamente, podemos usar esta bola temporária, colocar isso na frente do remo e verificar se temos o ponto de contato correto. Salte para a função colide e, no topo, temos esse arco que está criando esta bola temporária. Remova esse valor e coloque isso na face do remo, precisamos mover isso no eixo x, no raio da bola, mais a largura da pá que é armazenada na variável de largura da pá. Atualize e, em primeiro lugar, podemos ver esse movimento e, apenas para confirmar isso, podemos mover isso o centro ajustando o eixo y igual à altura da tela dividida por 2. Lá vamos nós. Agora temos o ponto de contato correto para o nosso remo. Podemos usar esse ponto de contato agora para verificar se a bola é menor ou igual a esse valor X. vez, configuramos uma declaração if assim. Vá para o nosso comentário, que é verificar o contato do remo do jogador. A instrução if verificará se a posição da bola X é menor ou igual à posição X que acabamos de definir, que é o raio da bola mais a largura da pá neste final. Basicamente, verificando se esta posição da bola está onde ela está agora ou menor que. Usando nossa variável move X, podemos reverter isso definindo isso igual ao equivalente negativo. Lembre-se aqui, embora tudo o que estamos fazendo é verificar a localização X, então a bola deve saltar em qualquer lugar verticalmente, de cima para baixo, desde que esteja em linha com a face do remo. Vamos atualizar isso e testar isso. Agora devemos ver um salto antes que ele atinja a parte de trás da tela. Bom, então tudo isso agora funciona bem. Em seguida, queremos restringir esse salto para que só aconteça quando a bola estiver entre a parte superior e a parte inferior do remo. Já temos uma variável em nosso jogo chamada posição do jogador, que está definida para estar inicialmente no centro da tela, que para nós agora seria 200. Quando as teclas para cima e para baixo são pressionadas, o ponto central para o remo atualizará a variável de posição do jogador para que sempre saibamos onde isso está. Por exemplo, digamos que esteja atualmente em 100, em seguida, precisamos verificar onde a bola está em relação ao remo. Agora podemos usar 70 como posição da bola. Tire esse valor do remo e podemos ver que a diferença é de 30 pixels, e esse é um número positivo. Em outro exemplo, aqui podemos ver que a posição da bola é 125. Mais uma vez, tire isso da posição do jogador, mas desta vez o resultado é um número negativo de 25. Mas por que esse cálculo é importante? Bem, isso importa porque se esse número estiver dentro da altura do remo, deve haver um contato. Teríamos metade da altura do Paddle já que estamos trabalhando a partir da linha central e também precisamos explicar o raio da bola também. É aqui que as coisas podem ficar um pouco mais complexas. Aqui nós adicionamos o raio ou deduzido, dependendo de qual lado da bola está ligado, valores positivos e negativos. No slide anterior, também tínhamos os mesmos números positivos e negativos para contabilizar também. Isso significa que poderíamos escrever algum código complexo para explicar isso ou poderíamos tornar nossas vidas muito mais fáceis mudando cada comparação para ser positiva ou podemos fazer isso com um método matemático chamado absoluto. Para ver como o matemato. absoluto funciona, vamos pular para o console e testar isso. Colocando um registro de console com o valor de matemática, delta abs passando em um número positivo, como dois. Agora, se atualizarmos e entrarmos no console, podemos ver que temos o valor de dois , assim como esperado no console. No entanto, se mudarmos isso para ser um valor negativo, vou apenas mover isso para fora do loop para que ele não continue repetindo. Atualize, também podemos ver que o valor ainda é um número positivo de dois. Independentemente de passarmos em um número positivo ou um número negativo, sempre obtemos o equivalente positivo mostrado. O ponto aqui é que podemos usar esses métodos absolutos para garantir que o cálculo entre a bola e o remo seja sempre positivo, o que significa que sempre podemos comparar esse valor com um positivo ação de adicionar o raio da bola em vez de ter que trabalhar se quisermos adicionar ou deduzir isso. Vá para o código e vamos ver como isso parece. Podemos remover nosso registro do console e, em seguida, entrar em nossa declaração if na parte superior. Atualmente, verificamos apenas a exposição, mas agora também precisamos verificar a posição Y com o operador “AND”. Agora vamos verificar se a bola está entre a parte superior e a parte inferior. Passando matemática para abdominais. Sempre recebemos um número positivo. O que queremos fazer é verificar se a posição da bola Y, tirar a posição do jogador. Lembre-se que isso nos dará esse valor entre a bola e o remo, mas sempre será um número positivo ao contrário dos slides. Em seguida, verificamos se esse valor é menor ou igual à altura do remo, dividido por 2 mais o raio da bola. A razão pela qual podemos adicionar o raio da bola, e não precisamos nos preocupar em tirar dependendo de qual lado ele está é porque estamos sempre convertendo isso para ser um número positivo, portanto, estamos sempre adicionando o raio da bola. Vamos salvar isso e experimentar isso dentro do navegador. Em primeiro lugar, a bola pode jogar automaticamente, e se agora movermos o remo no lugar, eles agora devem causar um ponto de contato entre a bola e o remo. Sei que isso pode parecer difícil, mas sem essa conversão positiva, não precisaríamos duplicar isso para a bola estar acima ou abaixo da linha central do remo. Agora, com isso funcionando, a próxima coisa a fazer é verificar o ponto de contato para o remo do computador. Este será bem parecido, então podemos copiar a declaração if completa na seção do player e colar isso logo abaixo do comentário do computador. Primeiro, a exposição precisa estar à direita. Agora precisamos verificar se a posição da bola agora é maior, adicionar o raio da bola para explicar isso. À direita do maior ou igual, precisamos verificar se a bola está além da face do remo do computador. Podemos fazer isso verificando a tela, largura, levando a largura do remo. Esta deve ser a posição X cuidada e, para a posição y, isso será bem semelhante. Queremos também verificar se isso está entre a parte superior e a parte inferior do remo em vez verificá-lo contra a posição do jogador, queremos verificar isso contra a posição do computador. É claro que este ainda não foi criado então vamos até o topo onde criamos nossas variáveis e podemos duplicar posição do jogador e mudar essa para ser a posição do computador. Novamente, definir isso para estar no centro da tela é completamente bom para o início do nosso jogo. A posição do computador também será atualizada em um vídeo futuro. Para limpar isso, agora podemos voltar para a função colide e remover nossa bola temporária, não precisamos mais disso. Vai ser muito difícil testar se o remo do computador está funcionando, já que não podemos mover isso em direção à bola. Mas uma coisa que podemos fazer apenas para verificar as coisas e verificar que temos um salto, é mudar a posição Y de movimento para ser um valor de zero. Isso moverá a bola horizontalmente em nosso jogo, fora do remo dos jogadores. Excelente, então o salto agora está funcionando em ambos os remos. Agora ele muda de volta, Negativo 1 já que sabemos que isso está funcionando. Nós passamos por uma das partes mais difíceis do nosso jogo. Pode ser um pouco difícil de aceitar, mas isso realmente é uma parte essencial para fazer nosso jogo funcionar corretamente. Não é perfeito. Não contabilizamos certos casos de borda, como se a bola atingisse o topo ou o fundo do remo, mas não queremos ir muito fundo neste curso. Em seguida, no próximo vídeo, vamos dar uma olhada em como rastrear as pontuações, tanto para o jogador quanto para o computador também. 11. Seguindo pontuações: Já usamos o método filtText para desenhar nossa pontuação no Canvas e nossas pontuações também são armazenadas em variáveis. Também sabemos quando o jogador ou o computador marca acertando a bola do lado esquerdo ou direito do nosso Canvas. O próximo passo lógico seria atualizar essas variáveis quando isso acontecer, para depois atualizar a pontuação na tela, essas variáveis onde o jogador pontuação e também a pontuação do computador na nuvem Função, vamos localizar isso dentro do nosso script. Só aqui. No momento, entramos no console quando um jogador ou o computador marcou. Dentro da nossa instrução if else if, poderíamos atualizar diretamente nossas variáveis de pontuação dentro daqui, mas, em vez disso, vou chamar uma função. Esta função também verificará outras coisas, como se o jogo acabou e também colocará a bola de volta no centro. Substituiremos esses dois logs de console por uma função que vamos criar em breve chamada score. A função de pontuação também precisará estar ciente de qual de nossos jogadores marcou. Para o nosso primeiro, passaremos no computador como uma corda, e para o segundo, se o jogador marcou, passaremos o jogador para essa função. Claro, precisamos criar isso e apenas explodir nossa Função Cloud, criar nossa função chamada score. Aqui dentro, vamos pegar o jogador. Lembre-se que esta variável de jogador será igual ao nosso computador ou ao nosso jogador. Podemos verificar qual deles foi passado com uma instrução if. Se a variável player for igual ao computador, faremos algo dentro daqui, que é atualizar nossas variáveis. Lembre-se, no início, analisamos a pontuação do jogador e a pontuação do computador, e aqui vamos atualizar ambas as variáveis pelo valor de uma. Este é para a pontuação do computador. Aumenta com plus-plus. Caso contrário, atualizamos na pontuação do jogador. Vá para o navegador e vamos testar este. Vamos deixar a bola desmaiar e o remo. Podemos ver que a pontuação do computador está subindo muito rápido. A razão pela qual isso acontece é porque cada vez a bola se move ou cada vez que temos um novo quadro dentro do nosso loop, estamos verificando se a bola está atrás do jogador ou do remo do computador. Como estamos continuamente atrás do remo, a pontuação continuará aumentando. Para corrigir isso, podemos colocar a bola de volta no centro do nosso jogo para que possamos começar de novo. A maneira como podemos fazer isso dentro da nossa função de pontuação é redefinir a localização da bola com BallX é igual à tela. Largura dividida por 2, coloque isso no centro. Também faremos o mesmo pela localização do Bally. Desta vez, isso é baseado na altura da tela, também dividido por 2. Vamos testar isso. Refresque, deixe a bola passar atrás do remo, isso é definido para um, então a bola é colocada de volta ao centro para o nosso jogo continuar. Essa é uma maneira simples de rastrear as pontuações do nosso jogo. Na próxima seção, vamos dar uma olhada em como podemos adicionar uma pontuação máxima para que saibamos quando o jogo terminou e também mostraremos o vencedor no Canvas. 12. Encerrando o jogo: O primeiro passo para terminar nosso jogo é definir quantos pontos queremos ser o máximo. Para isso, precisamos de uma variável no topo chamado total vencedor. Const WinningTotal e meu valor será igual a três, então o primeiro jogador a chegar a três será o vencedor e podemos atualizar isso dentro da nossa função de pontuação. Vamos voltar para nossa função. Aqui precisamos verificar se a pontuação do nosso computador ou pontuação do jogador é igual a esse total vencedor. Colocando uma instrução if para começar, verifique se a pontuação do computador é igual à nossa nova variável, que está ganhando o total. Se for, vamos fazer algo, se não, passaremos em uma cláusula else-if e desta vez verificaremos se a pontuação do jogador também é igual ao nosso total vencedor. O que queremos fazer dentro daqui, vamos terminar o jogo criando uma função EndGame. Obviamente, ainda não criamos isso, mas é chamado EndGame. Assim como quando criamos nossa função de pontuação, que assumiu o jogador, também faremos o mesmo para a função EndGame. Esta é a esquerda, essa função sabe qual foi a vencedora. Este foi o computador, então também passaremos a palavra-chave return para sair das instruções. De forma semelhante, a instrução else-if também chamará nossa função EndGame, mas passando no jogador. Também retorne disso se isso for verdade e a razão pela qual a função EndGame precisa saber qual desses jogadores foi o vencedor é porque vamos mudar as cores dependendo de qual foi o vencedor. Como você pode ver, temos a cor vermelha para o jogador e a cor azul para o computador. Isso será refletido dentro do nosso texto final do jogo. Vamos criar essa função logo abaixo. Lembre-se de que isso está sendo passado pelo computador ou pelo jogador, que armazenará dentro de um vencedor e depois passará em uma declaração if else. A seção if podemos verificar se o vencedor é igual ao computador. Só precisa remover esses suportes que não os temos na seção else. Se o vencedor for igual ao computador, que é a cor azul, vamos mudar a cor do texto para exibir os resultados para serem uma cor azul. CTX.FillStyle é igual a azul e, em seguida, na seção else, alteramos FillStyle para ser igual à cor vermelha para corresponder ao nosso jogador. Agora, a razão pela qual estamos mudando essa cor do texto é porque vamos exibir algum texto na tela quando o jogo terminar. Isso simplesmente informará ao jogador se ele ganhou ou se o computador ganhou. Pouco antes do texto, definiremos a linha de texto como igual ao centro. Coloque isso no meio da tela e, em seguida, criamos nossos textos com uma função chamada FillText. Abra o backtick para que possamos inserir uma variável porque também precisamos inserir a variável do vencedor, dependendo se o computador ou o jogador ganhou. Digamos que o vencedor seja, dois pontos, depois usando o símbolo do dólar e as chaves em JavaScript, podemos inserir a variável do vencedor. Este será o vencedor do jogador ou o vencedor é computador. Após os backticks, adicione uma vírgula , então podemos colocar isso no centro da tela. Primeiro de tudo, a exposição, que é a tela.largura dividida por dois. Na posição Y está a lona.altura dividida por dois. Navegador automático e podemos experimentar isso. Atualize e vamos mover isso do caminho para chegar ao valor de três. Isso é um, dois e três. Você pode ver imediatamente que vemos inicialmente nosso texto, mas ele desaparece rapidamente e o jogo continua. A razão pela qual isso acontece é porque nosso loop ainda está em execução. Não fizemos nada para parar nosso intervalo definido. Quando o jogador ou o computador chegar à pontuação de três, ainda estamos desenhando o texto muito brevemente para a tela, mas na próxima iteração do nosso loop, estamos executando esse método de texto claro, que está limpando todos os textos da tela e, em seguida, redesenhou todas as nossas funções do jogo. Como impedimos que esse loop seja executado? Bem, o intervalo definido pode ser interrompido por um método chamado intervalo claro. Isso envolve armazenar uma referência a esse intervalo quando o criamos e, em seguida, usar essa referência para interrompê-lo mais tarde com intervalo claro. Essa referência pode ser armazenada dentro de uma variável e, como todas as demais variáveis, isso estará no topo. Chame esse GameLoop e, em seguida, na parte inferior, defina essa variável como igual ao nosso intervalo para que o GameLoop seja igual ao nosso setInterval. Aqui, ainda estamos chamando setInterval como antes, mas isso retornará um ID exclusivo que é armazenado dentro dessa variável. Podemos ver isso se registrarmos isso no console, entrar no navegador e nos atualizarmos no console e pudermos ver o valor de um. Se tivéssemos vários intervalos em execução, cada uma dessas IDs retornadas será única. De volta à nossa função EndGame, essa variável agora pode ser passada para ClearInterval para impedir que o loop seja executado. Faremos isso logo no início da nossa função. Passe qualquer método que seja ClearInterval, que leva em nosso ID, nosso intervalo de armazenamento de referência chamado GameLoop. Agora podemos testar isso, atualizar, esperar que isso chegue a um valor de três. Bom. Podemos ver imediatamente os congelamentos do jogo e ainda temos o texto na tela. Para melhorar isso, seria melhor limpar a bola, limpar as remos e também essas linhas pontilhadas no fundo. Mesmo apenas a pontuação no vencedor na tela. Isso é algo que já sabemos como fazer a partir do nosso loop onde limpamos nossa tela, nós ClearRect. Vamos copiar isso e colocar isso dentro da nossa função EndGame. Isso somente o método ClearInterval, limpará todo o resto do Canvas. Como isso acontece antes de desenharmos nosso texto, ainda devemos ver o texto na tela mas seria útil se também pudéssemos ver a pontuação no topo. Bem, isso é bem simples. Também sabemos como desenhar a pontuação com essa função aqui. Depois de limpar nosso Canvas, atualize e tentaremos isso mais uma vez. Ótimo, a tela foi limpa ainda vemos o texto. Ainda vemos a pontuação final no topo também. Com tudo isso agora funcionando, em seguida, vamos começar e reiniciar nosso jogo. 13. Iniciando e recomeçando o jogo: Em vez de nosso jogo começar imediatamente assim que o navegador carregar, seria bom acionar essa ação com o teclado usando algo como a barra de espaço. Agora vamos dar uma olhada em como fazer isso e também como reiniciar nosso jogo assim que ele terminar. Usarei a barra de espaço para iniciar o jogo, mas você pode mudar para uma chave diferente, se preferir. Olhe dentro de nossas instruções switch. vamos ouvir a seta para cima e a seta para baixo. Podemos criar um novo caso para ouvir nossa chave escolhida para começar o jogo. Então, caso, desta vez como uma string. A chave que vou ouvir é a barra de espaço, colocar dois pontos, e então vamos chamar uma função para iniciar o jogo chamado game start. Na cláusula break, se isso for verdade, e pouco antes de criarmos essa função, também faria mais sentido agora renomear essa nova parte da função para ser outra coisa, já que ela faz outras coisas em vez de simplesmente mover nosso jogador para cima ou para baixo. Eu quero ir para uma tecla manipulada pressionada. Lembre-se de que também precisamos alterar isso em nosso ouvinte chave para baixo logo acima. Claro, precisamos criar esta função de início do jogo. Configure isso logo abaixo. Se pensarmos sobre isso, o que você quer que este jogo faça? Bem, como atualmente não podemos atualizar o jogo e ele começa atualmente sem fazer nada, queremos agora mover esse loop, que chamamos isso na parte inferior para o nosso função. Em vez de este jogo começar imediatamente, podemos cortar isso e colocá-lo em nossa função de início do jogo, então isso só acontecerá quando a barra de espaço for pressionada. Vamos tentar isso. Se atualizarmos, ainda não veremos nenhum jogo começar. Pressione a “Barra de espaço” ou a tecla escolhida e lá vamos nós. Em vez dessa tela vazia, também deve haver algumas instruções no início. Deixe o usuário saber que ele precisa pressionar a barra de espaço para começar. Isso não precisa entrar em uma função ou qualquer outra coisa, podemos simplesmente adicionar isso na parte superior do nosso script. Mas isso vai ser apenas alguns textos e usamos FillText, mas primeiro definiremos a cor com FillStyle igual a vermelho. Você pode mudar isso se preferir. CTX.font definirá que isso seja uma string ou 30 pixels para o tamanho da fonte com um estilo de Helvetica. Coloque isso no centro com a linha de texto, depois desenhe nosso texto com o método chamado filtText e passe uma string. Não precisamos inserir nenhuma variável, então as cotações regulares estão boas, então o texto do espaço de imprensa para reproduzir. Para as posições x e y, esta é a largura da tela dividida por duas e também divide a altura por duas. Vamos experimentar isso. Há nosso texto. Pressione “Espaço” e nosso texto também é limpo porque se você se lembrar de baixo na parte inferior, a tela será limpa antes de cada um dos nossos loops. De volta à nossa função de início do jogo, também há algumas outras coisas que precisam entrar aqui também. O primeiro passo no topo é redefinir todas as pontuações. A pontuação do jogador igual a 0 e a pontuação do computador também 0. uso de intervalo claro também eliminará todos os temporizadores existentes armazenados dentro da nossa variável de loop de jogo . Vamos experimentar isso. Atualize, pressione “Espaço” para começar, e tudo parece bem. Todas as pontuações atualizadas, mas há um pequeno problema se continuarmos pressionando a barra de espaço durante o jogo. Você pode ver no topo, se pressionarmos a barra de espaço agora, a pontuação é redefinida cada vez que começamos o jogo. Isso não é um problema se realmente quisermos começar o jogo, mas se o jogador pressionar isso acidentalmente durante o jogo, ele será reiniciado. Podemos ajudar isso acompanhando isso com uma variável. Deixe que o jogo seja inicialmente um valor de false, então mudaremos isso para ser verdade à medida que o jogo está em execução, que impedirá que a barra de espaço reinicie nosso jogo. Precisamos colar isso em alguns lugares diferentes. Primeiro de tudo, procuramos nossa função, que é o fim do jogo. Como você imagina, já que este é o fim do jogo, também podemos definir essa variável de execução do jogo como igual a false na função de início do jogo. Agora, no topo, queremos fazer uma verificação para ver se essa variável de execução do jogo é igual a verdadeira. Passe isso dentro de instruções if, se o jogo estiver em execução. Não precisamos dizer igual a verdadeiro ou algo assim. Se o valor da execução do jogo for igual a verdadeiro, o código dentro dessas chaves será executado. Ou também podemos colocar isso em uma única linha e remover as chaves e depois retornar para fora dessa função. Basicamente, se a execução do jogo for igual a verdadeira, saltaremos para essa função sem executar o resto do código abaixo. Isso impedirá que o jogo reinicie. Se não for, se for igual a false, queremos seguir em frente e executar o código abaixo. Também diríamos que em nossa variável de corrida de jogo agora seja igual a verdadeira. Portanto, isso impedirá que essa função executada pela segunda vez, se a barra de espaço for pressionada durante o jogo. Podemos tentar isso, atualizar, pressionar “Espaço”, deixar a bola ir para trás para a pontuação e, se agora tentarmos pressionar o espaço, o jogo não será redefinido. Mas temos outro problema para resolver e para ver isso, se reiniciarmos o jogo e esperar para chegar à pontuação de três, vamos passar para trás três vezes. Tudo é bom, temos o texto do vencedor é computador, a pontuação de 3-0. Mas agora, se reiniciarmos o jogo com a barra de espaço, o jogo reiniciará, mas ainda temos uma pontuação inicial de um. Mas você esperaria que isso fosse zero, já que definimos isso dentro de nossa função. Por que você acha que isso está acontecendo? Bem, para saber mais, vamos entrar em nossa função de pontuação. A função score é o único lugar onde atualizamos qualquer uma dessas variáveis. A função score está sendo chamada logo acima dentro da nossa função de collide. Entre na função collide e chamamos isso com nossa seção if else. Esta é a única função ou o único pedaço de código que é chamado em nosso jogo, que é responsável por atualizar essas variáveis. Sabemos que essa é a causa da nossa pontuação ser definida como uma inicialmente. Por que você acha que essa função de pontuação está sendo chamada no início de um novo jogo? Bem, a razão pela qual isso acontece é porque assim que o jogo terminar, nossa bola está no lado esquerdo para uma pontuação, ou no lado direito. Temos isso controlado pela variável chamada BallX. Sim, na nossa função de início do jogo, nós inicialmente redefinimos essas duas pontuações, mas assim que um novo jogo começa, a localização do BallX ainda está tocando um dos lados, fazendo com que a função de pontuação corra novamente. Consertar isso é bem simples, tudo o que precisamos fazer é redefinir a localização do BallX para voltar ao centro quando o jogo começar. O jogo começa logo após a execução de um jogo e antes de redefinir nossas pontuações, também podemos redefinir o valor do BallX para estar no centro da tela. Vamos testar isso. Chegamos ao final do nosso jogo, que é uma pontuação de três. O jogo acabou, ambas as nossas pontuações agora são redefinidas conforme o esperado. Ao criar jogos como esse, muitas vezes você encontrará casos de borda como esse para funcionar e geralmente é apenas um caso de experimentar coisas diferentes e ver qual deles funciona. Em seguida, vamos dar uma olhada em como podemos aplicar algum movimento aleatório à bola quando ela saltar. 14. Direção aleatória: Ter ambas as variáveis MoveX e MoVey predefinidas torna o jogo começar muito mais previsível. Sabemos porque nossos valores negativos 2 e negativos 1 em que direção a bola iria. Podemos melhorar isso tornando isso muito mais aleatório dentro de uma função. Vamos criar uma função logo abaixo nossos textos, chamada movimento aleatório. O objetivo dessa função é definir ambas as variáveis com alguns valores aleatórios, o que significa que agora podemos remover esses valores iniciais. Para definir essas variáveis, precisamos chamar essa função RandomMovement dentro do GameStart. Localize essa função, chame nossa nova função, que redefinirá nossas duas variáveis com um novo valor cada vez que nosso jogo começar. Volte para nossa função RandomMovement que gera nossos dois valores x e y, além de colocar a bola em direções imprevisíveis. Isso também diminuirá a velocidade e acelerará o jogo um pouco por causa dos valores e movimentos aleatórios, seja, o movimento x pode ser maior ou menor, fazendo com que ele se mova mais lento ou mais rápido. Mais uma vez, crie duas variáveis ou duas constantes. Isso é x aleatório, que será um número aleatório entre dois e quatro. Basicamente, vamos definir nosso valor x como igual a 2 ou 4 e também uma direção positiva ou negativa. Podemos fazer isso acessando uma função matemática JavaScript chamada aleatória. Math.random gerará um número aleatório entre 0 e 1. Mas vamos multiplicar esse valor por 3. Fazer isso nos permitirá gerar um número de um em diante. Também podemos arredondar isso cortando esse valor. No método math.ceil, cole isso em. Agora, já que estamos arredondando nosso valor, isso nos dará um valor de 1, 2 ou 3. Como queremos o valor de 2-4, podemos adicionar mais um a esse valor para nos dar nosso número aleatório. Vamos testar isso. Colocando um log de console do RandomX, salve e atualize o navegador, pule para o console. Para ver isso, também precisaremos chamar nossa função GameStart. Pressione Espaço, o valor de 2, o valor de 4, 2, 3, 2. Tudo isso parece funcionar corretamente. Para nossa localização Randomy, podemos duplicar essa linha, alterar o nome da variável para ser Randomy. Randomy será um número entre 0 e 2. Este não precisamos adicionar mais 1. Podemos usar math.round para arredondar esse número para baixo, deixando-nos com um valor de zero a dois. Agora também precisamos criar mais duas variáveis. Isso vai decidir se temos uma direção positiva ou negativa. Atualmente, temos apenas um valor x e y positivo, mas isso também aumentará a imprevisibilidade. Const PlusorMinusX. Mais uma vez, acessaremos a função JavaScript aleatória, que mais alguém nos dará um número entre 0 e 1. Usando o operador condicional JavaScript, podemos verificar se esse valor é menor que 0,5, o que deve ter aproximadamente uma chance 50/50. Se for, retornaremos ou armazenaremos dentro dessa variável uma string negativa. Caso contrário, será positivo. Como este é um número entre 0 e 1, há uma chance de meia ou 50/50 aproximadamente que isso seja um valor negativo ou positivo. Também adicionaremos isso aos nossos números em breve. Duplique esta e a única diferença desta vez é o nome da variável y. Em seguida, podemos usar essas variáveis para mesclar e criar nossos novos valores das variáveis MoveX e MoVey. Primeiro, a variável MoveX. Como também estamos retornando um valor de string para o positivo ou o negativo, vamos envolver isso dentro de uma função numérica para garantir que sempre obtemos um número em vez de uma string. Começando com x, PlusorMinusX, adicione isso ao nosso número aleatório. Por exemplo, isso pode ser negativo e, em seguida, um valor de dois ou positivo, ou qualquer número entre esse intervalo. Duplicado. Faremos isso pelo MoVey. Também muda para ser um plus ou menos y e o valor de yaleatório. Este é um número positivo ou negativo aleatório em ambas as direções, mas vou adicionar mais um pequeno pedaço de aleatoriedade. Crie constante para armazenar isso no número aleatório chamado. Basta definir isso igual a simplesmente math.random. A razão pela qual fazemos isso é adicionar um pequeno valor aleatório a ambas as variáveis. Adicione isso ao nosso primeiro número e, em seguida, ao nosso segundo número, deve ser tudo o que precisamos agora. Atualize o navegador. Cada vez que começamos o jogo, devemos ver a bola viajando em uma direção ligeiramente diferente. Temos ele indo para a esquerda, temos isso indo para a direita, temos ele subindo, nós o temos indo para baixo. Você também pode ver que temos várias velocidades diferentes dependendo dos valores reais para essas duas variáveis. Isso não está tudo acabado para nossa aleatoriedade. Um pouco mais tarde , veremos como adicionar algum movimento aleatório à direção da bola quando ela saltar das paredes e também do remo também. Falando em remos, é isso que vamos cobrir no próximo vídeo, onde veremos como mover automaticamente o remo do computador. 15. Movimento de computador: No topo de nossos scripts, temos o player e também as posições do computador dentro dessas variáveis. Ambos os valores definem as posições de remo no início de nossos jogos, estejam no centro verticalmente. A posição do jogador que já cuidamos com os movimentos dentro da nossa função pressionada por tecla de alça. Agora também podemos adicionar algum movimento ao computador para tornar o jogo um pouco mais jogável. Vamos fazer isso em uma função de remo de computador de desenho, que é esta aqui. Tudo o que estamos fazendo atualmente é definir a tela.altura dividida por 2, lugares no centro. Obviamente, não queremos fazer isso como acima. Também queremos substituir isso por uma variável. Nós tiramos a altura da tela e substituímos isso pela posição do computador. Isso significa, assim como a posição do jogador acima, cada vez que essa variável é atualizada e, em seguida, chamamos o loop, a nova posição do remo do computador também será refletida. O estágio ext é atualizar isso. Mas como decidimos sobre como mover isso? Bem, poderíamos ser muito complexos e incluir coisas como alguma inteligência artificial, mas não queremos que este curso seja muito complexo. Em vez disso, vamos substituir isso por algum movimento simples rastreamento. Para isso na parte inferior logo acima do nosso loop, vou criar uma nova função que é chamada em cada intervalo. nome da função é mover computador. Isso também precisa ser chamado em cada intervalo, que possamos pegar o nome da nossa função e adicionar isso em nosso loop. O rastreamento mais básico pode ser feito algo assim. Podemos atualizar nossa variável de posição do computador para ser igual à localização da bola Y. Isso rastreará efetivamente a localização verticalmente da nossa bola, mova o remo do computador para rastrear isso, podemos ver isso? Se voltarmos ao nosso navegador, atualize e agora você pode ver o remo do computador se movendo para cima e para baixo, dependendo da localização da bola. Ótimo, tudo isso funciona bem, mas como você pode ver, isso cria um jogo que é impossível para o jogador ganhar. Mais uma vez, poderíamos ser tão complexos quanto quisermos com um movimento de computador. Mas, para simplificar, vou apenas adicionar uma declaração if-else. Esta declaração if-else atualizará gradualmente a posição do computador, dependendo se a bola estiver acima ou abaixo do remo. Podemos remover isso, adicionar uma instrução if. Onde verificamos se a posição do computador atualmente está abaixo da localização atual da bola Y. Lembre-se de que o eixo y começa em 0 na parte superior e desce em uma direção positiva. A bola está abaixo do remo. Podemos então atualizar a variável de posição do computador para avançar em direção à bola. Isso pode ser feito adicionando mais, mais, caso contrário, se for a direção oposta, queremos mover o remo do computador na direção inversa. Podemos fazer isso dentro daqui. Vamos tentar isso. Atualize e teste isso. a bola para trás. Você pode ver que o computador agora está se movendo. Agora é um jogo vencível. Você também pode se quiser acelerar ou diminuir a velocidade dos passos que o remo do computador leva para ir em direção à bola. Mas isso é completamente opcional, e isso também pode precisar ser ajustado também, dependendo da rapidez com que o loop está sendo executado. Ótimo. Este é um movimento de computador muito básico e, em seguida, melhorará ainda mais o jogo adicionando alguma aleatoriedade adicional ao movimento da bola. 16. Salões aleatórios: A bola atualmente saltando de todas as paredes e as pás é um pouco previsível. Atualmente, cada salto está a 90 graus, o que muitas vezes nos deixa com uma situação em que a bola às vezes pode girar em um quadrado, e ela salta das remos sem sequer precisar se mover eles. Para melhorar isso, adicionaremos alguma aleatoriedade ao nosso salto de remo para tornar nosso jogo um pouco melhor. Para isso, precisamos de uma função. Vamos criar uma função em qualquer lugar nosso código com o nome de gerar rejeição aleatória. Adicione alguma aleatoriedade. Não precisamos fazer nada muito louco ou complexo. Se subirmos pela primeira vez para a nossa função de colisão, as duas últimas instruções if verificam o contato do remo tanto para o jogador quanto para o remo do computador. Atualmente, quando há algum contato entre a bola e o remo, tudo o que estamos fazendo com essas duas linhas de código aqui é reverter a direção. Fazemos isso definindo uma direção positiva para um negativo e também o contrário também. Para adicionar um pouco de aleatoriedade, tudo o que precisamos fazer é adicionar um pequeno valor positivo ou negativo a qualquer uma dessas linhas, que podemos retornar de nossa nova função. Dentro dessa função, primeiro vamos gerar um número entre zero e um. Zero e uma nos dão duas opções, que podemos usar para decidir se vamos criar um número positivo ou negativo. Mais uma vez, usamos Math.Floor para arredondar nosso número para baixo. O número que você deseja arredondar para baixo será gerado com Math.Random para nos dar um número entre zero e um. Lembre-se de tudo Math.Random gera um número aleatório entre zero e um. Na verdade, não inclui um. Por exemplo, ele vai até 0,999. número de aleatoriedade para baixo sempre nos dará um valor de zero. Para obter um valor entre zero e um, podemos multiplicar isso por dois, instalar isso dentro de uma constante chamada número zero para um. Essas duas opções agora podem ser usadas para criar um símbolo positivo ou negativo, assim como olhamos anteriormente. Armazene isso dentro de uma constante, positiva ou negativa. Em seguida, pegaremos nossa variável de cima, que é zero ou uma. Digamos, se isso for igual a uma das opções que é zero, usando as instruções condicionais JavaScript, a primeira opção retornará um valor negativo. Se não for separado por dois pontos, retornará um símbolo positivo. Se isso retornar um zero, obteremos um símbolo negativo. Se ele retornar um, obteremos um símbolo positivo. Lembre-se, como estamos retornando uma string, também precisamos envolver os resultados dentro da função numérica. Certifique-se de que sempre recebemos de volta um número em vez de uma string. Retornamos o símbolo que é positivo ou negativo, e adicionamos isso igual a um valor pequeno. Novamente, usamos Math.random para nos dar um número entre zero e um e também para torná-lo um pouco mais de um valor menor, vamos dividir isso por dois. Se retornarmos esse valor de volta da nossa função, isso retornará um número que é um número positivo ou negativo entre o valor de zero e 0,5. Com isso sendo um valor tão pequeno que agora estamos retornando, como dizemos se isso está sendo adicionado ao nosso salto ou não? Bem, podemos primeiro ver isso com um registro de console. Se dermos uma olhada em nossa Função de Nuvem e em nossas duas últimas seções que analisamos antes, podemos adicionar isso ao contato do remo do jogador logo acima, onde fazemos a mudança de direção em um log de console com o valor de mu de x. Copie isso e faça exatamente o mesmo logo depois. Cada vez que a bola salta do remo dos jogadores, devemos ver dois logs de console com o valor de mu de x. Lembre-se de que não adicionamos valor aleatório diferente a nenhuma das nossas mudanças de direção ainda. Esses dois valores devem ser exatamente o mesmo ou o oposto em termos de positivo ou negativo. Vamos experimentar isso. Atualize e pule para o console. Comece nosso jogo, e agora faça algum contato entre a poça, e podemos ver que temos menos 2,49 e também o equivalente positivo também. Como esses números são exatamente os mesmos, isso prova que tudo o que estamos fazendo é reverter a direção em 90 graus. Mas se agora seguirmos em frente e adicionarmos nosso pequeno valor aleatório, veremos dois valores diferentes dentro do console. Agora, vamos adicionar nosso pequeno volume que é retornado de volta da nossa função chamada gerar limites aleatórios. Também o mesmo com o remo do computador também. Agora, se testarmos isso , veremos o pequeno valor sendo retornado e adicionado de nossa função, e isso deve ser valores ligeiramente diferentes para nos dar uma mudança de direção diferente com nossa bola. Atualizar. Agora, se fizermos alguns contatos, lá vamos nós. Ótimo. Agora, há muita coisa acontecendo aqui mas se dermos uma olhada neles em pares. Nos dois primeiros pares, há menos 3,55, que depois reverte para ser um valor positivo de 3,22. Com esses dois valores sendo ligeiramente diferentes, isso significa que nosso valor de rejeição agora entrou em vigor. Se olharmos para o segundo par, novamente, agora não estamos apenas mudando o valor de um positivo para um negativo, também mudaremos ligeiramente qualquer valor de limite também. Isso é verdade para todos os pares que se seguem também. Pequenas mudanças podem fazer uma grande diferença e tornar nosso jogo muito menos previsível. Também pare a bola girando em um quadrado na tela também. Em seguida, vamos dar uma olhada em como podemos restringir nosso remo para que ele não saia da tela. 17. Mantendo a pá na tela de pá: À medida que nos aproximamos do final do nosso jogo, um dos toques finais que você deseja adicionar é restringir as pás dos jogadores para que ele não saia da parte superior ou inferior da tela, quando pressionamos o teclas para cima e para baixo. Para isso, entraremos na função HandleKeyPressed para adicionar nosso código que é necessário para restringir isso. Esta função HandleKeyPressed é a área em nosso código que detecta se pressionamos a seta para cima ou a seta para baixo. A instrução switch é responsável por mover os jogadores remando em direção ascendente ou em direção descendente. Aqui dentro, começando com o estojo de seta para cima, vamos adicionar algum código para impedir as pétalas dos jogadores saiam do topo da tela. Para fazer isso, antes de movermos a posição do jogador por qualquer valor específico, adicionaremos uma declaração if para verificar isso. Se algo for verdade, queremos voltar para fora desta seção sem mover a posição do jogador. Há algo que queremos verificar é a posição do jogador. Lembre-se quando estamos falando sobre a variável de posição do jogador, esta é a linha central do remo. Para encontrar o topo do remo, precisamos deduzir metade da altura do remo e encontrar a parte inferior do remo para garantir que ele não saia da parte inferior da tela. Também precisamos adicionar metade da altura do remo também. Podemos usar isso dentro da nossa declaração if. Saindo da localização superior dentro da nossa declaração if. Primeiro de tudo, vamos pegar a posição atual do jogador. Assim como vimos nos slides, vamos deduzir a altura do remo dividida por 2. Isso nos dará o ponto superior do nosso remo. Precisamos verificar se isso é menor ou igual a 0, que é o topo da nossa tela. Se isso acontecer, retornaremos a isso sem mover a posição do jogador. Então, na seção de seta para baixo, faremos uma declaração semelhante if onde verificamos se a posição do jogador, desta vez vamos adicionar metade da altura do remo, já que estamos lidando com a parte inferior do remo. Aqui, estamos verificando se a parte inferior do pedal é igual ou maior que a parte inferior da tela, que podemos encontrar com tela.height. Maior ou igual, na tela.height, se isso for verdade, novamente voltará para fora disso sem mover a posição do jogador, para que não vá além da parte inferior da tela. Teste isso, pressione a barra de espaço e iremos direto para o topo. O remo de lugar não vai além do topo. Mova isso para baixo para baixo. Agora é restrito que os jogadores remam para ficar dentro da área da tela. 18. Considerações finais: [MÚSICA] Este é agora para o final do nosso jogo e parabéns por chegar a esta fase. Agora aprendemos alguns conceitos fundamentais e, mesmo que nosso jogo não seja perfeito, é jogável, aprendemos todos os conceitos que precisamos para iniciar o desenvolvimento de jogos em JavaScript. Espero que você tenha gostado. Espero que você tenha adquirido novas habilidades e ansioso para mergulhar na construção de mais jogos baseados em JavaScript. Obrigado por fazer esta aula, e eu vou te ver na próxima.