Aqui podem encontrar as actualizações da arquitectura em resposta aos pedidos e comentários dos alunos.  A última versão é a recomendada.

Aqui podem encontrar as actualizações da arquitectura em resposta aos pedidos e comentários dos alunos.  A última versão é a recomendada.

Respostas a Perguntas Frequentes (FAQ)

Qual a diferença entre usar o singleton cg::KeyBuffer e implementar a interface cg::IKeyboardListener?

A diferença está no tipo de uso que queremos dar ao teclado num módulo particular da aplicação.

Quando queremos detectar uma tecla, geralmente implementamos a interface IKeyboarddListener, e descrevemos o comportamento que pretendemos nas funções onKeyPressed, onSpecialKeyReleased, etc. adicionadas à entidade. Esta aproximação é a mais adequada quando assumimos que a tecla é apenas primida de longe em longe (e.g. o ESC). Neste caso, deixamos ao cuidado da cglib a responsabilidade de nos avisar quando tal acontece, numa perspectiva claramente passiva.

Agora imaginemos que é esperado que o utilizador esteja constantemente a primir as teclas de cursor para controlar um elemento da aplicação (e.g. um veículo, num jogo de corridas). Neste caso, teríamos de detectar quando uma tecla de cursor é primida (no onSpecialKeyPressed) ou largada (no onSpecialKeyReleased) e manter numa variável interna à entidade (do tipo booleano) o estado da tecla. Por outras palavras, a GLUT (através da cglib) só envia um sinal quando a tecla é primida ou largada, e cabe à aplicação manter o estado dessa tecla para saber se ainda está a ser primida (nota: na verdade é um pouco mais complicado, mas essa é a ideia principal. Para mais informação, consultar o manual da GLUT).

Como este tipo de comportamento é frequente, ao desenhar a cglib acabamos por adicionar a classe cg::KeyBuffer que mantem esse valor booleano para cada tecla. Estas variáveis podem ser acedidas através de métodos como isSpecialKeyDown. Assim, no exemplo anterior, faz muito mais sentido a cada ciclo da aplicação (ou seja, no método update(unsigned long elapsed_millis) da entidade), verificar se a tecla se encontra primida usando cg::KeyBuffer::instance()->isSpecialKeyDown e actuar de acordo com o resultado. Este mecanismo também permite trabalhar com combinações de teclas em simultâneo (até ao limite imposto pela GLUT). Finalmente, é importante notar que, neste caso, não é necessário implementar a interface cg::IKeyboardListener.