Qual a diferença entre a função e a variável de sistema, de mesmo nome?
keyPressed
A variável do sistema booleano keyPressed é verdadeira se qualquer tecla for pressionada e falsa se nenhuma tecla for pressionada.
keyPressed()
A função keyPressed () é chamada uma vez a cada tecla que é pressionada. A tecla que foi pressionada é armazenada na variável de chave.
A diferença mais aparente é no desempenho das duas, a variável se mostrou bem mais interessante de usar, com a função o movimento se torna menos suave e algumas vezes parece travar. De acordo com a documentação o desempenho é diferente dependendo do computador utilizado já que a função é invocada sempre que a tecla e pressionada repetidas vezes(segurada).
“Breakout”
Código Interativo
*Clique na janela do jogo e use SPACE para iniciar e RIGHT e LEFT para se mover*
Na aula, desenvolvemos toda a mecânica do PONG. Com isso já tinhamos a movimentação da bola e do retângulo.
Precisamos agora do cenário!
Minha ideia inicial era criar um array, mas observando melhor logo vi que um array de array's que era a solução desse problema. Um Array Multidimensional ou Matriz.
No array interno coloquei os valores X, Y e um "boolean"(0 ou 1), para criar os elementos do mapa, com um controlador de existente ou destruído.
O array superior é a quantidade de quadrados que existirá na tela (linha X colunas).
int [][] map = new int [(linhasBlock * colunasBlock)][3];
Precisamos agora preencher a matriz, desenhar esses retângulos e depois implementar suas colisões com a bola.
Para preencher a variável map, usei um FOR para as colunas dentro de um FOR para as linhas, com uma matemática simples para calcular o X e o Y de cada retângulo.
void criarMapa(){
// x, y, bollean(0,1)
___ int xBlock;
___ int yBlock = 50;
___ int countBlock = 0;
___ for(int i = 0; i < linhasBlock; i++){
___ ___ xBlock = 0;
___ ___ for(int j = 0; j < colunasBlock; j++){
___ ___ ___ int [] arr = {xBlock, yBlock, 1};
___ ___ ___ map[countBlock] = arr;
___ ___ ___ xBlock += 100;
___ ___ ___ countBlock ++;
___ ___ }
___ ___ yBlock += 20;
___ }
}
// x, y, bollean(0,1)
___ int xBlock;
___ int yBlock = 50;
___ int countBlock = 0;
___ for(int i = 0; i < linhasBlock; i++){
___ ___ xBlock = 0;
___ ___ for(int j = 0; j < colunasBlock; j++){
___ ___ ___ int [] arr = {xBlock, yBlock, 1};
___ ___ ___ map[countBlock] = arr;
___ ___ ___ xBlock += 100;
___ ___ ___ countBlock ++;
___ ___ }
___ ___ yBlock += 20;
___ }
}
Para desenhar o mapa um loop com FOR simples, verificando se ele existe ou se já foi destruído.
for(int i = 0; i < map.length; i++){
___ if(map[i][2] == 1){
___ ___ rect(map[i][0] , map[i][1], 100, 20);
___}
}
___ if(map[i][2] == 1){
___ ___ rect(map[i][0] , map[i][1], 100, 20);
___}
}
Para implementar as colisões, temos o mesmo loop e verificação se existe, como o usado para desenhar o mapa. Acrescentando apenas outro IF contento a função colision(X, Y). Se houver colisão o jogador ganhará um ponto e o objeto atingido desapareserá.
A função de colisão é a mesma usada na aula de PONG.
boolean colision(int x, int y){
___ if (bolaX <= x + 100 && bolaX >= x && bolaY <= y + 20 && bolaY >= y){
___ ___ dY = -dY;
___ ___ return true;
___ }
___ return false;
}
___ if (bolaX <= x + 100 && bolaX >= x && bolaY <= y + 20 && bolaY >= y){
___ ___ dY = -dY;
___ ___ return true;
___ }
___ return false;
}