Simulação e Física#
Nossa discussão inicial leva em conta que todo jogo precisa criar um conjunto de regras que rege seu mundo. Inclusive, alguns jogos definem suas próprias regras que podem ou não ser inspiradas em conceitos de física "de verdade".
Em muitos casos o foco é a física newtoniana e os Movimentos Retilíneo Uniforme e Retilíneo Uniformemente Variado são muito presente. Neste handout iremos implementar esses dois movimentos em jogos simples em Pygame.
Movimento Retilíneo Uniforme#
Exercise 1
Answer
Nosso \(\Delta t = \frac{25}{1000}s\). Seguindo o raciciocínio trabalhado, fazemos \(50 \Delta t = 50 \frac{25}{1000} = 1.25\).
Exercise 2
Answer
Faremos \(\frac{1}{\Delta t}\) atualizações por segundo. Logo, o valor correto é 40
.
Agora vamos desenvolver nosso primeiro programa usando física. Abra o exercício Bola Bate Rebate no VSCode e continue seguindo as instruções.
Durante essa seção iremos passar cada vez maior quantidade de testes do exercício. Para começar, leia o código fornecido e se familiarize com ele.
Exercise 3
Answer
O dicionário state
contém a chave ball_pos
, que representa a posição inicial da bola como uma lista em que o primeiro elemento é a coordenada x
e o segundo a coordenada y
.
Exercise 4
Agora vamos implementar o Movimento Retilíneo Uniforme em uma simulação simples. Seu jogo deverá ter o comportamento abaixo no fim deste guia.
Um ponto importante desse nosso primeiro jogo com física é que decompomos o movimento da bola em dois MRUs: um na horizontal e um na vertical. Assim usamos sempre o caso mais simples 1D mesmo com movimentos em 2D.
Exercise 5
Em diversos momentos da nossa expositiva falamos sobre a "duração do gameloop" querendo dizer "a quantidade de tempo entre o momento atual e a última vez que atualizamos o estado do jogo". Ou seja, precisamos contar tempo dentro de nosso programa.
Exercise 6
Answer
get_ticks
retorna o número de ms desde o início do programa. Podemos salvar o tempo de cada atualização no estado do jogo e pegar a diferença entre o tempo atual e o armazenado.
Exercise 7
Exercise 8
Estamos quase acabando nosso primeiro jogo. Execute e veja o que está faltando para sua simulação ter os resultados esperados.
A bola não rebate nas bordas!
Exercise 9
Answer
Para que a bola rebate nas bordas precisamos agora mexer em sua velocidade!
A colisão com a borda será feita da mesma forma que o movimento: 1 dimensão por vez. Ou seja, primeiro vemos se a bola está saindo da tela na vertical e tratamos esse caso. Depois fazemos o mesmo para a horizontal.
Exercise 10
Answer
A bola sai da tela se sua extremidade esquerda tiver coordenada x menor que 0 ou se sua extremidade direita tiver coordenada x maior que a largura da tela (640
). A posição que guardamos é a do centro da bola, logo, obtemos as extremidades adicionando/subtraindo o valor do raio do centro. Portanto, a primeira alternativa é a correta.
A segunda alternativa seria promissora também, mas a condição descrita é para a bola estar dentro da tela, não fora.
Sabendo disso, implemente a bola rebatendo em seu jogo. Leve em conta as seguintes dicas:
- Se você detectar que a bola está fora da tela em uma componente, deve inverter a velocidade da bola nesta componente
- A bola nunca pode sair da tela, se ela sair coloque-a de volta na tela no ponto da colisão
Movimento Retilíneo Uniformemente Variado#
A implementação do MRUV segue os mesmos passos do MRU. Seu trabalho aqui será, dado o código inicial com a estrutura básica que fizemos na parte 1, implementar um programa com o comportamento abaixo:
Para este exercício não serão disponibilizados testes. Você deverá conferir o funcionamento do seu código comparando o resultado obtido com a animação acima.