Upload
danghanh
View
235
Download
0
Embed Size (px)
Citation preview
Programação Orientada a
Objetos em Processing
©2
01
5 D
r. W
alte
r F.
de
Aze
ve
do
Jr.
1
azevedolab.net
2
O uso de programação orientada a objeto (POO) não irá introduzir necessariamente
nenhuma nova função ou comando da linguagem de programação Processing.
Usaremos os condicionais, funções e variáveis já vistos. A novidade está na
abordagem. Vejamos um exemplo fora da programação. Você é uma pessoa, que
acordou hoje, tomou café da manhã e pegou um ônibus para chegar até aqui. Sendo
uma pessoa você também tem características, a cor do seu cabelo, sua altura, seu
gênero, a cor dos seu olhos, peso etc.
Programação Orientada a Objetowww.processing.org
Dados humanos:
Altura
Cor dos cabelos
Gênero
Peso
Cor dos olhos
Funções humanas:
Dormir
Acordar
Comer
Pegar algum transporte
3
Na POO chamamos os dados humanos de variáveis. A funções humanas são
funções, ou usando o jargão da orientação a objeto, são métodos. Bem, e você?
Você é o objeto. Todos nós aqui na sala somos objetos. Levando a abordagem de
sistema um pouco adiante, temos que os objetos, como nós, pertencem ao conjunto
dos seres humanos. Ser humano é uma classe.
Programação Orientada a Objetowww.processing.org
Dados humanos:
Altura
Cor dos cabelos
Gênero
Peso
Cor dos olhos
Funções humanas:
Dormir
Acordar
Comer
Pegar algum transporte
4
Vamos simplificar, consideremos um biscoito. A forma de biscoito não é um biscoito
propriamente dito, mas é usado para criar biscoitos. A forma de biscoito é uma classe,
os biscoitos são objetos.
Programação Orientada a Objetowww.processing.org
Dados humanos:
Altura
Cor dos cabelos
Gênero
Peso
Cor dos olhos
Funções humanas:
Dormir
Acordar
Comer
Pegar algum transporte
5
Vimos anteriormente que as variáveis globais eram definidas no início do programa,
podendo ser iniciadas na função setup(), ou mesmo na função draw(), e chamadas em
outras funções. Na POO podemos definir as variáveis e as funções dentro do objeto.
Vamos considerar o nosso exemplo do disco voador. O disco tem variáveis para cor,
localização e velocidade. Além disso temos funções (métodos) para movimento e para
ser mostrado. Vamos usar um pseudocódigo para expressar os conceitos da POO.
Programação Orientada a Objetowww.processing.org
Data (Global Variables):
FlyingSaucer Object
Setup:
Initialize your flying-saucer object
Draw:
Fill background
Display flying-saucer object
Move flying-saucer object
6
Abaixo temos o código sem usarmos POO.
Programa: flyingSaucer08.pdewww.processing.org
float x; // x location of flying saucer cockpit
float y; // y location of flying saucer cockpit
float r; // intensity for red
float g; // intensity for green
float b; // intensity for blue
float speed; // flying saucer speed
void setup() {
size(200, 480);
x = 100;
y = 100;
speed = 1;
}
void draw() {
background(255);
display(20, 20);
moveY();
}
void display(float cockpitX, float cockpitY) {
float saucerX = cockpitX + 100.0;
float saucerY = cockpitY;
noStroke();
ellipseMode(CENTER);
r = random(1, 256);
g = random(1, 256);
b = random(1, 256);
fill(color(r,g,b));
// Cockpit
ellipse(x, y, cockpitX, cockpitY);
fill(175);
// Saucer
ellipse(x, y+10, saucerX, saucerY);
}
void moveY() {
y = y + speed;
if (y > 480) {
speed = -speed;
} else if (y<0) {
speed = -speed;
}
}
7
Agora temos o código usando POO à direita.
float x; // x location of flying saucer cockpit
float y; // y location of flying saucer cockpit
float r; // intensity for red
float g; // intensity for green
float b; // intensity for blue
float speed; // flying saucer speed
void setup() {
size(200, 480);
x = 100;
y = 100;
speed = 1;
}
void draw() {
background(255);
display(20, 20);
moveY();
}
void display(float cockpitX, float cockpitY) {
float saucerX = cockpitX + 100.0;
float saucerY = cockpitY;
noStroke();
ellipseMode(CENTER);
r = random(1, 256);
g = random(1, 256);
b = random(1, 256);
fill(color(r,g,b));
// Cockpit
ellipse(x, y, cockpitX, cockpitY);
fill(175);
// Saucer
ellipse(x, y+10, saucerX, saucerY);
}
void moveY() {
y = y + speed;
if (y > 480) {
speed = -speed;
} else if (y<0) {
speed = -speed;
}
}
class FlyingSaucer {
float x; // x location of flying saucer cockpit
float y; // y location of flying saucer cockpit
float r; // intensity for red
float g; // intensity for green
float b; // intensity for blue
float speed; // flying saucer speed
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
void display(float cockpitX, float cockpitY) {
float saucerX = cockpitX + 100.0;
float saucerY = cockpitY;
noStroke();
ellipseMode(CENTER);
r = random(1, 256);
g = random(1, 256);
b = random(1, 256);
fill(color(r,g,b));
// Cockpit
ellipse(x, y, cockpitX, cockpitY);
fill(175);
// Saucer
ellipse(x, y+10, saucerX, saucerY);
}
void moveY() {
y = y + speed;
if (y > 480) {
speed = -speed;
} else if (y<0) {
speed = -speed;
}
}
}
Nome da classe
Dados
Funcionalidade
(Métodos)
Construtor
Programa: flyingSaucer09.pdewww.processing.org
8
Normalmente as classes apresentam o nome
da classe, dados (variáveis), construtor e
métodos.
O nome da classe inicia com letra maiúscula,
para diferenciar de variáveis e funções. Uma
vez definido o nome da classe, abrimos as
chaves. Tudo que estiver entre as chaves será
considerado com pertencente à classe definida
após a palavra class.
Os dados são as variáveis da classe, são
chamadas como variáveis de instanciação
(instance variables), visto que cada instância
de um objeto contém este conjunto de
variáveis.
O construtor funciona como a função setup(),
só é chamado uma vez. É onde damos as
instruções de como iniciar um objeto.
A funcionalidade traz o(s) método(s) da classe.
class FlyingSaucer {
float x; // x location of flying saucer cockpit
float y; // y location of flying saucer cockpit
float r; // intensity for red
float g; // intensity for green
float b; // intensity for blue
float speed; // flying saucer speed
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
void display(float cockpitX, float cockpitY) {
float saucerX = cockpitX + 100.0;
float saucerY = cockpitY;
noStroke();
ellipseMode(CENTER);
r = random(1, 256);
g = random(1, 256);
b = random(1, 256);
fill(color(r,g,b));
// Cockpit
ellipse(x, y, cockpitX, cockpitY);
fill(175);
// Saucer
ellipse(x, y+10, saucerX, saucerY);
}
void moveY() {
y = y + speed;
if (y > 480) {
speed = -speed;
} else if (y<0) {
speed = -speed;
}
}
}
Nome da classe
Dados
Funcionalidade
(Métodos)
Construtor
Programa: flyingSaucer09.pdewww.processing.org
9
Se tentarmos rodar a classe definida ao lado,
nada irá acontecer. É análogo à função, se
definirmos uma função e não a chamamos,
nada acontece. Assim, temos que criar objetos
da classe. A classe reside fora das funções
setup() e draw().
class FlyingSaucer {
float x; // x location of flying saucer cockpit
float y; // y location of flying saucer cockpit
float r; // intensity for red
float g; // intensity for green
float b; // intensity for blue
float speed; // flying saucer speed
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
void display(float cockpitX, float cockpitY) {
float saucerX = cockpitX + 100.0;
float saucerY = cockpitY;
noStroke();
ellipseMode(CENTER);
r = random(1, 256);
g = random(1, 256);
b = random(1, 256);
fill(color(r,g,b));
// Cockpit
ellipse(x, y, cockpitX, cockpitY);
fill(175);
// Saucer
ellipse(x, y+10, saucerX, saucerY);
}
void moveY() {
y = y + speed;
if (y > 480) {
speed = -speed;
} else if (y<0) {
speed = -speed;
}
}
}
Nome da classe
Dados
Funcionalidade
(Métodos)
Construtor
Programa: flyingSaucer09.pdewww.processing.org
10
Agora temos o programa completo, na primeira
linha declaramos o objeto. É similar à
declaração de variáveis globais, que fazemos
na parte inicial do código, só que agora
declaramos um objeto.
Dentro da função setup() inicializamos o objeto,
similar ao que fazemos com variáveis globais.
Usamos a sintaxe:
nomeObjeto = new nomeClasse();
O operador new constrói um novo objeto.
Depois chamamos os métodos do objeto
criado, em Processing é usado a notação dot
para chamada de métodos.
O novo código chama-se flyingSaucer09.pde
FlyingSaucer mySaucer;
void setup(){
size(200,480);
mySaucer = new FlyingSaucer();
}
void draw(){
background(255);
mySaucer.moveY();
mySaucer.display(20,20);
}
class FlyingSaucer {
float x; // x location of flying saucer cockpit
float y; // y location of flying saucer cockpit
float r; // intensity for red
float g; // intensity for green
float b; // intensity for blue
float speed; // flying saucer speed
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
void display(float cockpitX, float cockpitY) {
float saucerX = cockpitX + 100.0;
float saucerY = cockpitY;
noStroke();
ellipseMode(CENTER);
r = random(1, 256);
g = random(1, 256);
b = random(1, 256);
fill(color(r,g,b));
// Cockpit
ellipse(x, y, cockpitX, cockpitY);
fill(175);
// Saucer
ellipse(x, y+10, saucerX, saucerY);
}
void moveY() {
y = y + speed;
if (y > 480) {
speed = -speed;
} else if (y<0) {
speed = -speed;
}
}
}
Dados
Funcionalidade
(Métodos)
Construtor
Programa: flyingSaucer09.pdewww.processing.org
11
Vamos considerar agora que queremos dois discos no nosso programa. Para
podermos usar POO, temos que manter a mesma classe (FlyingSaucer) e criar dois
objetos desta classe, ou seja, mantemos a forma de biscoito, e criarmos dois biscoitos
distintos. Mas temos aqui um problema, se usarmos o código anterior
(flying_saucer09.pde), e criarmos dois objetos, teremos dois objetos idênticos. Assim,
temos que introduzir uma modificação no código, de forma que possamos passar
valores para as variáveis das coordenadas x,y e da velocidade (speed). Fazemos isto
criando-se um construtor com argumentos. O novo construtor fica como mostrado
abaixo. Veja que temos argumentos agora, chamados argumentos do construtor.
Esta é a única modificação que temos que fazer na classe FlyingSaucer.
Argumento do Construtorwww.processing.org
FlyingSaucer(float xIn,float yIn,float speedIn) {
x = xIn;
y = yIn;
speed = speedIn;
}
12
Agora criamos dois objetos da mesma classe, com nomes distintos, objetos
mySaucer1 e mySaucer2. Na função setup() iniciamos os dois novos objetos. Veja que
usamos parâmetros distintos, que serão passados para o construtor, o que leva a
posições distintas, bem como velocidades, para os dois discos. Por último, os métodos
para movimentar e desenhar são aplicados aos dois objetos, como indicado na função
draw(). O restante do código (programa flying_saucer10.pde) não é mostrado, pois
trata-se da definição da classe FlyingSaucer com a modificação no construtor indicado
no slide anterior.
Argumento do Construtorwww.processing.org
FlyingSaucer mySaucer1;
FlyingSaucer mySaucer2;
void setup(){
size(200,480);
mySaucer1 = new FlyingSaucer(60,50,1.2);
mySaucer2 = new FlyingSaucer(100,100,1.0);
}
void draw(){
background(255);
mySaucer1.moveY();
mySaucer2.moveY();
mySaucer1.display(20,20);
mySaucer2.display(20,20);
}
13
Exercício de programação: Modifique o código do programa flying_saucer10.pde, de
forma que tenhamos quatro discos voadores, todos com posições iniciais e velocidades
distintas.
Exercício de Programação: flying_saucer11.pdewww.processing.org
14
Exercício de programação: Modifique o código do programa flying_saucer04.pde, para
que siga o paradigma de programação orientada a objeto.
Exercício de Programação: flying_saucer12.pdewww.processing.org
15
Exercício de programação: Modifique o código do programa flying_saucer05.pde, para
que siga o paradigma de programação orientada a objeto.
Exercício de Programação: flying_saucer13.pdewww.processing.org
16
Exercício de programação: Modifique o código do programa flying_saucer06.pde, para
que siga o paradigma de programação orientada a objeto.
Exercício de Programação: flying_saucer14.pdewww.processing.org
17
Exercício de programação: Modifique o código do programa flying_saucer07.pde, para
que siga o paradigma de programação orientada a objeto.
Exercício de Programação: flying_saucer15.pdewww.processing.org
18
Exercício de programação: Modifique o código do programa flying_saucer15.pde, de
forma que tenhamos dois discos voadores no jogo.
Exercício de Programação: flying_saucer16.pdewww.processing.org
-MODEL, Mitchell L. Bioinformatics Programming Using Python. Sebastopol: O’Reilly Media, Inc., 2011. 1584 p.
-REAS, Casey & FRY, Bem. Geeting Started with Processing. Sebastopol: O’Reilly Media, Inc., 2010. 194 p.
-SHIFFMAN, Daniel. Learning Processing. A Beginner’s Guide to Programming Images, Animation, and Interaction.
Burlington: Morgan Kaufmann, 2008. 453 p.
-SHIFFMAN, Daniel. The Nature of Code: Simulating Natural Systems with Processing. Mountain View: The Nature of Code,
2012. 498 p.
Última atualização: 13 de setembro de 2015.
19
Referênciaswww.processing.org