Lição 5: Movimento da bola

while loop infinito

  • Lembra na ultima aula a gente conheceu o while loop, um jeito para repetir uma coisa varias vezes até uma condição seja falso.
  • No caso de um jogo, a gente quer que a programa repita para sempre (na verdade, até o usario perca ou ganhe, mas para agora a gente pode pensar que é para sempre).
  • Para efetuar esse “while loop infinito”, a gente precisa uma condição que nunca vai virar falso. Uns exemplos:
    • while 3 > 2:
    • while "thiago" == "thiago"
  • Esses condições sempre são verdade, então o while loop vai continuar para sempre. Mas para ter um programa mais legivel, o Python tem um tipo de variavel, se chama “boolean” para significar “Verdade” (True) ou “Falso” (False). Então eu posso escrever:
    • while True:
    • Qualquer coisa abaxio desta linha vai ser repetido para sempre por que True sempre é ‘verdade’

Aqui tem o link para o modelo do programa que a gente vai usar para criar esse jogo

Movimento da bola

x = 20
y = 30
raio = 5
cor = (255, 0, 0)
while True:
    palgame.get_event()
    palgame.clear_screen()


    palgame.draw_circle(x, y, raio, cor)

    palgame.draw_everything()
  • Nota que dentro do while loop infinito, a gente está desenhando um círculo na posição (x, y) – nesse caso (20, 30) – e com um raio de 5 e cor vermelho.
  • Lembra que os codigos que ficam dentro do while loop estão sendo repetidos – cada millissegundo.

Agora quero que a bola se mova. Como a gente pode fazer isso? Movimento é simplesmente uma mudança na posição de um objeto em relação do tempo. Então a gente vai atualizar a posição da bola dentro do while loop. Assim, a posição da bola vai mudar cada millisegundo – como esse acontece tão rapido, vai criar a sensação do movimento.

x = 20
y = 30
raio = 5
cor = (255, 0, 0)
while True:
    palgame.get_event()
    palgame.clear_screen()

    x = x + 1 # atualizando a posição no eixo 'x'
    y = y + 1 # atualizando a posição no eixo 'y'

    palgame.draw_circle(x, y, raio, cor)

    palgame.draw_everything()
  • Se a gente quiser que a bola se mova mais rapido, é só aumentar a ‘velocidade’, ou seja, o tamanho da mudança:
    • x = x + 5
    • y = y + 5
  • Como sempre, é melhor usar uma variavel para esse valor:
x = 20
y = 30
velocidade_x = 5
velocidade_y = 5
raio = 5
cor = (255, 0, 0)
while True:
    palgame.get_event()
    palgame.clear_screen()

    x = x + velocidade_x # atualizando a posição no eixo 'x'
    y = y + velocidade_y # atualizando a posição no eixo 'y'

    palgame.draw_circle(x, y, raio, cor)

    palgame.draw_everything()

Paredes

  • Agora a gente tem a bola movendo, mas quando a bola chega a beira da tela, ela continua e some. Em vez disso, a gente quer que a bola reassalte nas paredes.
  • Em termos do programa, a gente quer que a bola troque sentido.
  • Primeiro, como a gente pode saber que a bola chegou na parede?
    • É quando a posição da bola é igual (ou maior) do que a posição fixo da parede:
if x >= 700:
    # Aqui a gente sabe que a bola bateu a parede direita
if x <= 0:
    # Aqui a gente sabe que a bola bateu a parede izquerda
if y <= 0:
    # Aqui a gente sabe que a bola bateu a parede superior
if y >= 400:
    # Aqui a gente sabe que a bola bateu a parede inferior
  • Segundo, como a gente consegue inverter o sentido da bola?
    • Lembra que o movimento da bola é controlado pela velocidade, então para inverter o sentido do movimento, é só inverter a velocidade:
if x >= 700:
    velocidade_x = velocidade_x * -1
if x <= 0:
    velocidade_x = velocidade_x * -1
if y <= 0:
    velocidade_y = velocidade_y * -1
if y > 400:
    velocidade_y = velocidade_y * -1

Nota que a gente pode combinar essas linhas pq mesmo batendo parede izquerda ou parede direita, a gente vai inverter velocidade_x

if x >= 700 or x <= 0:
    velocidade_x = velocidade_x * -1
if y <= 0 or y >= 400:
    velocidade_y = velocidade_y * -1

Leave a Reply

Your email address will not be published. Required fields are marked *