Archive

Posts Tagged ‘português’

Oficina Processing, Ex. 1, parte 2

December 10th, 2008

Esta é a continuação, do tutorial de Processing(www.processing.org).

No tutorial anterior, vimos a criação de um objeto, utilizando o método construtor, e uma método de “auto-exibição”, que consistiam em dois requisitos básicos do nosso objeto. Nesta segunda parte, iremos implementar um método de animação e colisão.

Conforme o objetivo desta aula, nós temos que implementar uma animação, para cada um de nossos objetos. O que vamos fazer é uma função dentro da classe Circulo, para mover cada um de nossos objetos.

Bem, a animação em questão, é algo semelhante a uma bola quicando. Então vamos pensar como fazer esta animação. Primeiramente, o nosso circulo deve ir para baixo, e ao tocar na base na tela, ele deve subir, e ao tocar o topo da tela, ele volta a ir para baixo, e assim infinitamente. Traduzindo esse pensamento para uma linha mais técnica, poderíamos dizer isso da seguinte maneira:

- O objeto inicia de deslocando no eixo y (vertical) no sentido “positivo”

- Toca na base da tela

- muda o deslocamento em sentido “negativo”

Espero que isso tenha ficado compreensível, caso contrário, acho que durante o andamento a coisa ficará mais clara. Então vamos lá, na classe Circulo, a primeira coisa que precisamos fazer é inserir duas novas propriedades, uma chamada ‘direcao’ e outra ‘velocidade’, afinal para qualquer movimento precisamos de uma direção e uma velocidade :)

codigo 1

Repare que na variável ‘direcao’, já estou atribuindo a ela o valor 1. Mantenha isto em mente, para mais adiante. A variável ‘velocidade’, não possui um valor previamente atribuído, isso porque eu quero atribuir valor a ela via método construtor, assim poderemos alterar valores para cada objeto que instanciaremos futuramente.

Agora no método construtor teremos mais um parâmetro para tratar:

cod 2

Com essas duas variáveis na mão, vamos fazer a função de movimentação. Vou chamar essa função de mover(). Primeira coisa que faremos, é programar que o objeto se mova para baixo infinitamente.

cod 3

O que essa função está fazendo é incrementar(”aumentar”), o valor do y, que é usado para o desenho da ellipse(observar função exibe()), com uma formulazinha onde a velocidade vezes a ‘direcao’, é somada ao valor do y, ou seja:

- no primeiro frame, y vale 100.

- quando utilizarmos a função mover(), o y receberá o incremento do valor de velocidade X ‘direcao’, ou seja passará a valer 103 (assumindo que a velocidade receba o valor 3).

Para que essa alteração seja visível, vamos atualizar o código da função setup() e da função draw():

cod 4

Repare que no método construtor do objeto circ, estou mandando um quarto parâmetro, 3, que será atribuído à velocidade. E na função draw(), repare que temos que chamar a função mover(), do circ. Ou seja, a cada vez que a função draw() é executada, primeiro será exibido o circulo, e então, o seu centro será deslocado(circ.mover()), e no próximo frame, esse deslocamento será percebido como uma animação. :)

Se você preferir, é possível fazer a chamada da função mover(), de dentro da função exibe() que está na classe Circulo, o resultado será o mesmo.

Finalmente vamos fazer as colisões com a base e o topo da tela.

Vamos adicionar uma estrutura de decisão( uma cláusula if ) na função mover(), para se a base do circulo for igual a base da tela, a direção( 1 ) será multiplicada por -1. Dessa forma, aquela continha que deslocava o centro (Y) do objeto para baixo, começará a deslocá-lo para cima.

cod 5

Você deve ter reparado que essa animação deixou um rastro, como uma trajetória do nosso circulo, para acabar com isso, coloque a ordem de background() na função draw():

cod 6

CLIQUE DO MOUSE

Agora vamos fazer o seguinte, criar uma simples efeito de “interação”, fazer o circulo clicável e ao ser clicado, modar de cor, para um tom aleatório.

No Processing, um click de mouse é entendido como um evento( não vou entrar em grandes detalhes do que é um evento, no momento basta compreender que um click de mouse, ou uma tecla do teclado pressionada são eventos do sistema operacional ), e para tratar alguns tipos de evento, o processing possui funções da linguagem, que são as funções de evento.

Para eventos do mouse nós temos as seguintes funções:

mouseClicked() = quando algum botão do mouse é pressionado

mousePressed()= quando algum botão do mouse é pressionado

mouseReleased()= quando algum botão do mouse deixa de ser pressionad

mouseDragged() = quando algum botão do mouse é pressionado, e o mouse movimentado

Essas funções são programadas junto com as funções draw() e setup(). Veja o exemplo abaixo:

cod 7

Sempre que o mouse é clicado, imprimimos no console de saída a frase “Evento do mouse”. Fassa o teste acima, usando ao invés de mouseClicked(), as outras possibilidades de funções de evento para o mouse.

