Desenhar os blocos
- Igual que a gente tem uma função,
palgame.draw_circle
para desenhar uma círculo, a gentepalgame.draw_rect
para desenhar uma retângulo. - A gente sabe que precisa desenhar varias blocos – ou seja, a gente quer repetir os mesmo comando (draw_rect) varias vezes. Temos duas opções para repetir um comando: o for loop, e o while loop. Nesse caso qual deles é melhor?
- Lembra que caso a gente saiba quantas vezes a gente quer repetir uma coisa, melhor usar o for loop. Aqui, sim a gente sabe quantas vezes a gente quer repetir, porque sabemos quantos blocos precisamos.
- Vamos tentar desenhar varios blocos com o for loop então:
bloco_x = 5 bloco_y = 8 for i in range(10): palgame.draw_rect(bloco_x, bloco_y, 20, 10)
- se a gente executar esses codigos, vai aparecer um bloco só. Por que? Por que mesmo que a gente desenhe 10 blocos, a gente nunca atualiza a posição ‘x’ e ‘y’ do bloco, então todos os blocos são desenhados no mesmo lugar!
- Ai, vamos atualizar a posição ‘x’ do bloco, para ter uma linha dos 10 blocos
bloco_x = 5 bloco_y = 8 LARGURA_DO_BLOCO = 20 ALTURA_DO_BLOCO = 10 for i in range(10): palgame.draw_rect(bloco_x, bloco_y, LARGURA_DO_BLOCO, ALTURA_DO_BLOCO) bloco_x = bloco_x + LARGURA_DO_BLOCO + 5
- Porem, a gente não quer uma linha só. Então a gente vai colocar esse for loop num outro for loop para ter um dobro for loop:
for i in range(LINHAS): posicao_x = 5 for j in range(COLUNAS): palgame.draw_rect(posicao_x, posicao_y, LARGURA_DO_BLOCO, ALTURA_DO_BLOCO) posicao_x = posicao_x + LARGURA_DO_BLOCO + DISTANCA posicao_y = posicao_y + ALTURA_DO_BLOCO + 5
Assim, o programa vai desenhar varias linhas, e para cada linha, vai criar varios blocos. O resultado é um grade de blocos.
Remover blocos
- Quando a bola bate o bloco, a gente quer que o bloco suma.
- Para realizar isso, a gente tem que apresentar o ideia de ‘state’. O ‘state’ é o estado atual do programa. Se vc guarda o ‘state’ de um aplicativo, vc pode parar o programa em qualquer momento, e reiniciar num outro momento.
- Então, nosso caso, a gente não quer simplesmente desenhar os blocos, a gente quer guardar a posição de cada bloco num lista, para lembrar quais blocos ainda existem e quais são destruidos.
Listas
- No Python, no mesmo jeito que a gente tem variaveis que são Numeros, Strings (palavras), e Booleans, a gente pode ter variaveis que são listas. Uma lista pode possuir varias outros tipos de variaveis. Por exemplo:
lista = [3, 1, 9, 2] print(lista) # vai imprimir 3, 1, 9, 2
- Para anexar uma coisa no final de uma lista, a gente usa o
append().
x = [3, 6, 1] x.append(2) print(x) # vai imprimir 3, 6, 1, 2
- Para remover uma coisa da lista, a gente usa o
remove()
x = [3, 9, 1, 4] x.remove(3) print(x) # vai imprimir 9, 1, 4
- Os elementos na lista não precisam ser numeros
x = ["hello", 9, 3, True] print(x) # vai imprimir "hello", 9, 3, True
- Agora, a gente vai guardar a posição x e a posição y para cada bloco num lista. Além disso, a gente vai guardar cada ‘bloco’ – ou seja, cada ‘x’ e ‘y’ – num outro, grande lista. Assim, a gente vai ter uma lista de listas que parece assim:
blocos = [ [0, 8], [5, 8], [10, 8], [15, 8] ]
- Nota aqui que cada elemento na lista é tambem uma lista pequena! Cada lista pequena, por exemplo [5, 8] representa um bloco.
- Então para criar tudos os blocos, a gente usa a mesmo dobra for loop, só que agora para cada bloco a gente cria uma lista de dois elementos (posição x e posição y) e adiciona esse elemento ao lista grande de blocos.
COLUNAS = 8 LINHAS = 5 DISTANCA = 10 LARGURA_DO_BLOCO = (LARGURA_DA_TELA / COLUNAS) - DISTANCA ALTURA = 16 posicao_y = 0 blocos = [] for i in range(LINHAS): posicao_x = 5 for j in range(COLUNAS): b = [posicao_x, posicao_y] blocos.append(b) posicao_x = posicao_x + LARGURA_DO_BLOCO + DISTANCA posicao_y = posicao_y + ALTURA + 5
- Agora para desenhar os blocos, é só pega cada bloco na lista, extrair o ‘x’ e ‘y’, e desenha:
for b in blocos: palgame.draw_rect(b[0], b[1], LARGURA_DO_BLOCO, ALTURA)
Collisões
- Agora para checar se a bola bateu um bloco, a gente tem que checar, para cada bloco, se a posição da bola fica dentro do espaço do bloco. Caso essa seja verdade, a gente vai remover esse bloco da lista:
for a in blocos: if (bola_x + raio) >= a[0] and (bola_x - raio) <= (a[0] + LARGURA_DO_BLOCO) and (bola_y + raio) >= a[1] and (bola_y - raio) <= (a[1] + ALTURA): blocos.remove(a)
- Também nesse caso a gente quer que a bola volte, então a gente vai invertir a velocidade da bola:
for a in blocos: if (bola_x + raio) >= a[0] and (bola_x - raio) <= (a[0] + LARGURA_DO_BLOCO) and (bola_y + raio) >= a[1] and (bola_y - raio) <= (a[1] + ALTURA): blocos.remove(a) velocidade_y = velocidade_y * -1