speed - azevedolab.net

Transcrição

speed - azevedolab.net
azevedolab.net
1
© 2015 Dr. Walter F. de Azevedo Jr.
Programação Orientada a
Objetos em Processing
Programação Orientada a Objeto
www.processing.org
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.
Dados humanos:
Altura
Cor dos cabelos
Gênero
Peso
Cor dos olhos
Funções humanas:
Dormir
Acordar
Comer
Pegar algum transporte
2
Programação Orientada a Objeto
www.processing.org
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.
Dados humanos:
Altura
Cor dos cabelos
Gênero
Peso
Cor dos olhos
Funções humanas:
Dormir
Acordar
Comer
Pegar algum transporte
3
Programação Orientada a Objeto
www.processing.org
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.
Dados humanos:
Altura
Cor dos cabelos
Gênero
Peso
Cor dos olhos
Funções humanas:
Dormir
Acordar
Comer
Pegar algum transporte
4
Programação Orientada a Objeto
www.processing.org
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.
Data (Global Variables):
FlyingSaucer Object
Setup:
Initialize your flying-saucer object
Draw:
Fill background
Display flying-saucer object
Move flying-saucer object
5
Programa: flyingSaucer08.pde
www.processing.org
Abaixo temos o código sem usarmos POO.
float
float
float
float
float
float
x;
y;
r;
g;
b;
speed;
//
//
//
//
//
//
x location of
y location of
intensity for
intensity for
intensity for
flying saucer
flying saucer cockpit
flying saucer cockpit
red
green
blue
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;
}
}
6
Programa: flyingSaucer09.pde
www.processing.org
Nome da classe
Agora temos o código usando POO à direita.
float
float
float
float
float
float
x;
y;
r;
g;
b;
speed;
//
//
//
//
//
//
x location of
y location of
intensity for
intensity for
intensity for
flying saucer
flying saucer cockpit
flying saucer cockpit
red
green
blue
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
float y;
// y location of
float r;
// intensity for
float g;
// intensity for
float b;
// intensity for
float speed;
// flying saucer
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
flying saucer cockpit
flying saucer cockpit
red
green
blue
speed
Dados
Construtor
Funcionalidade
(Métodos)
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
Programa: flyingSaucer09.pde
www.processing.org
Nome da classe
class FlyingSaucer {
float x;
// x location of
float y;
// y location of
float r;
// intensity for
float g;
// intensity for
float b;
// intensity for
float speed;
// flying saucer
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
flying saucer cockpit
flying saucer cockpit
red
green
blue
speed
Dados
Construtor
Funcionalidade
(Métodos)
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;
}
}
}
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.
8
Programa: flyingSaucer09.pde
www.processing.org
Nome da classe
class FlyingSaucer {
float x;
// x location of
float y;
// y location of
float r;
// intensity for
float g;
// intensity for
float b;
// intensity for
float speed;
// flying saucer
FlyingSaucer() {
x = 100;
y = 100;
speed = 1;
}
flying saucer cockpit
flying saucer cockpit
red
green
blue
speed
Dados
Construtor
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().
Funcionalidade
(Métodos)
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;
}
}
}
9
Programa: flyingSaucer09.pde
www.processing.org
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
float y;
// y location of
float r;
// intensity for
float g;
// intensity for
float b;
// intensity for
float speed;
// flying saucer
Dados
flying saucer cockpit
flying saucer cockpit
red
green
blue
speed
FlyingSaucer() {
Construtor
x = 100;
y = 100;
Funcionalidade
speed = 1;
(Métodos)
}
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;
}
}
}
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
10
Argumento do Construtor
www.processing.org
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.
FlyingSaucer(float xIn,float yIn,float speedIn) {
x = xIn;
y = yIn;
speed = speedIn;
}
11
Argumento do Construtor
www.processing.org
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.
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);
}
12
Exercício de Programação: flying_saucer11.pde
www.processing.org
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.
13
Exercício de Programação: flying_saucer12.pde
www.processing.org
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.
14
Exercício de Programação: flying_saucer13.pde
www.processing.org
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.
15
Exercício de Programação: flying_saucer14.pde
www.processing.org
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.
16
Exercício de Programação: flying_saucer15.pde
www.processing.org
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.
17
Exercício de Programação: flying_saucer16.pde
www.processing.org
Exercício de programação: Modifique o código do programa flying_saucer15.pde, de
forma que tenhamos dois discos voadores no jogo.
18
Referências
www.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

Documentos relacionados

float - azevedolab.net

float - azevedolab.net O programa flying_saucer01.pde traz um jogo simples que simula a queda de um disco voador. O disco sofre uma pane em seu motor de dobra espacial, e começa o processo de queda livre. O único recurso...

Leia mais

y - azevedolab.net

y - azevedolab.net alterações não são mostrados. O método myScore() tem a inclusão da chamada do método changeColor(). Os métodos changeColor() e changeBackground() são idênticos às funções equivalentes do código fly...

Leia mais

Arrays - azevedolab.net

Arrays - azevedolab.net Uma forma elegante de superarmos este problema, é por meio do uso de arrays. Vimos em Python que arrays são variáveis indexadas, onde podemos acessar um valor específico dentro de uma lista de valo...

Leia mais

Teste Tipo 2012 - AEISTECP

Teste Tipo 2012 - AEISTECP float y = r * sin(theta); // Desenha a ellipse em coordenadas cartesianas ellipseMode(CENTER); noStroke(); fill(200); ellipse(x, y, 32, 32); // Aplicar aceleração e velocidade ao angulo (r o raio m...

Leia mais