Agora façamos o seguinte, vamos imprimir na saída de console as coordenadas x e y do mouse, daca vez que o mouse for clicado. Teremos que usar as variáveis mouseX e mouseY, a coisa vai ficar assim:

cod 8

E a saída de console será semelhante a isto:

cod 9

Cada uma dessas linhas no console, são as posições do mouse a cada clique. Essa informação vai ser crucial para fazermos com que nosso objeto reaja ao clique.

Agora que temos as coordenadas de cada clique do mouse, podemos criar uma função na nossa classe para verificar, se o clique aconteceu dentro da área do circulo. Isso é super fácil, basta compararmos a posição do clique, com as coordenadas do circulo. O que é necessário se testar, é se o clique aconteceu dentro da área de alcance do raio da ellipse, observe o desenho abaixo:

desenho de vetores

Esse desenho ilustra um cálculo para medir a distância entre dois pontos. Para fazer esse processo, o Processing nos fornece algumas ferramentas para facilitar a nossa vida, entre elas vamos ver o objeto PVector.

O objeto PVector, é na verdade um vetor. Muitas vezes um vetor e um ponto, são representados da mesma forma, e muitas vezes são utilizados da mesma forma, porém convém lembrar que um vetor deve ser entendido sempre como uma linha, mesmo que sua representação possua apenas duas coordenadas, ele ainda é uma linha com inicio na origem do desenho. Essa propriedade do vetor ser uma linha nos permite uma série de possibilidades, entre elas o cálculo rápido de distâncias.

Vamos então adicionar à classe Circulo, dois objetos do tipo PVector, o v_centro e o v_click, que serão dois vetores, um para o centro do circulo(v_centro) e outro para a coordenada do click(v_click):

objetos PVector

Esses objetos só entrarão em funcionamento quando o mouse clicar na tela. Agora é necessário criar uma função para verificar esse processo, a função click(). A função click() irá criar os dois vetores, e comparar a distância entre eles.

cod 12

O percurso da função é o seguinte:

- atribui x e y do circulo ao vetor v_centro

- atribui as coordenadas do mouse (mouseX e mouseY), ao vetor v_click

- compara a distância entre o v_centro e o v_click( v_centro.dist(v_click) ), e se for menor que o raio(diametro/2), imprime no console “O clique aconteceu dentro do círculo”.

Veja os resultados do console:

saída de console:

Agora que o clique está funcionando, que tal fazermos com que o círculo mude de cor a cada clique? Mas antes disso nós precisamos inserir alguma cor no nosso objeto, porque até agora ele está trabalhando com o padrão do Processing, ou seja, tons de cinza.

Então nós inserimos uma variável do tipo color, na nossa classe, que será então a cor do nosso objeto:

cod 14

Então lá na função exibe(), iremos colocar uma ordem para que o Processing desenhe nosso círculo com a cor que queremos:

cod 15

Agora sim, podemos mudar de cor porque temos uma cor inicial. Para fazer tal mudança criaremos a função mudaCor(), abaixo:

cod 16

tudo que esta função faz é escolher cores de forma aleatória, com valores entre 0 e 255 ( random(0,255) ) para cada um dos tons que compõe o sistema de cores RGB.

Agora tudo que precisamos fazer, é chamar esta função a partir da função click():

cod 17

Pronto, agora só restam alguns detalhes finais!

FINALIZANDO

Bem, agora que a nossa classe “Círculo” está completa, só faltam alguns toques finais para acabarmos o exercício. Abaixo você pode ver as alterações finais:

cod 18

A primeira coisa a se notar é que agora estamos trabalhando não mais com um único objeto circ, e sim com array de objetos circ, e neste array temos 8 objetos. Isto nos força a várias alterações no nosso código.

A primeira alteração está na primeira linha. Antes onde declarávamos apenas um objeto, agora declaramos um array:

Circulo[] circ = new Circulo[8];

Quando declaramos um array, declaramos de forma muito parecida a uma variável comum, com a diferença que colocamos um par de colchetes ao fim do tipo do objeto, Circulo[] circ .Nesta linha ainda completei dizendo a quantidade de objetos que este array irá abrigar, new Circulo[8], neste caso 8 objetos.

Com essa alteração agora temos que nos preocupar com a “chamada dos objetos”, ou seja, agora que estamos trabalhando com vários objetos dentro de um array, temos que construí-los um a um, e também chamar a função exibe(), mover() e click(), de cada um deles. Para facilitar nossa vida usamos loops for.

Observe na função setup(), que foi criado um loop, para construir cada um dos objetos do array. O mesmo acontece na função draw(), para chamar a função exibe() e mover() de cada um dos objetos.

Bem, encerro aqui esse exercício, qualquer dúvida é só postar uma mensagem.

Abras.

Processing, Tutoriais , , , , , , , , ,

Processing - experiência 001

July 21st, 2008

Vamos lá… este é o primeiro de meus tutoriais, e o primeiro falando do Processing.

Antes só quero passar um link, http://www.maiszero.org/. Este é um coletivo de artistas. Um deles é o Fabrizio, que foi meu professor - fala aí, mano!. E a caboclada faz um trabalho muito bacana de arte, e uma das ferramentas que eles usam é o Processing.

O Processing é um software livre, e implementado em Java. O que isso quer dizer!?? Bem, se você não sabe o que isso quer dizer, supondo que você tlvz seja um designer iniciante nessa coisa de programação, ou nunca mexeu com isso antes, neste caso a explicação que eu te daria pessoalmente seria: Por ser um software livre, ele te dá liberdade total de uso e modificação, ser implementado em Java, significa que ele foi feito em Java (linguagem de programação, não a ilha!) e dessa forma ele funciona em quase todas as plataformas existentes. Mas como estamos no cyber-espaço, use algum mecanismo de busca para maiores informações ;)

E ele foi desenvolvido para que você, de forma simples, possa desenvolver softwares, especialmente aqueles dedicados a fins artísticos áudio-visuais. A razão que eu te daria para a compreender a importância em aprender a fazer trabalhos escrevendo seu soft e não usando um que já exista seria que dessa forma você consegue torná-lo mais autoral.

Não é novidade para ninguém, a quantidade de informações áudio-visuais que recebemos todos os dias. Porém a oferta/consumo de farramentas para essa produção não é a tão grande assim, e o pior, são todas proprietárias, o que não te permite modificá-las, com isso, o resultado dessa produção é muito pasteurizado. Obviamente temos que levar em consideração as necessidades da nossa sociedade indústrial. Mas se você souber criar as suas próprias ferramentas, mesmo que simples, elas te darão resultados mais personalizados e individuais. Falaremos mais sobre isso no futuro.

Antes de começar o tutorial, vou levar e consideração que você já fez o download do Processing e que esteja tudo em ordem.

Agora vamos pôr a mão na massa.

Assim que você abrir o Processing, será exibida a janela de trabalho:

tela inicial do processing

Nesta tela começamos a escrever o código na área branca, destinada ao texto. Na parte inferior teremos o terminal de saída, nele o programa irá apontar possíveis erros no script, avisos, e também deve ser muito utilizado para você monitorar o andamento do seu soft.

Na parte superior, estão os botões RUN, STOP, NEW, OPEN, SAVE, EXPORT. O botão RUN irá executar o seu programa, e o STOP… faz favor né!?

Botões do processing

Agora vamos fazer a coisa funcionar.

Para começar, temos que definir as configurações iniciais do nosso programa.

No Processing isso sempre começa pelas funções setup e draw, e na função setup vão os comandos size e background. Comece digitando o seguinte:

void setup() {
size(200,200);
background(0);
noLoop();
}
void draw(){
rect(50,50, 30,30);
}

Ao final clique na setar do botão RUN.

tela de fundo negro e quadrado branco, gerada pelo processing

Isso irá gerar apenas uma tela de 200×200 pixels, com fundo preto, e um retangulo branco. O padrão de cor para background do processing é cinza, ou seja, caso você não coloque a linha do background, ele será cinza.

Eu particularmente acho o código, especialmente este, muito intuitivo, mas vamos a uma explicação. A função setup, se encarrega de configurar a tela da forma como queremos, com o size(200, 200); - tamanho(200,200) - a cor de plano de fundo, e o comando noLoop();. As janelas do processing tem por padrão a natureza de serem animadas, e se atualizarem constantemente, e para tanto se utilizam de loops, e neste caso defino que esta janela não terá loops com o comando noLoop(), isso é interessante saber afinal loops tomam processamento do computador. E a função draw, irão todas as coisas que serão desenhadas na tela, neste caso um retângulo, que terá se canto superior esquerdo na coordenada 50,50, e terá 30 pixels de largura por 30 pixels de altura.

Primitivas

O Processing possui formas primitivas, são elas o ponto, a linha, retângulos, elipses, triângulos (fundamentais para 3D). Vamos dar uma olhada nisso.

point(5, 5); // isso criará um ponto na coordenada x=5 e y=5

Ah… sim! para fazer desenhos, ou imagens, coordenadas são fundamentais. No Processing o ponto 0,0 está no canto superior esquerdo, como mostra o quadro baixo. Guarde Isso na CABEÇA!

coordenadas no processing

Vamos acrescentar algumas primitivas no nosso trabalho:

void setup(){
size(200,200);
noLoop();
}void draw(){
//áreas retangulares
rect(50, 50, 30, 30);
//ponto
point(10,10);
//linha
line(30,10, 30,90);
line(33,10, 40,90);
//triangulo
triangle(160,100, 125,160, 175,165);
//geometrias de quatro lados
quad(20,100, 10,130, 30,130, 40,100);
//elipses
ellipse(60,150, 50,50);
}

Depois de testar as coisas como estão aqui neste exemplo, modifique os valores. E posteriormente, crie composições com esses elementos.

Em breve terei outros tutoriais aqui!

até

baixar o arquivo

Processing , ,