A real-life casual game developed in Processing and Arduino, with a Wii Nunchuk, two flashlights and some LEDs.


nsimaria @ 12:50

Ter, 21/06/11

Antes de começar com a implementação do projecto propriamente dita, foi necessário fazer um estudo prático acerca das tecnologias que iriam ser utilizadas, para perceber melhor quais seriam os possíveis entraves técnicos que surgiriam ao longo do processo. O código do projecto está disponível em https://code.ua.pt/svn/blacklight/ acedendo com o utilizador 'guest' sem password.

 

Detecção de luz - Desenvolveram-se pequenos exemplos recorrendo a várias bibliotecas de captação e tratamento de vídeo, tendo-se escolhido a bibblioteca Myron desenvolvida por Josh Nimoy  (http://webcamxtra.sourceforge.net/) por várias razões, sendo a facilidade de implementação e o fácil acesso a baixo nível do input da "webcam". Implentaram-se alguns pequenos exemplos, um dos quais pode ser visto em http://nsimaria.blogs.ua.sapo.pt/3094.html.

 

Wii Nunchuk - A integração do Wii Nunchuk no projecto era uma das incógnitas que necessitava ser resolvida na fase de análise bastante cedo, já que se trouxesse alguma dificuldade poderia prejudicar o resultado final do projecto. A implementação pretendida era teóricamente simples: interpretar o sinal do Wii Nunchuk com o Arduino e fazer com que este enviasse os dados do comando para o Processing. No entanto, a execução prática deste desafio revelou ser algo complexa. Após algum trabalho de investigação, foi decidido utilizar uma aproximação ao modelo explicado por Maik Schmidt em Arduino - A Quick Start Guide. Uma implementação para prova de conceito realizada pelo grupo pode ser encontrada em http://nsimaria.blogs.ua.sapo.pt/3453.html.

 

Feedback luminoso - Para esta componente do projecto era necessário desta vez que o Processing era quem deveria enviar informação a um segundo Arduino, encarregue de mostrar um "feedback" luminoso mediante uma estrutura de LEDs a ele ligada que mostrasse a cada momento qual era o estado da batalha que estivesse a decorrer. Com a experiencia obtida no desenvolvimento da integração do Wii Nunchuk rápidamente se implentou uma solução baseada na comunicação mediante o porto de série.

 

Esquema conceptual - Uma vez concluída esta primeira fase de investigação acerca das capacidades de cada uma das tecnologias, estavam reunidas as condições para elaborar uma primeira especificação acerca do funcionamento da plataforma. Uma aplicação desenvolvida em Processing alimentar-se-ia do sinal de uma webcam e de dois comandos Wii Nunchuk ligados a ela mediante uma placa Arduino para utilizar como controladores de interacção do jogo Blacklight. Enviaria também em tempo real um sinal de saída a um segundo Arduino que se encarregaria de dar o feedback visual do jogo em tempo real mediante uma estrutura de LEDs.

 

Arquitectura de Software - Uma vez definida a etructura pretendida passou-se à implementação da aplicação de Processing propriamente dita. Após um primeiro período de abordagem à linguagem e de avaliação das suas capacidades ao nível da programação orientada a objectos, implementou-se a uma primeira versão "alpha" que esteve na base da aplicação final. A arquitectura de software concebida para a implementação do Blacklight pode ser dissecada da seguinte forma:

 

Entidades de aplicação

blacklight.pde - script de iniciacialização da aplicação, que inicializa os recursos necessários

 

Entidades de "game flow"

Game - classe responsável pelo fluxo de utilização de toda a aplicação. A classe alimenta-se de um ficheiro XML para a sua parametrização. Apesar de na implementação final ter sido pouco explorada, esta funcionalidade permite a criação de vários níveis de dificuldade sem grande esforço, parametrizando somente o ficheiro data/xml/config.xml.

Level - abstracção do ecrã de jogo com as particularidades de cada nível. Faz a articulação entre as classes Blacklord, Lightlord e Battlefield para a execução do jogo propriamente dito. Contém também uma referencia a um object Serial que faz a comunicação com o Arduino dedicado ao output luminoso.

 

Entidades de jogo

Battlefield e Cell - abstracções do campo de batalha e da sua unidade mínima respectivamente. Foi necessário dividir o campo de batalha numa matriz de elementos Cell de forma a fazer o mapeamento de coordenadas da webcam com as zonas do campo de jogo.

Blacklord e Lightlord - abstrações de cada um dos lados envolvidos na batalha. Fazem a gestão dos elementos de input de cada uma das equipas e provocam o aparecimento e/ou destruição da matéria escura e luminosa.

Blackminion e Lightminion - abstracções dos cursores de cada um dos lados. No que diz respeito à equipa da escuridão trata-se do cursor que gera a matéria negra e, para o lado da luz, cada um dos pontos brancos que se criam para cada área luminosa da "webcam".

Blackmatter e Lightmatter - abstracções da matéria escura e luminosa. Para o lado da escuridão traduz-se nos círculos negros. Para o lado da luminosidade, foi algo que se utilizou durante algum tempo mas deixou de fazer sentido quando se tomou a decisão de que apenas se geraria matéria negra e não matéria luminosa. No entanto manteve-se a classe para integridade de modelo.

 

Entidades de entrada/saída

Detector - wrapper do objecto JMyron utilizado para obtenção e interpretação da imagem da "webcam".

Input - entidade que interpreta o protocolo enviado pela aplicação do Arduino de entrada para obtenção do estado do Wii Nunchuk.

 

Entidades visuais

Intro - implenta o ecrã inicial, a sua animação, e a detecção do evento de disparo para dar início a uma nova batalha.

Winner -implementa a animação de vitória para cada uma das equipas.

Logo - implementa o logotipo animado do ecrã de jogo, que muda de côr consoante a acção no campo de batalha.

 

Arduino - Dispositivo de entrada

Com base na classe Nunchuk implementada por Maik Schmidt em Arduino - A Quick Start Guide, constrói um sinal do tipo "NK1 jx jy ax ay az bz bc" a ser enviado pelo porto série à aplicação principal implementada em Processing onde:

jx - posição do joystick no eixo horizontal;

jy - posição do joystick no eixo vertical;

ax - valor do acelerómetro em relação ao plano horizontal;

ay - valor do acelerómetro em relação ao plano vertical paralelo ao utilizador;

az - valor do acelerómetro em relação ao plano vertical perpendicular ao utilizador;

bz - valor que indica se o botão Z está pressionado ou não;

bc - valor que indica se o botão C está pressionado ou não.

Foi implementado também um mecanismo que de amostragem que não envia o valor lido directamente do controlador senão que faz uma média dos últimos valores recolhidos para suavizar a resposta do Wii Nunchuk e evitar saltos bruscos na interacção.

 

Arduino - Dispositivo de saída

Aplicação simples que interpreta o valor passado pelo Processing que traduz o balanço do actual conflito a decorrer no campo de batalha e ilumina de forma relativa uma estructura de LEDs.