sexta-feira, 9 de novembro de 2012

Activities, Assets e Resources

Olá a todos!!!

Neste post irei prosseguir as ideias do post anterior, dando um foco maior para o funcionamento do Android já para o desenvolvimento de jogos.

No post anterior falamos sobre como funciona a interface de criação de layouts e que essa interface cria códigos XML que estabelecem uma ponte dos elementos do layout para a API Java onde serão implementadas a lógica de cada elemento.

Cada um desses layouts XML fica na pasta Res juntamente com outros arquivos XML de configuração e com as imagens drawable, as quais já foram discutidas serem uma maneira de facilitar o processo de exibição de imagens de tamanhos diferentes para resoluções diferentes.

A pasta Assets, assim como a pasta Res, necessita de uma maneira de estabelecer relações diretas com a API Java para que possam ser referenciadas dentro do código. Ora quem faz esse trabalho tanto para Res quanto para Assets é o arquivo R.java. Esse arquivo é responsável por estabelecer a ligação entre o recurso e o Java. Felizmente, o Eclipse faz o trabalho sujo de atualizar esse arquivo sempre que um recurso ou asset é adicionado ou removido.

Entendida a forma como funcionam essas ligações, vamos entender como funciona uma aplicação no Java. Toda a lógica do Android é baseada em Atividades (Activity), ou seja, toda classe que deseje representar uma nova janela deverá extender esta classe.

A ponte entre uma Activity e outra é denominada Intent e representa a maneira como nos comunicamos  no momento da finalização de uma Activity e o início de outra. A classe que representa a mensagem entre activities é chamada de Bundle.

Cada Activity possui um ciclo de vida, e é de extrema importância levar em conta todo esse ciclo. Toda a vez que a aplicação é interrompida (quando o despertador toca, quando uma ligação é recebida pelo telefone, dentre outras razões), o método onPause() é chamado pelo Android. O mesmo acontece quando o usuário retorna à aplicação através do método onResume(). Métodos com onCreate() e onDestroy() informam, respectivamente, quando a Activity é criada e destruída.

Por hora é só. No próximo post estarei apresentando como o Android dá suporte aos eventos e como criamos surfaces de desenho para os jogos.

SEE YOU NEXT MISSION

quinta-feira, 8 de novembro de 2012

Android Básico

Olá a todos!!!

Hoje vou falar sobre como funciona o processo de desenvolvimento de aplicativos no Android.

Android é um Sistema Operacional móvel desenvolvido pela Google que roda sobre um núcleo Linux. Para desenvolver para esta plataforma existem duas maneiras. 

A primeira é utilizando a Android SDK e Java, e a segunda é utilizando a NDK. A primeira alternativa trás formas mais fáceis de chegar ao resultado desejado, já a segunda trás uma API nativa para desenvolvimento em C/C++ que se apresentam como uma alternativa mais otimizada e com acesso a recursos ofuscados pela SDK.

Criando-se um projeto no Eclipse usando a SDK, é possível perceber as seguintes pastas:
  • Assets: Pasta que conterá todos os arquivos externos extras ao jogo.
  • Res: Tem como objetivo armazenar os arquivos XML que são utilizados quando estamos trabalhando com Layouts. Também armazena as imagens da aplicação, mas é possível armazena-las dentro da pasta Assets. O interessante desta pasta é que, no caso de layouts, armazenam-se versões da mesma imagem de tamanhos diferentes em pastas diferentes, e assim o Android pode decidir de acordo com a resolução do aparelho qual imagem utilizar.
  • Src: Pasta que contém os arquivos .java. É importante ressaltar que o nome do package da aplicação deve ser único.


Para desenvolvermos uma aplicação com layout, basicamente temos que trabalhar com arquivos XML que deverão especificar os tipos e as características dos elementos de layout (buttom, image view, radio buttom,...). Além disso, esses arquivos deverão estabelecer a ponte entre o elemento e o código de sua lógica que será implementado nas classes java (bem ao estilo Pattern Observer). 

Observe abaixo na figura que, na parte esquerda temos alguns exemplos de componentes como uma TextView, CheckBox, RadioButton, Button, SelectBox, dentre outras... E para construir o layout basta arrastá-los para a tela preta, formando assim códigos XML que podem ser alterados nos layouts de configuração XML. Ainda é possível definir as propriedades de cada elemento, como tamanho, cor e quem será o listener do elemento.


