Pense na função draw() como se fosse um loop, quando utilizamos bibliotecas e pacotes em gerais normalmente não precisamos saber como foi desenvolvido aquele código ou função, isto fica encapsulado e só precisamos saber os detalhes de implementações. Por exemplo podemos criar uma função draw() nós mesmos utilizando Javascript:
function draw() {
renderizaCarro()
movimentaCarro()
}
setInterval(draw, 20);
Neste caso eu utilizei Javascript puro onde setInterval() é um método que chama uma função em determinados intervalos específicos (em milissegundos). Ou seja, a draw() neste caso será executada a cada 20 milissegundos então a função movimentaCarro() também será executada a cada 20 milissegundos e assim atualizando a posição do carro, passando a ideia de movimento. Claro que a função draw() da biblioteca p5.js não foi implementada assim. Você pode ver que você também cria suas próprias funções como movimentaCarro(), e depois só chama ela, sem a necessidade de saber o código por trás dela. A diferença é que draw() é uma função externa, portando devemos apenas consultar a documentação da biblioteca para saber o que ela faz:
draw()
- Chamada diretamente após setup(), a função draw() executa continuamente as linhas de código contidas em seu bloco até que o programa seja interrompido ou noLoop() seja chamado.
Assim podemos entender porque o movimento do carro é contínuo.