Nesta tarefa, devemos explicar e exemplificar a diferença entre o uso da variável de sistema keyPressed e a função keyPressed() com base no desenvolvimento de uma versão simplificada do jogo Breakout, que considere a colisão do centro da bola com o bastão e com dois ou mais obstáculos.
Para isso, desenvolvi uma versão do jogo
Breakout, que inicia com uma tela que solicita ao usuário para apertar um botão para começar o jogo:
|
Tela inicial. |
Criei uma variável booleana chamada
tela, que quando verdadeira cria esta página. Quando o 'espaço' é pressionado, o booleano
tela fica falso, iniciando o jogo:
void keyPressed() {
if(keyCode == 32) {
tela = false;
}
if(tela == false && keyCode == 82) {
tela = true;
// reset
barraX = (width/2)-(larguraB/2);
bolaX = 15;
bolaY = 100;
}
}
Foi usada a função keyPressed() para verificar se o botão correto foi pressionado e realizar a ação;
A diferença entre a função keyPressed() e a variável keyPressed, é que nesta última ela pode ser usada em um if para verificar se um botão foi pressionado, baseado em um keyCode.
Já na função é possível fazer isto de maneira automática, sem a necessidade de um if, pois ao criar a função já está se assumindo que um botão foi pressionado.
O usuário pode vencer ou perder. Na tela principal existem duas caixas em que a bola deve colidir. Caso a bola ultrapasse o "chão" é apresentada uma tela que informa que o usuário perdeu a partida, mas que pode reiniciá-la ao apertar o botão 'R'.
|
O usuário pode perder a partida caso a bola ultrapasse o limite inferior da tela. |
Para calcular a
distância entre a bola e as caixas foi usada esta função:
float distancia(float x1, float y1, float x2, float y2) {
float b, c;
b = abs(x1 - x2) * abs(x1 - x2);
c = abs(y1 - y2) * abs(y1 - y2);
float a = sqrt(b + c);
return a;
}
|
Caso o usuário deixe a bola cair e perca a partida, esta tela é apresentada, solicitando que ele reinicie a partida. |
Para organizar melhor o código, decidi implementar cada funcionalidade separadamente. No
draw() elas são chamadas após o usuário iniciar o jogo:
if(tela) {
background(29, 212, 216);
fill(255);
textSize(15);
text("APERTE 'ESPAÇO' PARA COMEÇAR", 25, height/2);
stroke(255);
line(20, (height/2)+20, width-30, (height/2)+20);
line(50, (height/2)+35, width-65, (height/2)+35);
}
else {
background(255, 193, 7);
colisaoBola();
ellipse(bolaX, bolaY, raio, raio);
colisaoBarra();
rect(barraX, height-alturaB, larguraB, alturaB);
colisaoSprites();
}
Caso as duas caixas sejam eliminadas e a bola não caia no chão, o usuário vence a partida.
|
Colisão com a barra e as paredes implementadas. |
A colisão da bola foi implementada nesta função:
void colisaoBola() {
bolaX += velX;
bolaY += velY;
// paredes
if((bolaX > width-(raio/2)) || (bolaX < 0+(raio/2))) {
velX = -velX;
}
if(bolaY < 0+(raio/2)) {
velY = -velY;
}
// barra
if((bolaX + raio/2 >= barraX) && (bolaX - raio/2 <= barraX + larguraB) &&
(bolaY + raio/2 >= height - alturaB) && (bolaY + raio/2 <= height)) {
velY = -velY;
}
// caso caia no chão
if(bolaY > height) {
background(255, 87, 34);
textSize(19);
fill(255);
stroke(255);
text("VOCÊ PERDEU!", width/2 - 70, height/2-25);
line(25, height/2-7, width-28, height/2-7);
text ("APERTE 'R' PARA REINICIAR", 25, height/2+25);
}
}
Ao apertar o botão 'R' todos os valores iniciais são "resetados", ou seja, seus valores atuais são atualizados como iniciais. Assim, foi possível reiniciar o game.
|
Tela apresentada no fim da partida, caso o usuário vença. |
Esta é uma versão resumida do jogo Breakout com o uso da função
keyPressed().
Baixe o arquivo completo neste link:
Game.
Comentários
Postar um comentário