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

Pong em um arquivo HTML

Gostaria de compartilhar com vocês o codigo que fiz, como um desafio me propus a refazer o jogo pong não no p5.js, mas em um arquivo HTML.

As mecanicas de colisão com as bordas e com a minha raquete ja estão funcionando e o movimento da raquete tambem, agora só falta fazer a colisão da raquete do oponente e fazer ela se mover, e claro um placar.

já estou no meio desse pequeno projeto, mas tenho que adimitir que deu mais trabalho do que eu esperava.

<canvas width="600" height="400"> </canvas>

<script type="text/javascript">
//Variaveis do Canvas
    var tela = document.querySelector("canvas");
    var pincel = tela.getContext("2d");
    var width = tela.width
    var height = tela.height

//Teclas
    var cima = 38
    var baixo = 40
//Variaveis da Bolinha
    var xBolinha = 300
    var yBolinha = 200
    var velocidadeX = 2
    var velocidadeY = 2
    var diametro = 15
    var raio = diametro/2
//Variaveis da Minha Raquete
    var xRaquete1Tamanho = 8
    var yRaquete1Tamanho = 100
    var movimentoRaquete1 = 0
    var xRaquete1 = 5
    var velocidadeRaquete1 = 12
    function yRaquete1(){
        return (200 - (yRaquete1Tamanho/2) + movimentoRaquete1)
    }
//variaveis da Raquete do Oponente
    var xRaquete2Tamanho = 8
    var yRaquete2Tamanho = 100
    var movimentoRaquete2 = 0
    var xRaquete2= (600 - 5 - xRaquete2Tamanho)
    var velocidadeRaquete2 = 12
    function yRaquete2(){
        return (200 - (yRaquete2Tamanho/2) + movimentoRaquete2)
    }

//Desenha um circulo
    function circle(x_inicial, y_inicial, diametro){

        pincel.fillStyle = "white";
        pincel.beginPath();
        pincel.arc(x_inicial, y_inicial, (diametro/2), 0, 2*3.14);
        pincel.fill()
    }
//Desenha um retangulo
    function retangulo (x_inicial, y_inicial, x_final, y_final, cor){

        pincel.fillStyle = cor; 
        pincel.fillRect(x_inicial, y_inicial, x_final , y_final);

    } 
//Preenche o fundo
    function fundo() {
          retangulo(0, 0, 600, 400, "black");
    }
//funcionamento da bolinha
    function bolinha() {
        circle(xBolinha, yBolinha, diametro)
        movimentoBolinha()
          colisaoBordas()
          colisaoRaquete1()
    }

    function movimentoBolinha(){
        xBolinha += velocidadeX;
        yBolinha += velocidadeY;
    }
//colisão com as bordas
    function colisaoBordas(){
        if(xBolinha > (width-diametro/2)||xBolinha<(0+diametro/2)){
            velocidadeX *= -1;
        }
        if(yBolinha > (height-diametro/2)||yBolinha<(0+diametro/2)){
            velocidadeY *= -1;
          }
    }
//colisão com minha raquete
    function colisaoRaquete1(){
        if((xBolinha - raio < xRaquete1 + xRaquete1Tamanho) && (yBolinha - raio > yRaquete1()) && (yBolinha - raio < yRaquete1() + yRaquete1Tamanho)){
            velocidadeX *= -1;
        }
    }
//Renderizar a tela
    function renderizar(){
        fundo()
        bolinha()
        raquete1()
        raquete2()
    }
    setInterval(renderizar, 10)
//Minha raquete
    function raquete1(){
        retangulo(xRaquete1, yRaquete1(), xRaquete1Tamanho, yRaquete1Tamanho, "white")
    }

    function moveRaquete1(evento){
        if(yRaquete1()>=(0)){
            if(evento.keyCode == cima) {
                movimentoRaquete1-=velocidadeRaquete1;
            }
        }
        if(yRaquete1()<(400-(yRaquete1Tamanho))){
            if(evento.keyCode == baixo) {
                movimentoRaquete1+=velocidadeRaquete1;
            }
        }            
    }
    document.onkeydown = moveRaquete1;

//Raquete do Oponente    
    function raquete2(){
        retangulo(xRaquete2, yRaquete2(), xRaquete2Tamanho, yRaquete2Tamanho, "white")
    }



</script>

Espero que gostem do codigo, e sim ele está bagunçado mas quando terminar enviarei uma versão mais "polida" dele.

Até uma proxima. :)

