Agora precisamos oferecer alguma iteração com o usuário, vamos criar os pads que nada mais são que BlockableEntities que mudam sua posição de acordo com o toque.
public class Pad extends BlockableEntity {
private int defaultDistanceFromAxis;
public Pad(Vector2D normal, int defaultDistance) {
super(new Rect(), normal);
this.defaultDistanceFromAxis = defaultDistance;
public void notifyMotionEvent(float x, float y) {
setBounds(new Rect((int) x - 150,
defaultDistanceFromAxis, (int) x + 150,
defaultDistanceFromAxis + 10))
// Do nothing, position is handled by events
Essa classe muda sua posição através do setBounds, precisamos notificá-la dos eventos que o usuário tocou na tela, nós podemos adicionar ela no PiecesManager, mas ainda temos que ter a referencia dela para delegar os eventos, como implementar uma AI está fora do escopo desse artigo, podemos usar o suporte multi-touch dos devices para moverem os Pads separadamente.
Primeiro, criamos as variáveis para guardar as referencias dos nossos pads.
private Pad northPad;
private Pad southPad;
Agora inicializamos ele no método init e adicionamos ao PiecesManager para aproveitar o desenho automatizado dos objetos do nosso jogo.
northPad = new Pad(new Vector2D(0, -1), 80); //80 é a distancia default do eixo, no caso desenhar no 80 de y
manager.addPiece(northPad);
southPad = new Pad(new Vector2D(0, 1), 944);//944 do y
manager.addPiece(southPad);
A maneira mais simples de ouvir os eventos de toque é sobrescrevendo o método onTouchEvent(MotionEvent evt) na nossa GameView, podemos sobrescreve-lo e delegar o x e o y para os nossos pads.
southPad.notifyMotionEvent(evt.getX(), evt.getY());
northPad.notifyMotionEvent(evt.getX(), evt.getY());
Desse modo o evento vai mover os dois pads na mesma direção.
Como Pad já é uma BlockableEntity a nossa bolinha irá bater nele do mesmo modo que nas paredes sem mais nenhuma alteração necessaria.
A maioria dos devices com Android agora tem suporte a multi-touch, e utiliza-lo também é simples. Mas precisamos de uma permissão especial para isso, basta adicionar a seguinte linha no AndroidManifest.XML
Agora voltamos ao nosso onTouchEvent e vamos verificar os toques de múltiplos usuários, isso é feito através dos métodos getX(int pointer) getY(int pointer). Como nossa aplicação não precisa exatamente se importar com qual dedo está se movendo para tal lugar, vamos apenas adicionar suporte para que qualquer toque em uma área da metade do campo mova o pad daquele lado.
for (int i = 0; i < evt.getPointerCount(); i++) {
float y = evt.getY(i);
if (y > 612)
southPad.notifyMotionEvent(evt.getX(i), evt.getY(i));
northPad.notifyMotionEvent(evt.getX(i), evt.getY(i));
Desse modo dois usuarios podem jogar tocando em uma area da tela.
O resultado até aqui:
Isso conclui nosso game de Pong, claramente é possível melhora-lo em vários aspectos e funcionalidades, mas até aqui já foi o suficiente para mostrar como fazer um jogo de Pong, a matematica envolvida e ainda como fazer isso no Android, espero que tenham aprendido mais sobre todas essas áreas.
Ainda é possivel utilizar aceleração nativa com OpenGL ES 2.0 no Android, mas isso é assunto para outro artigo.
Todo código da aplicação está disponível no repositório do AndroidTechsGames no github, com mais algumas alterações que fui implementando quando me sobrou tempo.