Najlepszy sposób na wykrycie dotkniętego obiektu (poruszającego się) z kolekcji w libgdx

To moja pierwsza próba stworzenia gry. Właśnie zacząłem eksperymentować z libgdx i rozumieć różne aspekty programowania gier. Przyjrzałem się przykładowym projektom, rozumiem ogólną architekturę gry libgdx. Ale aby zdobyć podstawy dynamiki gry, zacząłem grać z niskimi poziomami, takimi jak rysowanie prostych kształtów, jak je poruszać, jak radzić sobie z kolizjami.

Więc planowałem napisać martwą prostą grę na Androida (to nawet nie jest na pewno gra). To jest pomysł

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

Początkowo myślałem o wypróbowaniu koncepcji sceny i aktora libgdx, ale wykluczyłem to bez użycia API sceny. Zacząłem to eksperymentować z różnymi aspektami podstawowej gry i lepiej zrozumieć koncepcje libgdx. Więc stworzyłem tę prostą aplikację, jestem w stanie sprawić, że przedmioty będą przypadkowe.

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;

}

}

Ale nie mogłem znaleźć dotkniętego przedmiotu ze spadających przedmiotów. To właśnie robię, aby dowiedzieć się, czy pole jest w zasięgu dotkniętym

Zapętl wszystkie pola w tablicySprawdź, czy współrzędne dotyku należą do współrzędnych polaPodałem współrzędne dotykowecontains metodaRectangle (Box), aby to zrozumieć

coś takiego

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


    }

Ale to nie działa. Myślę, że zrozumiałem problem. Jego

Pudełko przesuwa 2 klatki na osi x każdej klatki, aby uzyskać efekt lataniaAle zakładam, że niektóre klatki minęły od zdarzenia dotyku. Dlatego nie uzyskuję oczekiwanego rezultatu

Moje pytania są

Jak rozwiązać ten problem?Jaki jest najlepszy sposób wykrywania kolizji w libgdx?

Aktualizacja

Widzę wiele niedopasowań między współrzędnymi dotyku i współrzędnymi pola. Żadne z pól w zasięgu dotyku. Hows that possible. Poniżej ślad próbki

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