Melhor maneira de detectar o objeto tocado (em movimento) da coleção na libgdx

Esta é minha primeira tentativa no desenvolvimento de jogos. Eu comecei a experimentar a libgdx e entender os diferentes aspectos da programação de jogos. Eu olhei para os projetos de exemplo, eu posso entender a arquitetura geral do jogo libgdx. Mas, para me apegar aos fundamentos da dinâmica do jogo, comecei a jogar com coisas de baixo nível, como desenhar formas simples, como movê-las, como lidar com colisões assim.

Então eu planejei escrever um jogo android morto simples (não é mesmo um jogo com certeza). Essa é a ideia

1. Create random shapes and make it fly (move)
2. When user touches the shape, it ll explode or hide or play simple animation
3. Has to show Hit & Miss count

Inicialmente eu pensei em tentar usar o conceito de estágio e ator da libgdx, mas descartou que não haveria a API de cena. E comecei isso para experimentar diferentes aspectos do jogo básico e entender melhor os conceitos por trás do libgdx. Então eu fiz este aplicativo simples, eu sou capaz de fazer objetos cair aleatoriamente.

public class A1GameScreen implements Screen {

    OrthographicCamera camera;
    ShapeRenderer debugRenderer = new ShapeRenderer();
    Array<Rectangle> boxes;   
    long lastFlew;
    int fliesCaught;

    A1GameScreen(){

         camera = new OrthographicCamera();
         camera.setToOrtho(false, 800, 480);       
         boxes=new Array<Rectangle>();
         throwboxes();
    }
@Override
public void render(float delta) {

    Gdx.gl.glClearColor(0, 0, 0.2f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);


          camera.update();


    debugRenderer.setProjectionMatrix(camera.combined);
    debugRenderer.begin(ShapeType.Line);

    for (Rectangle fly : boxes) {
        debugRenderer.rect(fly.x, fly.y, fly.width, fly.height);
    }
    debugRenderer.end();

    //Handle the user input

    if (Gdx.input.isTouched()){          
        hit(Gdx.input.getX(),Gdx.input.getY());
    }

    if (TimeUtils.nanoTime() - lastFlew > 1000000000)
        throwboxes();


    Iterator<Rectangle> iter = boxes.iterator();
    while (iter.hasNext()) {
        Rectangle fly = iter.next();        
        fly.x -= 2;
        if (fly.x + 32 < 0)
            iter.remove();

    }

}

//Method to create flies at random interval
private void throwBoxes(){

    Rectangle fly = new Rectangle();
    fly.y = MathUtils.random(0, 480 - 32);
    fly.x = 800;
    fly.width = 32;
    fly.height = 32;
    boxes.add(fly);

    lastFlew = TimeUtils.nanoTime();

}

private boolean hit (float x, float y) {
    boolean found=false;

    for (Rectangle fly : boxes) {
        found = fly.contains(x,y);
        if (found){
            found = true;
            fly.width=100;
            break;
        }


    }

    return found;

}

}

Mas eu não consegui descobrir o item tocado dos objetos que caem. Isto é o que eu estou fazendo para descobrir se a caixa está em alcance tocado

Fazer um loop por todas as caixas da matrizVerifique se as coordenadas de toque estão dentro das coordenadas da caixaEu passei por coordenadas de toque paracontains método doRectangle (Caixa) para descobrir que

algo assim

  for (Rectangle fly : boxes) {
        found = fly.contains(x,y);
        if (found){
            found = true;
            fly.width=100;
            break;
        }


    }

Mas não está funcionando. Eu acho que percebi o problema. Está

Caixa está se movendo 2px no eixo x cada quadro, para fazer efeito voadorMas suponho que alguns quadros tenham passado desde o evento de toque. É por isso que não estou obtendo o resultado esperado

Minhas perguntas são

Como resolver este problema?Qual é a melhor maneira de detectar colisões na libgdx?

Atualizar

Eu vejo muito descompasso entre as coordenadas de toque e as coordenadas de caixa. Nenhuma das caixas no intervalo de toque. Como isso é possível. Abaixo do rastreio de amostra

Touch coords: x-651.0 y-362.0

Fly coords: x-384.0 y-277.0
Fly coords: x-504.0 y-34.0
Fly coords: x-624.0 y-103.0
Fly coords: x-744.0 y-238.0



Touch coords: x-441.0 y-193.0

Fly coords: x-52.0 y-34.0
Fly coords: x-172.0 y-103.0
Fly coords: x-292.0 y-238.0
Fly coords: x-414.0 y-261.0
Fly coords: x-534.0 y-109.0
Fly coords: x-656.0 y-283.0
Fly coords: x-776.0 y-323.0


Touch coords: x-568.0 y-162.0

Fly coords: x-42.0 y-267.0
Fly coords: x-162.0 y-166.0
Fly coords: x-282.0 y-266.0
Fly coords: x-404.0 y-52.0
Fly coords: x-526.0 y-296.0
Fly coords: x-646.0 y-64.0
Fly coords: x-766.0 y-16.0

questionAnswers(2)

yourAnswerToTheQuestion