Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Problema de crash

Pessoal logo após terminar de escrever os códigos do jogo tive 2 problemas; 1- depois que adicionei os sons o jogo ficou cada vez mais lento e travando depois de 3 raquetadas, mas o erro não é acusado, sendo somento descrito como "undefined" 2 - quando adicionei a parte de "chanceDeErrar" a raquete do oponente simplesmente desapareceu.

segue o código completo:

function setup() { createCanvas(800, 600); trilha.loop() }

function draw() { background(0); dimensoesBolinha(); movimentoBolinha(); colisaoBordas(); dimensoesRaquete(xRaquete, yRaquete); dimensoesRaquete(xOponente, yOponente); colisaoRaquetesBiblioteca(xRaquete, yRaquete) colisaoRaquetesBiblioteca(xOponente, yOponente) movimentoRaquete(); movimentoOponente(); placar(); marcarPontos(); preload(); calculaChanceDeErrar();

}

function calculaChanceDeErrar(){ if (pontos2 >= pontos1) { chanceDeErrar += 1 if (chanceDeErrar >= 39){ chanceDeErrar = 40 } } else { chanceDeErrar -= 1 if (chanceDeErrar <= 35){ chanceDeErrar = 35 } } }

function preload (){ ponto = loadSound ("ponto.mp3"); trilha = loadSound ("trilha.mp3"); raquetada = loadSound ("raquetada.mp3"); }

function movimentoRaquete(x, y){ if (keyIsDown (DOWN_ARROW)) {yRaquete += 10} if (keyIsDown (UP_ARROW)) {yRaquete -= 10}

}

function colisaoRaquetesBiblioteca(x, y){ colidiu = collideRectCircle(x, y, espessuraRaquete, comprimentoRaquete, xBolinha, yBolinha, raio); if (colidiu){velocidadeX *= -1 raquetada.play() }

}

function dimensoesRaquete(x, y){ rect (x,y,espessuraRaquete, comprimentoRaquete); }

function dimensoesOponente(){ rect (xOponente,yOponente,espessuraRaquete, cumprimentoRaquete); }

function dimensoesBolinha (){

circle (xBolinha, yBolinha, diametroBolinha); }

function movimentoBolinha(){ yBolinha += velocidadeY; xBolinha += velocidadeX; }

function colisaoBordas(){ if (xBolinha + raio > width ||xBolinha - raio < 0 ) {velocidadeX *= -1}

if (yBolinha + raio > height|| yBolinha < 0){velocidadeY *=-1}

}

function movimentoOponente(){ velocidadeYOponente = yBolinha - yOponente - comprimentoRaquete / 2 -30 yOponente += velocidadeYOponente + chanceDeErrar calculaChanceDeErrar(); }

function placar (){

fill (255,165,0); stroke (255); rect (580, 3, 40, 20); rect (180, 3, 40, 20);fill (255); textSize (20); textAlign (CENTER);text (pontos1, 200, 20); text (pontos2, 600, 20);

}

function marcarPontos(){ if (xBolinha > 785){ pontos1 += 1 ponto.play()} if (xBolinha < 15){ pontos2 += 1 ponto.play()}

}

//variaveisBolinha xBolinha = 400; yBolinha = 300; diametroBolinha = 25; raio = diametroBolinha/2; velocidadeX = 6; velocidadeY = 6;

//variaveisRaquete xRaquete = 5; yRaquete = 300; espessuraRaquete = 10; comprimentoRaquete = 120;

//variaveisOponente let xOponente = 785; let yOponente = 250; let velocidadeOponente; let chanceDeErrar;

//outras variaveis let colidiu = false; let pontos1 = 0; let pontos2 = 0;

//sons let ponto; let trilha; let raquetada;

2 respostas
solução!

Olá, José! Espero que esteja tudo bem com você!

Testei seu código no meu p5.js e pude notar que você equeceu de informar que o valor inicial de let chanceDeErrar = 0 e foi isso que quebrou a raquete do oponente, pois não havia valor para ser incrementado.

let chanceDeErrar = 0;

Provavelmente o problema no som foi causado porque você chamou a preload() na draw(). A preload() é uma função apenas para pré-carregamento de arquivos e se você inseri-la na draw(), ela irá pré-carregar novamente os arquivos. Então não precisa chamá-la na draw().

Sua function draw() ficará assim:

function draw() {
  background(0);
  dimensoesBolinha();
  movimentoBolinha();
  colisaoBordas();
  dimensoesRaquete(xRaquete, yRaquete);
  dimensoesRaquete(xOponente, yOponente);
  colisaoRaquetesBiblioteca(xRaquete, yRaquete)
  colisaoRaquetesBiblioteca(xOponente, yOponente)
  movimentoRaquete();
  movimentoOponente();
  placar();
  marcarPontos();
  calculaChanceDeErrar();

}

Também organizei a function movimentoOponente() para ficar mais legível:

function movimentoOponente(){
  velocidadeYOponente = yBolinha - yOponente - comprimentoRaquete / 2 -30;
  yOponente += velocidadeYOponente + chanceDeErrar;
  calculaChanceDeErrar();
}

E atualizei os valores de sensibilidade de erro na function calculaChanceDeErrar()

function calculaChanceDeErrar(){
  if (pontos2 >= pontos1) {
    chanceDeErrar += 1
    if (chanceDeErrar >= 39){
    chanceDeErrar = 100
    }
  } else {
    chanceDeErrar -= 1
    if (chanceDeErrar <= 35){
    chanceDeErrar = 35
    }
  }
}

Assim a raquete do oponente ficará visível e o erro do oponente mais aparente também.

Parabéns pelo esforço e dedicação, apenas gostaria de deixar como sugestão que você siga o passo a passo do instrutor em relação a organização e boas práticas de seu código, pois esse é um exercício que você irá levar em toda sua vida como desenvolvedor e certamente irá lhe poupar tempo durante a escrita ou observação de um erro.

Exemplo: neste projeto é importante que algumas variáveis sejam declaradas antes da escrita da função :)

Uma última dica é que você pode utilizar o recurso "inserir bloco de código" aqui na barra de ferramentas do editor do fórum, pois seu código ficará com uma formatação igual ao meu e isso ajuda muito na hora de procurar um erro.

Espero que tenha ajudado, fico à disposição!

Um grande abraço!!

Avante nos estudos!

muito obrigado solucionou completamente meu problema :).