Nesse post foquei em explicar basicamente como funciona a interface de criação de layouts. No próximo post estarei falando sobre como desenvolver uma aplicação do tipo jogo.

Até mais!

Android, emuladores e dispositivos externos

Olá a todos!!!

Neste post irei falar sobre a plataforma de desenvolvimento Android.

Em primeiro lugar, os emuladores. Para cada versão do Sistema Operacional, temos uma versão de emulador. Quando criamos o nosso projeto, especificamos qual será a versão de compatibilidade (versão mínima) e a versão do SO que desejaremos utilizar a API. Isso delimita o que podemos e o que não podemos usar no desenvolvimento da aplicação.

Um ponto a se considerar é a lentidão dos emuladores Android. Realmente é péssimo o desempenho no PC ou no MAC. Realizei testes com o jogo e outras aplicações durante o processo de desenvolvimento e pude constatar que a perda de FPS chegava a ser maior que a metade.

Também realizei os mesmos testes em um celular Samsung Galaxy Next (também conhecido como Samsung Galaxy Mini) e obtive uma performance um pouco maior, apesar deste dispositivo ter se mostrado não forte o suficiente para rodar o jogo tranquilamente em 30 FPS.

Por fim, realizei os testes em um tablet Genesis GT-7220 e obtive resultados bem satisfatórios, provando que os tablets possuem um desempenho mais interessante para jogos.

Todas estas comparações mostram a importância de se desenvolver com cuidado uma aplicação em Android, em especial um game. Recaptulando:

1- Desenvolver uma aplicação em Android é complexo, pois devemos estar constantemente tomando cuidado com as versões dos Sistemas Operacionais, tentando manter o mais multi-versão possível (compatível com várias versões do Sistema Operacional Android).

2- O hardware dos dispositivos que contém o Android são muito heterogêneos. Ou seja, deve-se ter atenção a tópicos como qual será a resolução empregada, como esse jogo se portará em dispositivos rápidos e lentos, e quais são os recursos extras que se deseja utilizar (nem todos os celulares tem teclado de botões por exemplo).

3- Para desenvolver um jogo, é importante ter um dispositivo externo, pois os emuladores de Android são terrívelmente lentos.


Nos próximos posts estarei falando sobre como é desenvolver aplicativos de Layout e jogos usando o Android e quais são as peculiaridades envolvidas.

Até mais!

Eclipse

Olá a todos!!!

Neste post irei falar sobre algumas peculiaridades que observei no período em que programei em Java usando o Eclipse. Gostaria de ter tido alguma experiência com o netbeans para poder oferecer uma comparação mais interessante entre os ambientes de desenvolvimento, mas infelizmente por hora só poderei oferecer as informações que obtive com a experiência.

O Eclipse foca muito nos recursos de facilitação da escrita do código de forma automática. É possível escrever de forma rápida e fácil simplesmente digitando parcialmente as palavras referentes ao comando ou classe e, com o pressionar de um ctrl + espaço, a IDE realiza o trabalho de auto-completar. Isso facilita enormemente o trabalho de passagem de parâmetros (o Eclipse auto-completa o nome dos parâmetros descritos na implementação do método), criação de estruturas, fechamento de chaves e parênteses e inclusão de packages.

Usando a inteligência de detecção de erros da ferramenta, é possível se programar "orientado a erros", escrevendo-se, por exemplo, variáveis, objetos e estruturas ainda não criadas e deixar que o Eclipse ofereça as opções disponíveis para corrigir o erro. A forma como ele detecta o tipo do objeto/variável que desejamos criar é também muito interessante.

Além deste recurso, alguns atalhos oferecidos também são muito úteis.Os que mais utilizei durante o desenvolvimento foram:

1- Command/CTRL + Shift + O: Encontra as packages que estão sendo usadas no projeto, mas que ainda não foram importadas e as inclui.

2- Command/CTRL + Shift + C: Comenta as áreas de código selecionadas.

3- Command/CTRL + Shift + F: Edenta automaticamente o código.


