breakout

Criando o Breakout – Tutorial em JavaScript

O Breakout é um jogo clássico de arcade lançado pela Atari em 1976, criado por Nolan Bushnell e Steve Bristow, com a ajuda de Steve Jobs e Steve Wozniak na parte técnica. O objetivo do jogo é simples: usar uma barra horizontal (conhecida como raquete ou paddle) que se move pela parte inferior da tela para rebater uma bola, que vai quebrando blocos dispostos na parte superior. É um dos marcos da história dos games e, hoje, vamos recriá-lo com JavaScript!

Acesse o code.org, ao entrar na sua conta, selecione a opção criar novo projeto e escolha “game lab”.

labirinto

Passo 1: Configurando as Variáveis

O primeiro passo é configurar o jogo, criando a bola, o paddle, os blocos e as condições iniciais. Vamos definir a pontuação, as vidas do jogador e o estado do jogo.

				
					var ball;
var score = 0;
var lives = 3;
var gamestate = "serve";

ball = createSprite(200,200,10,10);
ball.setAnimation("golfball_1");
ball.scale = 0.05;

var paddle = createSprite(200, 350, 120, 10);
paddle.shapeColor = "blue";

createEdgeSprites();

var bricks = createGroup();

				
			

Dica Pro: Lembre-se de criar as animações para deixar seu jogo mais atrativo!

labirinto
breakout

Passo 2: Criando as Linhas de Blocos

Criamos 4 fileiras coloridas de blocos, cada uma com uma cor diferente para dar aquele visual clássico do Breakout!

				
					function createBrickRow(y, color) {
  for(c=0; c<6; c++) {
    var brick = createSprite(65+54*c, y, 50, 25);
    brick.shapeColor = color;
    bricks.add(brick);
  }
}

createBrickRow(65, "red");
createBrickRow(65+29, "orange");
createBrickRow(65+29+29, "green");
createBrickRow(65+29+29+29, "yellow");

				
			
breakout

Passo 3: Lançando a Bola

Agora, vamos desenhar os elementos na tela e gerenciar os estados do jogo: serve, onde o jogador prepara para lançar a bola, e end, para quando o jogo acaba.

				
					function mousePressed() {
  ball.velocityX = 10;
  ball.velocityY = 6;
  
  if(gamestate == "serve") {
    gamestate = "play";
    ball.velocityY = -7;
    ball.velocityX = -7;
  }
}

				
			

Passo 4: Desenhando o Jogo e Gerenciando Estados

Agora, vamos desenhar os elementos na tela e gerenciar os estados do jogo: serve, onde o jogador prepara para lançar a bola, e end, para quando o jogo acaba.

				
					function draw() {
  background("black");
  
  textSize(20);
  text("Pontuação: " + score, 40, 25);
  text("Vidas: " + lives, 40, 45);
  
  if(gamestate == "serve") {
    text("Clique para lançar a bola.", 120, 250);
    ball.velocityX = 0;
    ball.velocityY = 0;
    ball.x = 200;
    ball.y = 200;
  }
  else if(gamestate == "end") {
    text("Fim de Jogo", 150, 250);
    ball.remove;
  }
  else {
    gameplay();
  }
  
  drawSprites();
}

				
			

Passo 5: Colisões com os Blocos

O impacto da bola nos blocos é crucial para a mecânica do jogo. Vamos criar uma função que, ao detectar colisão, remove o bloco e aumenta a pontuação.

				
					function brickHit(ball, brick) {
  playSound("sound://category_hits/puzzle_game_button_04.mp3");
  brick.remove();
  score += 5;
}

				
			

Passo 6: Gerenciamento de Vidas

Se a bola cair no fundo da tela, o jogador perde uma vida. Essa parte do código é super importante para garantir a dificuldade do jogo.

				
					function lifeover() {
  lives -= 1;
  if(lives >= 1) {
    gamestate = "serve";
  } else {
    gamestate = "end";
  }
}

				
			

Passo 7: Jogabilidade - Controle do Paddle e Colisões

Finalmente, a função gameplay reúne toda a lógica de controle do paddle, colisões da bola com os limites da tela, e interações com os blocos e o paddle.

				
					function gameplay() {
  paddle.x = World.mouseX;
  
  if(paddle.x < 60) {
    paddle.x = 60;
  }
    
  if(paddle.x > 340) {
    paddle.x = 340;
  }
  
  ball.bounceOff(topEdge);
  ball.bounceOff(leftEdge);
  ball.bounceOff(rightEdge);
  ball.bounceOff(bricks, brickHit);
  
  if(ball.bounceOff(paddle)) {
    playSound("sound://category_tap/puzzle_game_organic_wood_block_tone_tap_1.mp3");
  }
  
  if(score == 36) {
    ball.velocityX = 0;
    ball.velocityY = 0;
    text("Muito bem!!", 150, 200);
  }

  if(ball.isTouching(bottomEdge)) {
    lifeover();
  }
}

				
			

RESULTADO

				
					var ball;
var score = 0;
var lives = 3;
var gamestate = "serve";
ball = createSprite(200,200,10,10);
ball.setAnimation("golfball_1");
ball.scale = 0.05;

var paddle = createSprite(200, 350, 120, 10);
paddle.shapeColor = "blue";

createEdgeSprites();

var bricks = createGroup();

function createBrickRow(y, color) {
  for(c=0; c<6; c++)
  {
    var brick = createSprite(65+54*c,y,50, 25);
    brick.shapeColor = color;
    bricks.add(brick);
  }
}

createBrickRow(65, "red");
createBrickRow(65+29, "orange");
createBrickRow(65+29+29, "green");
createBrickRow(65+29+29+29, "yellow");

function draw() {
  background("black");
  
  textSize(20);
  text("Pontuação: "+score,40,25);
  text("Vidas: "+lives, 40, 45);
  
  if(gamestate == "serve"){
    text("Clique para lançar a bola.", 120,250);
    ball.velocityX =0;
    ball.velocityY =0;
    ball.x = 200;
    ball.y = 200;
  }
  else if(gamestate =="end") {
    text("Fim de Jogo", 150, 250);
    ball.remove;
  }
  else {
    gameplay();
  }
  
  drawSprites();
}

function mousePressed()
{
  ball.velocityX = 10;
  ball.velocityY = 6;
  
  if(gamestate == "serve"){
    gamestate = "play";
    ball.velocityY = -7;
    ball.velocityX = -7;
  }
  
}

function brickHit(ball, brick) {
 playSound("sound://category_hits/puzzle_game_button_04.mp3");
 brick.remove();
 score = score+5;
  
}

function lifeover(){
  lives = lives - 1;
  if(lives>=1) {
    gamestate = "serve";
  }
  else {
    gamestate = "end";
  }
}

function gameplay(){
  paddle.x = World.mouseX;
  
  if(paddle.x < 60)
  {
    paddle.x = 60;
  }
    
  if(paddle.x > 340)
  {
    paddle.x = 340;
  }
  //rotation = rotation + 5;
  ball.bounceOff(topEdge);
  ball.bounceOff(leftEdge);
  ball.bounceOff(rightEdge);
  //ball.bounceOff(paddle);
  ball.bounceOff(bricks, brickHit);
  if(ball.bounceOff(paddle))
  {
    playSound("sound://category_tap/puzzle_game_organic_wood_block_tone_tap_1.mp3");
  }
  if(score==36)
  {
    //console.log("Won");
    ball.velocityX = 0;
    ball.velocityY = 0;
    text("Muio bem!!",150,200);
  }
  if(ball.isTouching(bottomEdge)) {
    lifeover();
  }
}

				
			

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *