8 de fev de 2016

Um jogo em JavaFX

Há uns meses atrás eu falei sobre jogos para JavaFX e prometi me aprofundar no tema, mas infelizmente o tempo está muito curto e resolvi encurtar a série postando a tradução de um artigo que escrevi para meu blog em inglês, o FXApps: Stacker Game in JavaFX.

O jogo Stacker


O objetivo do jogo Stacker (empilhador)é chegar até o topo empilhando tijolinhos. Em shoppings, há uma versão desse jogo na qual quando se chega no topo você ganha brindes. Vejam esse vídeo do jogo que eu achei no youtube:



O jogo que vou mostrar aqui é um pouco diferente. Iremos amontoar somente um retângulo, mas o retângulo pode estar próximo ao retângulo de baixo, não exatamente no topo dele. O número de retângulos para preencher e a velocidade vão aumentar de acordo com o nível do jogo.


O jogo em Processing 

O jogo foi anteriormente criado em Processing, mas a maioria do código eu pude reusar na versão em JavaFX!
Você pode encontrar a versão do jogo em processing no meu github.
Stacker


Criando jogos em JavaFX


Como já falei em uma postagem anterior, JavaFX é uma  boa plataforma para jogos desde sua versão 1.0. Existia até um blog específico para jogos com JavaFX Script e temos também alguns exemplos que podem ser baixados no site da Oracle. 
Como já sabemos, JavaFX tem todos os recursos para criamos jogos: animações, detecção de colisão, efeitos especiais, tocar sons, etc.

Nossa implementação do Stacker Game


O jogo é basicamente baseado na atualização de uma matriz booleana e na leitura da mesma para criar uma representação visual. Quando o usuário clica no jogo, nós fazer um loop na matriz para verificar se a linha anterior é true ou se o bloco atual (o que se mexe) está adjacente a um bloco na linha anterior.
As duas classes mais importantes no nosso programa é a GameEngine  e Game em sí. A classe game engine é responsável em fazer o jogo à vida, pois ela irá fazer o jogo atualizar a tela numa determinada frequência e fazer ele se desenhar.
O jogo é responsabilizado a desenhar e atualizar o cenário de acordo com o tempo e a entrada do usuário. Aqui está o código dessas duas classes:

Essas classes não fazem nada! Precisamos criar as classes concretas, então criamos a classe StackerGame que contém a matriz que representa o jogo e desenhará a grade e os retângulos de acordo com o tempo, nível e a entrada do usuário.
A lógica do jogo é basicamente mover um booleano na matriz e ajustar isso qunado o usuário clica. Se o clique do usuário foi feito quando o retângulo tem um bloco abaixo ou adjancente, o jogo vai continuar. Se não, iremos chamar o fim do jogo e quando o usuário clicar again, o jogo vai recomeçar. Note que a pontua;áo do jogo é maior quando o usuário faz uma pilha perfeita e menor se o usuário faz a pilha usando um bloco adjacente.O jogo é desenhado em um canvas, que facilita o controle no nosso caso(que estamos vindo do Processing!).
Notem que nós expomos algumas variáveis usando propriedade JaavaFX. Essas propriedades são usadas em nossa aplicação principal para mostrar a pontuação, nível e eventualmente o label de fim de jogo. Veja o código dessas duas classes:

Por fim, veja o jogo em ação:

16 de jan de 2016

Aplicações do "mundo real" com JavaFX

Esse é um blog mais direcionado à aprendizagem do JavaFX, no entanto, muitos perguntam como ficaria uma aplicação JavaFX em produção, para usuários finais.

Vivemos em tempos que o desenvolvimento somente desktop não tem um mercado tão atraente como há alguns anos, por essa razão, os desenvolvedores JavaFX desenvolveram ferramentas e técnicas para executar a ferramenta em diversos aparelhos, como em celulares ou no próprio navegador. A maioria dos vídeos que estão na lista abaixo, no entanto, demonstram JavaFX no desktop para diversas empresas grandes. Caso queiram ter uma ideia de como essa ferramenta é usada em desktop no mundo real, vejam essa série e aproveitem para ter ideias para as suas próprias aplicações!


29 de nov de 2015

Buscando nós filhos de um Node usando seletores CSS

Nessa postagem vamos fala sobre como retornar os filhos de um classe Node.

Como já falamos aqui, tudo que está em uma aplicação JavaFX é um Node (nó): botões, labels, tabelas, organizadores de leiaute e por aí vai. Alguns desses nodes têm filhos. É o caso do Group, VBox, HBox e outros organizadores de leiaute.

Uma dúvida comum, inclusive perguntada nessa postagem do JavaFree, é sobre como podemos buscar os elementos filhos sem sair fazendo for  e ir lendo elemento por elemento, testar seus atributos e assim achar o que procura. Há outras formas! E a melhor forma é usando o método lookup e lookupAllVamos falar sobre eles hoje!

Seletores CSS


Para usar os métodos acima, devemos usar seletores CSS através de uma String. Para entender melhor, vejam esse artigo do W3 Schools e a ferramenta que eles indicam para testar os seletores. 
Basicamente os selectores são formas de buscar alguma coisa usando uma linguagem simples de representação dos elementos. Por exemplo, se quisermos buscar algum nó pelo seu ID, usamos #ID, onde ID é o ID que se pretende buscar. Há também possibilidades de buscar pela classe do elemento, por valores de seus atributos e por aí vai. Sugiro a leitura do artigo da W3 Schools para melhor entender ou buscar on google alguma fonte em português (o motivo de "linkar" W3 Schools é a confiabilidade e estabilidade do recurso).
O fato é que o seletor CSS muitas vezes retorna vários resultados, pois podemos usar coringas (símbolos especiais que representam um ou mais elementos, como o "*", que representa tudo) ou há vários Nodes que batem com aquela busca. 

lookup e lookupAll


Esse são os dois métodos da classe node que podemos usar para buscar seus filhinhos. A principal diferença entre ele é que o lookup retorna sempre um resultado que corresponde aquela busca e o lookupAll retorna todos os elementos que correspondem a busca em um java.util.Set(uma collection do Java que não permite que os elementos se repitam, sendo sempre únicos). Se nenhum nó filho corresponde à busca usando lookup, o retorno é nulo, já com o lookupAll, o retorno é um Set vazio.

Muito papo né? Vamos fazer um código de exemplo!


Exemplo usando lookupAll


Agora vamos para o nosso código que é uma "aplicaçãozinha" que permite fazer a busca de Labels que estão em uma VBox. Se um ou mais labels correspondem a busca, eles ficam grande, se nenhum corresponder a busca, a gente informa usando um dialog. Vejam uma imagem da nossa APP:




Agora vejam o código no github e em seguida uma explicação. Notem o uso de Stream, assim sugerimos fortemente que leiam a série de artigos sobre Java 8 de um colega aí ;)

Por fim, eu gravei  um vídeo rapidão.




Conclusão


Mostramos o uso dos métodos lookup e lookupAll da classe node. É muito fácil fazer busca de elementos no JavaFX :-) 

25 de nov de 2015

Rapidinha: Cliente para o jBPM usando JavaFX

Recentemente eu escrevi um artigo para o Master the Boss para mostrar o uso  API remota do jBPM/BPM Suite. Para testar o que escrevi lá, eu também criei uma aplicação simples em JavaFX para lembrar os tempos antigos, onde eu criava aplicações em JavaFX diariamente :-)

A aplicação que eu criei foi realmente simples, seguem algumas imagens:



Essa aplicação simples permite um usuário seguir os passos de um process comercial usando a API remota, que são: iniciar um processo, gerenciar tarefas humanas, ler variáveis de um processo e o histórico de execução do processo. Segue o diagrama do process que eu estou mencionando:



Abaixo você pode ver um vídeo da aplicação acessando o JBoss jBPM:



Isso foi criado em menos de uma hora e você pode ver o código completo no github.