Por fim, gostaria de falar um pouco sobre o depurador do Eclipse. Confesso que tive certo preconceito ao iniciar a utilização do mesmo, pois grande parte dos ambientes de desenvolvimento possuem um depurador fraco se comparados ao do Visual Studio. Apesar disso, utilizei em excesso o depurador do Eclipse e consegui fiscalizar normalmente a compilação do código e os pontos de falha.
Além disso, usando o depurador no Android é possível controlar a aplicação pelo depurador em toda situação. Até mesmo quando fechamos o aplicativo, o depurador continua trabalhando. Quando paramos a depuração, o aplicativo também fecha, o que facilita o fechamento do programa quando o desejarmos.

No próximo post estarei falando sobre o meu processo de aprendizado com o Android.

Abraço!

Java

Olá a todos!!!

Nesse post irei falar sobre minha experiência com Java durante o período de desenvolvimento até então.

Em primeiro lugar, iniciei o estudo da linguagem Java e suas principais características. Até então não possuía uma experiência aprofundada com linguagens gerenciadas. Assim, percebi que o Java usa em grande quantidade os conceitos de Design Patterns que gostaria de reforçar neste projeto.

O primeiro aspecto que me chamou a atenção foi a forma como a linguagem trabalha para ser multiplataforma. O Java roda sobre uma Máquina Virtual (JVM), a qual tem como responsabilidade isolar o aplicativo do Sistema Operacional em questão. Após compilado, o código Java transforma-se em bytecode, sendo este  o código de máquina da JVM.

Esse bytecode, apesar de interessante, tem alguns problemas no que referem à facilidade de observá-lo e entender o código Java que está por trás dele. Isso torna o Java uma linguagem meio perigosa no quesito facilidade de engenharia reversa, e ofuscadores de código podem vir chegar a serem necessários para impedir essa leitura.

Com relação à linguagem, Java é mais fortemente tipado do que C++, o que acaba forçado a realizar casts para tudo. O operador ternário também exige uma variável para armazenar o retorno.

Também programando em Java passei a utilizar mais loops ao estilo foreach, e também achei interessante o caso dos LABELED LOOPS que aparentemente foram desenvolvidos para evitar a única possível necessidade de um goto em Java.

Com Java, passei a trabalhar pela primeira vez em um projeto envolvendo multithreads, e "felizes" foram os momentos em que eu descobri que um erro estava sendo causado pela ausência de um semáforo, o que me fez entender alguns casos críticos famosos de se trabalhar com multiplas threads.

Outro aspecto interessante da linguagem é a sua ausência de sobrecarga de operadores. É muito estranho trabalhar assim com certas classes matemáticas como matrizes e vetores, pois nada fica tão natural usando apenas métodos como ficaria usando os operadores.

Além disso, achei interessante a forma como Java trabalha com a diferença entre classes abstratas e interfaces. Utilizei muito de ambas para fortalecer os princípios de um bom código Orientado a Objetos. Muitas coisas na linguagem se fortalecem no princípio do uso de interfaces, como por exemplo tornar um objeto clonável.

Cada objeto criado em Java é filho de uma classe do tipo Object, a qual contém um método para impressão de dados (semelhante a uma sobrecarga de um operador << e >> em C++), métodos para facilitar o uso do objeto dentro de threads, dentre outros. Os métodos dessa classe também podem ser sobrescritos para que se programe o comportamento desejado.

Também me confundi em alguns momentos enquanto trabalhava com cópias, pois toda passagem de parâmetro em java trabalha por padrão com referências, necessitando de especificações mais braçais para que uma cópia efetiva do objeto seja efetuada.

O último aspecto da linguagem que gostaria de reforçar são as Inner Classes e Annonymous Inner Classes. Ambas as formas de implementação são estranhas à linguagem C++ com que eu estava habituado. 
Inner Classes são classes que criamos dentro de outras classes. Para criar objetos das mesmas é necessário ter acesso à classe que a contém, e de métodos factory para gerar objetos. 
Annonymous Inner Classes são classes que especificamos diretamente na passagem de um argumento que recebe uma classe contendo a implementação da interface ou classe abstrata. Isso possibilita que não necessitemos implementar uma classe que usaremos uma única vez em uma passagem de parâmetro

Bem, por hora é só. No proximo post estarei falando sobre a minha experiência com o compilador Eclipse, sendo este o segundo objetivo do trabalho com Android.

 SEE YOU NEXT MISSION

sábado, 1 de setembro de 2012

Organização das Atividades

Olá a todos!!!

Finalizei a organização das atividades do projeto para android. Elas podem ser encontradas no seguinte link:

https://www.pivotaltracker.com/projects/630789#

Agora para finalizar a etapa inicial do projeto resta somente a produção de um documento básico de Game Design. Estarei fazendo isso nas próximas horas...

 SEE YOU NEXT MISSION

quinta-feira, 30 de agosto de 2012

O Ceramic Destroyer

Olá a todos!!! 

Neste tópico estarei abordando as principais características do jogo que estarei tentando implementar - Ceramic Destroyer - para o Android. Para quem não conhece o jogo, segue abaixo um vídeo do mesmo


É importante ressaltar que esse jogo é free e pode ser baixado no Google Play de seu aparelho (desconheço versões para IOS e Windows Phone).

Os principais aspectos a serem considerados resumem-se na explosão da bomba, removendo uma área circular de píxels na imagem. Uma outra possibilidade de interpretação é a modificação dos valores do canal alpha para cada píxel atingido na área da explosão.

Também, cada bomba possui atributos de explosão diferentes, tornando a implementação um pouco mais desafiante em alguns casos.

Com relação à física, temos uma reflexão elástica com a parede e a desaceleração do projetil de acordo com a força que foi arremessado. Também temos uma colisão por bitmask, já que o projetil colide até mesmo com o mais singelo píxel da imagem (aspecto esse terrivelmente maldoso quando pensamos que é necessário explodir completamente a imagem para adquirir as 3 estrelas do level).


O meu escopo do projeto visa a concluir no mínimo as seguintes especificidades:

  • Aprender a linguagem Java;
  • Entender o compilador Eclipse;
  • Utilizar padrões de projeto;
  • Programar sistema de remoção de pixels para efeito de explosão circular;
  • Fazer o lançamento da bomba pelo projetil (envolve física);
  • Programar duas bombas diferentes;
  • Bolar um sistema de geração de partÌculas para as explosões;
  • Finalizar um level;
  • Ter um menu básico;
  • Possibilitar seleção de fase.


Esses pontos destacados podem ser claramente observados nos passos de desenvolvimento sugeridos no tópico anterior. (você pode acessá-los aqui).

Ainda no planejamento resta criar um documento de Game Design do projeto.

SEE YOU NEXT MISSION

Planejamento

Olá a todos!!!

O avanço na disciplina de programação de jogos para dispositivos móveis esta indo devagar e ainda não me sinto confortável o suficiente com a plataforma para iniciar o processo de desenvolvimento. Sendo assim, só me resta por enquanto preparar o terreno para quando estiver apto a iniciar o desenvolvimento de maneira sólida.

Para tal, estive me concentrando na documentação e no estudo dos Padrões de Projeto para agilizar o processo de desenvolvimento no futuro. Também tenho estudado mais timidamente a linguagem Java, sendo esta útil no desenvolvimento de aplicações para Android.

Irei me ater inicialmente ao desenvolvimento de um game para Android. O tema será semelhante ao jogo Ceramic Destroyer. 

Aqui é possível visualizar o cronograma da atividade. Para estimar os problemas, utilizei o Planning Poker, pois acho mais interessante do que o de pontos por função...

Em outro tópico estarei falando sobre cada fase, bem como do detalhamento deste projeto.

SEE YOU NEXT MISSION

sexta-feira, 24 de agosto de 2012

Hello Mobile!!!

Olá amigos!!!

Este blog foi criado com o intuito de gerar um postmortem sobre um projeto que tenho para com plataformas mobile.

O meu objetivo será o de gerar dois jogos:

- Um para a plataforma Android;
- Um para a plataforma IOS.

Ainda será necessário definir alguns aspectos essenciais ao projeto, mas de antemão o objetivo inicial é esse. Também é importante ressaltar que envolverei duas matérias da minha faculdade de Tecnologia em Jogos Digitais que estarei me envolvendo agora: Oficina de Desenvolvimento de Jogos IV e Programação de Jogos para Dispostivos Móveis...

Um aspecto interessante é que, diferente dos projetos que falei em meus outros blogs, este projeto está sendo iniciado junto com o blog. Ou seja, todas as postagens aqui apresentadas serão de primeira mão.

Para este projeto, utilizarei para produção da arte minha sempre companheira Keli!

Enfim, para uma postagem inicial eu paro por aqui. No próximos posts falarei sobre o planejamento dos games e cronograma dos mesmos.