Introdução à programação
com Python em um contexto visual


Movimento

A estrutura setup() e draw()

Para produzir movimento nos valemos de uma ideia presente em todo tipo de animação, a ideia dos quadros (frames) que são as imagens mostradas em uma rápida sucessão. No Processing a geração dessas imagens acontece dentro de uma função que devemos definir chamada draw(). Tudo que é desenhado dentro de draw() é na verdade redesenhado cerca de 60 vezes por segundo (o chamado frame rate). Para se obter o efeito de uma animação de elementos se deslocando na tela devemos “limpar” o quadro no começo de cada draw() frequentemente com a instrução background(). Se desenharmos sem essa “limpeza” da tela os elementos “acumulam” ou “deixam um rastro”.

Antes do laço principal de repetição, que é como costumamos descrever a execução do draw(), é executada uma função de preparo ou configuração chamada setup() que também precisamos definir. Essas duas funções juntas são a forma mais comum de se estruturar um sketch (um programa em Processing).

Resumindo: Dentro do setup() vai tudo aquilo que precisamos fazer apenas uma vez e no começo, como, por exemplo, definir a àrea de desenho com size(). Já no draw() vão principalmente as instruções de desenho propriamente ditas, em geral precedidas por uma limpeza da tela ou fundo, e são acionados os cálculos de atualização dos elementos da animação.

Note que no exemplo a seguir, a posição e velocidade do círculo é mantida em algumas variáveis, px, py, vx e vy, que precisam ser ‘lembradas’ entre os ciclos de repetição do draw() e dentro dele são modificadas. Isso é o que chamamamos de variáveis globais, em contraste com variáveis que fossem criadas dentro do draw() e que seriam variáveis locais. Leia mais sobre isso na página Escopo: variáveis globais e locais.

Círculo rebatendo nas bordas

raio = 50  # tamanho do raio do círculo
vx = 2.5   # velocidade horizontal inicial
vy = -1.5  # velocidade vertical inicial

def setup():
    global px, py  # importante, permite criar variáveis globais dentro do setup!
    size(400, 400)
    noStroke()  # desenhar sem traço de contorno
    # Define a posição inicial do círculo
    px, py = width / 2, height / 2  # meio do desenho

def draw():
    global px, py, vx, vy  # é o que permite modificar as variaveis globais no draw!
    background(0, 0, 200) # limpa o frame com um fundo azul
    # Atualizar as variáveis da posição do círculo
    px = px + vx   # "posiçao x" passa a ser a "posição x" + "velocidade x"
    py = py + vy
    # Testar se o círculo está fora da tela, se estiver,
    # inverta a velocidade (de a ela o valor de -velocidade).
    if px > width - raio or px < raio:
        vx = -vx
    if py > height - raio or py < raio:
        vy = -vy
    # Desenha o círculo
    circle(px, py, raio * 2)

Assuntos relacionados


Este material é baseado no material do curso https://arteprog.space/programacao-criativa/


Texto e imagens / text and images: CC BY-NC-SA 4.0; Código / code: GNU GPL v3.0 exceto onde explicitamente indicado por questões de compatibilidade.