speed - azevedolab.net
Transcrição
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
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 maisy - 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 maisArrays - 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 maisTeste 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