Der beste Weg, um das berührte Objekt (das sich bewegt) aus der Sammlung in libgdx zu erkennen

Dies ist mein erster Versuch in der Spieleentwicklung. Ich habe gerade angefangen, mit libgdx zu experimentieren und die verschiedenen Aspekte der Spielprogrammierung zu verstehen. Ich habe mir die Beispielprojekte angesehen und kann die Gesamtarchitektur des libgdx-Spiels verstehen. Aber um die Grundlagen der Spieldynamik zu erlernen, begann ich mit einfachen Dingen zu spielen, wie man einfache Formen zeichnet, wie man sie bewegt, wie man mit Kollisionen umgeht.

Also plante ich, ein einfaches Android-Spiel zu schreiben (es ist nicht einmal ein Spiel, das sicher ist). Das ist die Idee

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

Anfangs dachte ich daran, libgdx stage & actor concept auszuprobieren, schloss dies jedoch aus, um auf die Szenen-API zu verzichten. Und ich habe damit begonnen, mit verschiedenen Aspekten des grundlegenden Spielens zu experimentieren und die Konzepte hinter libgdx besser zu verstehen. Also habe ich diese einfache App gemacht, mit der ich Objekte zufällig fallen lassen kann.

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;

}

}

Aber ich konnte den berührten Gegenstand nicht an den herabfallenden Gegenständen erkennen. Dies ist, was ich mache, um herauszufinden, ob die Box in Reichweite berührt wird

Durchlaufen Sie alle Felder im ArrayÜberprüfen Sie, ob die Berührungskoordinaten innerhalb der Boxkoordinaten liegenIch habe Berührungskoordinaten an übergebencontains Methode derRectangle (Box), um das herauszufinden

etwas wie das

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


    }

Aber es funktioniert nicht. Ich denke, ich habe das Problem herausgefunden. Es ist

Die Box bewegt sich in jedem Frame um 2 Pixel in der x-Achse, um einen fliegenden Effekt zu erzielenAber ich gehe davon aus, dass einige Frames seit dem Berührungsereignis vergangen sind. Deshalb erhalte ich nicht das erwartete Ergebnis

Meine Fragen sind

Wie kann man dieses Problem lösen?Was ist der beste Weg, um Kollisionen in libgdx zu erkennen?

Aktualisieren

Ich sehe viele Unstimmigkeiten zwischen den Berührungskoordinaten und den Boxkoordinaten. Keine der Boxen im Touch-Bereich. Wie ist das möglich? Unterhalb der Probenspur

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage