Skip navigation

hoje continuamos as arraylists e comunicação inter-objectos, para detecção de colisão e respostas, sejam elas de movimento ou gráficas; introduzimos o PVector, tipo de dados do processing que manipula vectores 2 e 3d; fomos ainda ver como ligar joysticks e interfaces usb ao computador, e alguns exemplos mais finalizados.

 

1. comunicação inter-objectos; diferentes respostas às colisões.

sendo os objectos armazenados em ArrayLists, e estas declaradas globalmente no sketch, as classes que definimos podem ler informação dos elementos contidos noutras ou na mesma arraylist. é assim que a class Bola acede às posições de cada obstáculo e cada outra bola para na função colide verificar se a distância a que está do outro objecto é inferior à soma dos raios, se for, já sabemos que está a colidir com esse objecto. (leiam as notas da sessão 9 se tiverem dúvidas nestes pontos acima referidos).

primeiro, no sketch bolas_e_obstaculos_arraylist6.pde, introduzimos uma class Tiro, esta será responsável por disparar linhas com duração máxima determinada, e se as linhas colidirem ou com bolas, ou com obstáculos, efectuamos respostas a essa colisão que não vão ser de movimento, vão ser gráficas e lógicas. 

 

a class Tiro vai ter como função principal a mesma que a Bola, ie, 

  void render(){

    colide();

    update();

    draw(); 

  }

toda a lógica das respostas será implementada na função colide. esta é igual ao encontrar das distâncias entre os objectos, e a parte relevante está aqui destacada:

    //colisão apenas com os obstáculos

      if (distance < minDist) { 

        energy=-1; // colocar a energia do tiro negativa para que ele seja removido da arraylist

      }

    //colisão com as outras bolas

      if (distance < minDist) { 

        b.live=false; // indicar à bola que ela vai ser removida da arraylist

        energy = -1; // colocar a energia do tiro negativa para que ele seja removido da arraylist

      }

bolasobstaculos6-00174

ou seja, nestas colisões não nos importa a resposta de movimento, vamos apenas eliminar os tiros no caso da colisão com os obstáculos, e eliminar os tiros e as bolas das respectivas arraylists no caso de colisão com bolas. facilmente os tiros podiam mover ou eliminar os obstáculos também. bastava que a detecção de colisão ao obstáculo implementasse como respostas acelerações ao movimento, e possível remoção do obstáculo.

bolasobstaculos6-00510

 

para tornar as coisas mais interessantes gráficamente, vamos extender ligeiramente o código, e introduzir umas partículas simples que desenham bitmaps nos locais das colisões, uma class de explosões, e umas imagens das explosões que vamos usar.

no sketch bolas_e_obstaculos_arraylist7.pde introduzimos um novo tab ao projecto que se chama explosoes, e além da class Explo que define o comportamento das partículas, vamos declarar a array de imagens, uma função para ler as imagens, uma função para fazer uma explosão com num elementos na posição xy.

 

/// as imagens

PImage explosoes[];

/// iniciar a array de imagens

void init_explosoes(){

  explosoes = new PImage[8];

  for(int i=0; i<8;i++){

    String f = “e16-“+i+”.png”;

    explosoes[i] = loadImage(f); 

  }

}

/// criar num elementos e adicioná-los à arraylist explosions

void explode(float x,float y, int num) {

  if(explosions.size()<500){

  for(int i=0; i<num;i++){

    Explo e = new Explo(x,y);

    explosions.add(e);

  }

  }

}

 

temos presente uma nova arraylist explosions que é renderizada como todos os outros objectos; cada elemento da class Explo acede a uma imagem da array de imagens explosoes[] que declaramos.

bolasobstaculos5-02615

modificamos ligeiramente as respostas de colisão que vimos no sketch 6, e adicionamos uma chamada à função explode( float x, float y, int num), que insere estes novos elementos gráficos em cena.

 

    //colisão apenas com os obstáculos

      if (distance < minDist) { 

        energy=-1; // colocar a energia do tiro negativa para que ele seja removido da arraylist

        explode(x,y,(int)random(2,5)); 

      }

 

    //colisão com as outras bolas

      if (distance < minDist) { 

        b.live=false; // indicar à bola que ela vai ser removida da arraylist

        energy = -1; // colocar a energia do tiro negativa para que ele seja removido da arraylist

        explode(x,y,(int)random(5,10)); 

      }

 

bolasobstaculos5-01430

 

 

2. colisão com vectores em 2 e 3d (PVector)

 

um PVector é um vector, ie, um tipo de dados que armazena componentes x, y e z de um ponto ou um vector. além desses campos, que podem ser manipulados tipo pos.x = 100; ou pos.x+=vel.x;  tem vários métodos que fazem operações com todos os elementos. o código é simplificado quando levamos as coisas para 3d, em vez de termos 3 variáveis para a posição, 3 para a velocidade e outras 3 para a acelaração, declaramos apenas 3 PVectors, um para a pos, outro vel e outro acc. além de que temos acesso a uma vasta gama de operações aos vectores (ver reference do PVector).

quando fazíamos :

x+=vx;

y+=vy;

vamos agora fazer :

pos.add(vel);

bolasvectormouse-001951

 

o core do código da bola em 3d e com vectores será idêntico ao que já vimos, com a extensão dos cálculos para a terceira dimensão

  void render(int i){

    colide(i);

    update();

    display();

  }

  void update(){

    vel.add(acc);

    vel.mult(friccao);

    vel.y+=grav;

    pos.add(vel);

    acc.set(0.,0.,0.);

    bounds();

  }

 

as modificações mais importantes são a detecção e resposta em 3d. no próximo sketch temos agora um conjunto de esferas em cena que colidem umas com as outras e com as paredes do mundo.

bolas_vector_3d-00123

bolas_vector_3d-03937

 

 

 

3. joysticks 

 

são dispositivos usb, com um ou mais eixo analógico, que enviam valores variáveis, e botões, que enviam on/off. através do processing e de outros ambientes de programação conseguimos aceder aos valores dos josticks, de qualquer botão, eixo que ele tenha. fomos usar a biblioteca procontroll.

primeiro, instalar a biblioteca na directoria  sketch book / libraries. depois de relançar o processing com o joystick ligado, podemos correr os sketches. no primeiro sketch listamos todos os eixos e butões de todos os dispositivos que conseguimos aceder. além do teclado, trackpack, aparecem outros dispositivos, neste caso, logitech dual action. na consola do processing aparecem todos os identificadores dos eixos (o que aparece do joystick:)

<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Logitech Dual Action has:

 4 sliders

 13 buttons

 2 sticks

<<< available Logitech Dual Action sliders: >>>

     0: x absolute

     1: y absolute

     2: z absolute

     3: rz absolute

<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<< available Logitech Dual Action buttons: >>>

     0: 0

     1: 1

     2: 2

     3: 3

     4: 4

     5: 5

     6: 6

     7: 7

     8: 8

     9: 9

     10: 10

     11: 11

     12: cooliehat: pov

<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<< available Logitech Dual Action sticks: >>>

     0: y x

     1: rz z

<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

 

no sketches seguintes, acedemos aos valores dos eixos, primeiro importar a library, declarar as variáveis, depois construí-las durante a setup, e durante a draw ler os valores dos eixos: 

 

import procontroll.*;

import net.java.games.input.*;

 

ControllIO controllIO;

ControllDevice joypad;

ControllStick stick1;

ControllStick stick2;

 

….setup….

  controllIO = ControllIO.getInstance(this);

  joypad = controllIO.getDevice(“Logitech Dual Action”);//Logitech RumblePad 2 USB”);

 

  stick1 = joypad.getStick(0);

  stick2 = joypad.getStick(1);

 

….draw….

  rotateX(stick2.getTotalY());

  rotateY(stick2.getTotalX());

 

depois implementamos um mini-jogo para 2 jogadores, duas ellipses que disparam tiros e inimigos lançados do centro. aqui as funções de update dos players são guiadas pelos valores que obtemos vindos da gamepad.

joystickgame-01058

joystickgame-01329

 

4. alguns exemplos mais finalizados

uma variação das bolas e obstaculos, um heroi que dispara tiros e cinde bolas em duas mais pequenas que vão colidindo com obstáculos em cena. aqui recriamos a lógica dos sketches anteriores de bolas e obstáculos, com outras regras, onde se o tiro colidir com bolas fazemos desaparecer a maior e reaparecerem duas mais pequenas nas mesma posição.

bolas_obstaculos-01438

bolas_obstaculos-00770

depois fomos ver uma variação do exemplo reflection2 do processing (file > examples > topics > motion ), aqui tinhamos as teclas a interferir no sketch, o w,a,s,d influenciam as velocidades da bola, e a colisão com um terreno multisegmentado.

 

bolas_ground-007291

bolas_ground-00915

e finalmente, como transformar um slitscan de video numa textura para um plano em 3d que pode ser rodado em torno do x e y.

slit3d-00191

slit3d-00686

 

nesta sessão finalizamos a introdução a vários temas de síntese, manipulação e interacção de imagens em 2 e 3d usando o processing. nas sessões seguintes vamos analisar síntese e manipulação sonora dentro do pure data, uma  linguagem de programação visual opensource, bem como comunicação inter-programas, e inter-computador, através de protocolos de rede, que hoje já vimos um curto exemplo que vem com o processing, um chat server. ligando o sketch começamos um servidor que escreve tudo o que recebe dentro da tela. precisamos de agora iniciar uma sessão de telnet, indo ao terminal do macosx, ou instalando o dave’s telnet para windows, por exemplo, e escrevemos:

 

telnet 127.0.0.1 10002

// se o sketch estiver a funcionar têm logo esta mensagem:

Trying 127.0.0.1…

Connected to localhost.

Escape character is ‘^]’.

// tudo o que agora escreverem surje na janela do sketch

Anúncios

One Trackback/Pingback

  1. By sessão 17 « O Som do Pensamento on 27 Maio 2009 at 11:55 am

    […] máquinas de estado simples mais avançadas, onde criamos várias classes, obstáculos, bolas, tiros, e todos elas comunicam entre si. cada bola, mesmo as autónomas colidem com os obstáculos, a nossa bola envia tiros que colidem com bolas e obstáculos, e implementamos uma lógica simples quando as bolas em cena terminam, re-iniciamos um novo nível. (sessão 10) […]

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: