Relatório Técnico

 

1. Introdução

O propósito do projeto é desenvolver o jogo resta-um para um jogador. A metodologia utilizada para a realização do projeto é descrita no capítulo dois. Como ferramenta (capítulo 3) utilizamos a biblioteca pyOpenGL, que é o OpenGL para a lingüagem Python, para realizar a modelagem, movimento das peças e iluminação. Usamos o wxPython para o gerenciamento de janelas e o Boa Constructor como interfaceamento para a programação visual. No capítulo 4 estão descritos todas as inicializações de ambiente como, também, o uso do teclado e do mouse e início do jogo.
 
2. Ferramentas


Neste capítulo estão descritos todas as ferramentas utilizadas para desenvolvimento do projeto.

2.1. A Linguagem Python

A linguagem Python é uma linguagem de alto nível, interpretada, orientada a objetos, com uma semântica dinâmica. Sua estrutura de alto nível, combinadas com sua tipagem de amarração dinâmica a faz muito atrativa para o desenvolvimento de largos aplicativos, assim como para o uso como linguagem de script ou de colagem.

A sintaxe simples do Python encoraja a reutilização de código, simplificando a manutenção e a normalização de dados em módulos e pacotes distintos.

Esta linguagem, bem como seu código fonte, se encontra gratuitamente disponíveis na Internet [1], podendo ser vasculhados por qualquer interessado sem ônus algum. Apesar disto, a linguagem Python é marca registrada do Stichting Mathematisch Centrum de Amsterdam.

A linguagem Python foi desenvolvida pelo holandês Guido Van Rossun, no final de 1990. Segundo Van Rossum, a linguagem surgiu enquanto este passava o tempo entre o Natal de 1990 e o ano novo de 1991, mexendo na linguagem ABC, a qual ele havia participado do grupo que a desenvolvera. Já no começo de 1991, Van Rossum havia feito uma especificação bastante próxima a atual.

Hoje, a linguagem Python vem sendo utilizada por milhares de pessoas ao redor do mundo, sendo sustentada por uma fundação, a CNRI, e por um sem número de voluntários ao redor do mundo, unidos via Internet, formando a Python Software Activity (PSA). Neste momento [5], está sendo proposta a criação de um movimento chamado Python Consortium que tem por objetivo passar o fomento da linguagem para um pool de empresas e instituições de ensino e pesquisa. Esta proposta está sendo apresentada na Sétima Conferência Internacional da Linguagem Python que aconteceu em Novembro, em Houston, Texas.

O uso da linguagem Python se justifica neste trabalho devido a inúmeras vantagens. Seu uso é simples, mas ao mesmo tempo é uma linguagem de programação verdadeiramente poderosa, oferecendo muito mais estrutura e suporte para programas de grande porte. Por outro lado, ela também oferece muito mais checagem de erro do que o C, por exemplo, e, sendo uma linguagem de alto nível, possui tipos de dados de alto nível nativos, tais como arrays flexíveis e dicionários que custariam dias para se implementar eficientemente em C. Devido a seus tipos de dados mais gerais, a linguagem Python é aplicável a um domínio de problemas muito maior do que Awk ou até Perl, ainda que muitas coisas sejam tão fáceis no Python quanto são nestas linguagens.

Python permite que o programa seja dividido em módulos que podem ser reutilizados em outros programas Python. Ela vem com uma grande coleção de módulos padrão que podem ser utilizados como base para um novo programa – ou como exemplos para se começar a aprender a programar em Python. Existem também módulos nativos que provêm facilidades como I/O de arquivos, chamadas do sistema, e até interfaces com ferramentas de interface gráfica com o usuário, como o Tk e o wxPython.

Python é uma linguagem interpretada, o que pode economizar um tempo considerável durante o desenvolvimento do programa, porque nenhuma compilação e “linkagem” é necessária. O interpretador pode ser utilizado interativamente, o que torna fácil de se testar características da linguagem, de se escrever programas de rascunho, ou de se testar funções durante o desenvolvimento do aplicativo.

Além de todas estas características, no caso específico da programação para simulações computacionais, que exige muitas extensões e configurações, a linguagem Python, assim como outras linguagens interpretadas como Tcl ou Lua, proporciona facilidade e rapidez na extensão e configuração das aplicações, justamente pelo fato de ser interpretada, ou seja, compilada em tempo de execução. No caso da linguagem Python, a simplicidade da linguagem também facilita muito a extensão e configuração das aplicações.

2.2. Biblioteca PyOpenGL

Esta biblioteca tem as mesmas funcionalidades da biblioteca OpenGl para linguagem C, portanto o que muda é a instalação, as funções permanecem as mesmas.

OpenGL é um software de interface para hardware gráficos. Esta interface consiste em 150 comandos a serem utilizados para especificar objetos e operações necessárias a produção interativa de aplicações 3D. OpenGl foi feito para ser implementado em varias plataformas. Para conseguir esta qualidade, não existe comando de janelamento ou entrada de dados por usuário, a fim de que cada plataforma possa controlar estas tarefas. Da mesma forma, OpenGL não disponibiliza comandos de alto nível para modelagem de objetos 3D. Objetos complexos devem ser construídos a partir de primitiva geométricas simples (pontos, linhas, polígonos).

PyOpenGL é uma plataforma Python de transição, de código aberto, ligando a API padrão OpenGL e provendo a plotagem de gráficos 2-D e 3-D. PyOpenGL suporta as bibliotecas GL, GLU, GLE, e GLUT. A biblioteca pode ser usada com quase qualquer biblioteca de gerenciamento de janelas do Python que possa prover um contexto OpenGL. Atualmente as bibliotecas suportadas são: FXPy, pygame. Tkinter, win32gui, wxPython .

Todos os módulos do PyOpenGL estão contidos no pacote chamado “OpenGL”.

2.3. Biblioteca wxPython

Um dos “toolkits” de Interface Gráfica com o Usuário (GUI – Grafical User Interface) disponíveis para o Python é chamado wxPython [2]. A versão atual é praticamente nova ao cenário do Python e está rapidamente ganhando popularidade entre os desenvolvedores da linguagem. wxPython é um módulo de extensão do Python que encapsula a biblioteca de classe em C++ wxWindows.

wxWindows é um framework gratuito em C++ projetado para fazer da programação entre plataformas uma tarefa fácil. A versão wxWindows 2.0 suporta Windows 3.1/95/98/NT, Unix com GTK/Motif/Lesstif, e já existe uma versão para o Macintosh a caminho. Outras versões estão sendo consideradas.

wxWindows é um conjunto de bibliotecas que permite que aplicações C++ sejam compiladas e executadas em diversos tipos diferentes de computadores, com mudanças mínimas no código fonte. Existe uma biblioteca por GUI suportada (tais como Motif, ou Windows). Além de prover uma API (Application Programming Interface – Interface para Programação de Aplicação) comum para funcionalidade GUI, ela prove funcionalidade para o acesso de algumas facilidades do sistema operacional habitualmente utilizadas, tais como copiar ou deletar arquivos. wxWindows é uma framework no sentido em que fornece muitas funcionalidades nativas, as quais a aplicação pode utilizar ou trocar conforme a necessidade, portanto salvando uma grande quantidade de esforço de codificação. Estruturas básicas de dados tais como strings, listas encadeadas e tabelas hash também são suportadas.

Versões nativas de controles, caixas de diálogo, e outros tipos de janelas são utilizados nas plataformas que os suportam. Para outras plataformas, alternativas adequadas são criadas, utilizando-se o próprio wxWindows.

wxPython é um modulo de extensão do Python que fornece um conjunto de ligações da biblioteca wxWindows à linguagem Python. Em outras palavras, o módulo de extensão permite que os programadores criem instâncias das classes do wxWindows e invoquem métodos dessas classes.

2.4. IDE Boa Constructor

O Boa Constructor é um ambiente gráfico de desenvolvimento de GUI e código fonte Python. Ele oferece a manipulação e criação de frames visualmente, um inspetor de objetos, diversas vistas do código fonte como hierarquias de herança, métodos de objetos e propriedades, geradas em formato html a partir de strings de documentação, um debugger e um help integrado.

Ele é escrito em Python e utiliza o toolkit wxPython, que encapsula o wxWindows.

 
3. Inicialização do Ambiente

Para que possamos habilitar as rotinas de construção e manipulação dos nossos objetos na cena, devemos realizar algumas inicializações como: cor do fundo, modelo de iluminação, profundidade (z-buffer), propriedades dos materiais dos objetos, matrizes de transformação. Além dessas rotinas, deve ser definido as configurações para os dispositivos de entrada.
 
4. Modelagem do Tabuleiro e Peças


A modelagem dos peças (pinos) foi feita através do desenho de 6 superfícies de um mesmo tamanho, através da determinação dos vértices de cada polígono. O comando glVertex3f() permite definir os vértices e o GL_POLYGON permite o processamento desses vértices para a construção do polígono. A figura 1 mostra uma peça modelada.


Figura 1. Modelagem da Peça do jogo

As modelagens do tabuleiro e da posição das peças utilizam o mesmo procedimento que o das peças. O tabuleiro contém dez superfícies de modo a formar uma plataforma e as posições são superfícies construídas sobre esta plataforma de acordo com o seu tamanho (ver figura 2). É sobre esta estrutura que as peças são alocadas (figura 3).


Figura 2. O tabuleiro e as posições das peças


Figura 3. Peças sobre o desenho do tabuleiro e posições

 
5. Propriedades do Material


Os modelos não podem ser compostos apenas de sua geometria, pois a sua aparência dependerá também do tratamento de cor e textura a ser dada no material. Em nossos modelos utilizamos apenas cor através das propriedades do material. Para que tenhamos uma aparência mais realística em nossos modelos, devemos aplicar algumas propriedades de material são definidas através do comando glMaterial(). Este comando admite o controle da cor difusa, especular, emitida e brilho do material. Estas propriedades porém, são diretamente influenciadas pelo modelo de iluminação. Após a aplicação dessas propriedades em nossos modelos pudemos ter uma melhor apresentação dos objetos (ver figura 4).


Figura 4. Jogo com peças e aplicação das propriedades de material.

 
6. Iluminação do Ambiente

A iluminação é um fator determinante na criação de uma cena. A iluminação determinará quais partes serão mais visíveis ou menos visíveis, de acordo com o posicionamento, cor e alcance do ponto de luz sobre a cena. Através do comando glLightfv() definimos a posição, a componente difusa, a especular de cada ponto de luz em nossa cena. Em nosso caso colocamos quatro pontos de luz uma para cada diagonal do tabuleiro. O resultado pode ser visto na figura 4.
 
7. Seleção das Peças

O mecanismo de seleção permite que possamos selecionar objetos renderizados na tela. Para habilitar o mecanismo de seleção primeiro desenhamos a cena do frame buffer, entramos em modo de seleção e redesenhamos a cena. Entretanto ao entrarmos no modo de seleção o conteúdo do frame buffer não muda até que saiamos do modo de seleção. Quando saímos do modo de seleção o OpenGL nos retorna a lista de objetos que foram interceptados no volume de visualização. Cada objeto interceptado causa um hit. Este hit é um vetor contendo informações especificas do objeto selecionado. Uma dessas informações é o nome do objeto, que em nosso caso é o mapeamento linear das coordenadas da matriz de pinos. Assim, sabemos exatamente qual pino foi selecionado verificando seu nome em uma tabela.
 
8. Lógica do Jogo


A partir de uma matriz 9x9 definida com valores zero para as posições sem pino, um para as posições com pino e –1 para as posições inválidas (fora do jogo), definimos um movimento de peça através do LeftDown do mouse (posição inicial) e LeftUp (posição final). A rotina não permite que um pino se movimente na diagonal (variação em x e em y ao mesmo tempo). Sempre que há uma detecção de arraste é verificado se foi sobre um pino, caso tenha sido, é verificado se o local onde o pino é solto tem valor zero. O arraste não é valido se: já tem pino na posição que deseja soltar o mouse, valor do local –1, duas posições vazias foram puladas. Caso a posição seja válida, um pino é definido para a posição final e o pino pulado é retirado do tabuleiro. O jogador vence quando deixa apenas um pino no tabuleiro. A figura 5 mostra um jogo em andamento com alguns pinos já retirados e a figura 6 mostra um jogo terminado.



Figura 5. Jogo em andamento


Figura 6. Fim do jogo

 
9. Conclusão


A linguagem Python se mostrou eficaz e suficientemente robusta no desenvolvimento de aplicações gráficas utilizando a biblioteca OpenGL. Mesmo sem garantias iniciais de bom funcionamento de algumas de suas funções, investimos em sua utilização e ficamos satisfeitos com o resultado final, uma vez que todas as funções necessárias para implementação do jogo resta-um foram aplicadas com êxito.

Dadas às diferenças semânticas da linguagem Python em relação ao C, tivemos que adaptar os exemplos do Red Book para testarmos as diversas funcionalidades requisitadas pelo jogo, sem, com isso, necessitarmos mudar a lógica dos exemplos, o que é um ponto positivo entre as implementações das bibliotecas OpenGL e PyOpenGL.

Entretanto, visto que o Python não utiliza a representação de variáveis ponteiro, o mecanismo de seleção teve que ser adaptado para um vetor, dado que em sua versão para C, os ponteiros são usados largamente. Uma das dificuldades encontrada foi em relação à iluminação devido à necessidade de sincronização das propriedades do material com as propriedades dos pontos de luz para obtermos um aspecto satisfatório. A escolha dos parâmetros de reflexão difusa e especular foi feita de modo experimental, até encontrarmos uma aparência agradável.

 
Referências


1. Site oficial da linguagem Python. Online:http://www.python.org/ . 2002
2. Site oficial da linguagem wxPython. Online:http://www.wxpython.org/ . 2002
3. Site oficial da biblioteca PyOpenGL Online: http://pyopengl.sourceforge.net/ . 2002
4. Woo, M.,Neider J., Davis, T., “OpenGL Programming Guide”. Addison Wesley Developers Press. 1997.
5. Foley et al., “Computer Graphics: Principles and Pratice”. Addison Wesley. 1996

 

Voltar