4 respostas
solução!

Olá, Silviomar! Tudo bem com você?

Seu código está incrível! Muito bom o trabalho, parabéns pelo esforço!

De fato trabalhar esse código em html e JavaScript é muito mais trabalhoso e por isso o instrutor escolheu o p5.js, pois essa biblioteca já vem com muitas funções e métodos pré-prontos e assim podemos focar mais na parte da lógica do que com a sintaxe. No entanto trabalhar de forma mais "pura" é um excelente exercício e vai te ajudar bastante a desenvolver suas habilidades!

Parabéns novamente e conte conosco em caso de dúvidas ou para compartilhar seu progresso!

Um abraço e bons estudos!

Olá! Me propus o msm desafio, e 4 dias depois, esse é o resultado, segue em partes:

//create screen var screen = document.querySelector('canvas'); var brush = screen.getContext('2d');

//Dimension variables var racketWidth = 20; var racketHeight = 75; var ballRay = 15;

//Limits var playerX = 50; var cpuX = 600 - 50 - racketWidth; var racketYmin = 0; var racketYmax = 400 - racketHeight; var ballXmin = ballRay; var ballXmax = 600 - ballRay; var ballYmin = ballRay; var ballYmax = 400 - ballRay;

//steps var playerStepY = 10; var stepX = 5; var stepY = 2; var up = 38; var down = 40;

//Current positions var playerCurrentY = (400/2) - (racketHeight/2); var CPUCurrentY = (400/2) - (150/2); var ballCurrentX = (600/2); var ballCurrentY = (400/2);

//scores var playerScore = 0; var cpuScore = 0;

//draw racket function drawRacket (x,y){ brush.fillStyle = "white"; brush.fillRect(x, y, racketWidth, racketHeight); brush.fill(); }

//draw ball function drawBall(x,y) { brush.fillStyle = "white"; brush.beginPath(); brush.arc(x,y,ballRay,0,2*Math.PI); brush.fill(); }

//displays title function writeText(text,x,y,color){ brush.font = "30px Comic Sans MS"; brush.strokeStyle = color; brush.fillText(text,x,y); brush.font = "30px Comic Sans MS"; brush.strokeStyle = "black"; brush.strokeText(text,x,y); }

function drawTarget(x,y) { brush.fillStyle = "red"; brush.beginPath(); brush.arc(x,y,20,0,2*Math.PI); brush.fill(); }

//Make screen black function clearScreen(){ brush.fillStyle = "black"; brush.fillRect(0, 0, 600, 400); brush.fill(); }

function positionToStart (){ clearScreen(); //draw player drawRacket(playerX, playerCurrentY); //draw CPU drawRacket(cpuX, CPUCurrentY); //draw ball drawBall(ballCurrentX, ballCurrentY); }

function updateScreen(){ var cpuCurrentY = ballCurrentY - ballRay + 30;

clearScreen();

//starts ball movement drawBall (ballCurrentX, ballCurrentY); ballCurrentX = ballCurrentX + stepX; ballCurrentY = ballCurrentY + stepY;

//displays title

writeText("PONG",((ballXmax/2)-60),50,"white"); writeText(playerScore,(ballXmin + 100), 50,"white"); writeText(cpuScore,(ballXmax - 100), 50,"white");

//defines player motion drawRacket(playerX, playerCurrentY);

//player corners var playerUpperLeftCorner = [(playerX - ballRay/2), (playerCurrentY - ballRay/2)]; var playerUpperRightCorner = [(playerX + racketWidth + ballRay/2), (playerCurrentY - ballRay/2)]; var playerLowerLeftCorner = [(playerX - ballRay/2), (playerCurrentY + racketHeight + ballRay/2)]; var playerLowerRightCorner = [(playerX + racketWidth + ballRay/2), (playerCurrentY + racketHeight + ballRay/2)];

//cpu corners var cpuUpperLeftCorner = [(cpuX - ballRay),(cpuCurrentY - ballRay)]; var cpuUpperRightCorner = [(cpuX + racketWidth + ballRay), (cpuCurrentY - ballRay)]; var cpuLowerLeftCorner = [(cpuX - ballRay), (cpuCurrentY + racketHeight + ballRay)]; var cpuLowerRightCorner = [(cpuX + racketWidth + ballRay), (cpuCurrentY + racketHeight + ballRay)];

//defines CPU motion if((cpuCurrentY >= racketYmin) && (cpuCurrentY<= racketYmax)) { drawRacket(cpuX, cpuCurrentY); } else{ drawRacket(cpuX, racketYmax); }

//defines collision with borders

if (ballCurrentX >= ballXmax){ stepX = stepX * (-1); playerScore++;

} else if (ballCurrentX <= ballXmin){ stepX = stepX * (-1); cpuScore++;

} if (ballCurrentY >= ballYmax){ stepY = stepY * (-1);

} else if(ballCurrentY <= ballYmin){ stepY=stepY * (-1); } //***HITBOX**** //draw players hitbox //brush.strokeStyle="red"; //brush.lineWidth = 2; //brush.beginPath(); //brush.moveTo (playerUpperLeftCorner[0], playerUpperLeftCorner[1]); //brush.lineTo (playerUpperRightCorner[0], playerUpperRightCorner[1]); //brush.lineTo (playerLowerRightCorner[0], playerLowerRightCorner[1]); //brush.lineTo (playerLowerLeftCorner[0], playerLowerLeftCorner[1]); //brush.lineTo (playerUpperLeftCorner[0], playerUpperLeftCorner[1]); //brush.stroke();

//draw cpu hitbox //brush.strokeStyle="red"; //brush.lineWidth = 2; //brush.beginPath(); //brush.moveTo (cpuUpperLeftCorner[0], cpuUpperLeftCorner[1]); //brush.lineTo (cpuUpperRightCorner[0], cpuUpperRightCorner[1]); //brush.lineTo (cpuLowerRightCorner[0], cpuLowerRightCorner[1]); //brush.lineTo (cpuLowerLeftCorner[0], cpuLowerLeftCorner[1]); //brush.lineTo (cpuUpperLeftCorner[0], cpuUpperLeftCorner[1]); //brush.stroke(); //* //defines collision with player racket //X axis collision if ( //left side (ballCurrentY >= playerUpperLeftCorner[1]) && (ballCurrentY <= playerLowerLeftCorner[1]) && (ballCurrentX >= playerUpperLeftCorner[0]) && //right side (ballCurrentY >= playerUpperLeftCorner[1]) && (ballCurrentY <= playerLowerLeftCorner[1]) && (ballCurrentX <= playerLowerRightCorner[0]) ){ stepX = stepX*(-1); drawTarget(ballCurrentX,ballCurrentY); } else if( //Y axis collision //upper side (ballCurrentX >= playerUpperLeftCorner[0]) && (ballCurrentX <= playerUpperRightCorner[0]) && (ballCurrentY >= playerUpperLeftCorner[1]) &&

    //lower side
        (ballCurrentX >= playerUpperLeftCorner[0]) &&
        (ballCurrentX <= playerUpperRightCorner[0]) &&
        (ballCurrentY <= playerLowerLeftCorner[1])

){ stepY = stepY*(-1); drawTarget(ballCurrentX,ballCurrentY); } //defines collision with CPU //X axis collision if( //left side (ballCurrentY >= cpuUpperLeftCorner[1]) && (ballCurrentY <= cpuLowerLeftCorner[1]) && (ballCurrentX >= cpuUpperLeftCorner[0]) && //right side (ballCurrentY >= cpuUpperLeftCorner[1]) && (ballCurrentY <= cpuLowerLeftCorner[1]) && (ballCurrentX <= cpuLowerRightCorner[0])

){ stepX = stepX*(-1);
   drawTarget(ballCurrentX,ballCurrentY); 

){ stepX = stepX(-1); drawTarget(ballCurrentX,ballCurrentY); //Y axis collision } else if ( //upper side (ballCurrentX >= cpuUpperLeftCorner[0]) && (ballCurrentX <= cpuUpperRightCorner[0]) && (ballCurrentY >= cpuUpperLeftCorner[1]) && //lower side (ballCurrentX >= cpuUpperLeftCorner[0]) && (ballCurrentX <= cpuUpperRightCorner[0]) && (ballCurrentY <= cpuLowerLeftCorner[1]) ){ stepY = stepY(-1); drawTarget(ballCurrentX,ballCurrentY); } } positionToStart(); setInterval(updateScreen, 1);

//defines player motion function playerMovementY(event){ //player moves down if ((event.keyCode == down) && (playerCurrentY <= (400 - racketHeight))){ playerCurrentY=playerCurrentY+playerStepY; } //player moves up else if ((event.keyCode == up) && (playerCurrentY >= 0)){ playerCurrentY=playerCurrentY-playerStepY; } }

document.onkeydown = playerMovementY;