Hirdetés

Új hozzászólás Aktív témák

  • fatal`
    titán

    Szerk: (#1084) hunfatal: Köszönöm, megnézem majd :K

    Még egy dolgot kérdeznék :K

    A collision detection eddig így volt megoldva:

    Iterator < Body > iter = raindrops.iterator();
    while (iter.hasNext()) {
    Body raindrop = iter.next();
    if (raindrop.y + 64 < 0) {
    dropped++;
    iter.remove();
    }
    if (raindrop.overlaps(bucket)) {
    dropSound.play();
    catched++;
    iter.remove();
    }
    }

    Amikor összeér a vödör és a csepp, akkor nagyon szépen eltűnt a csepp és lejátszotta a hangot.
    Ez amúgy a libgdx "Simple app" tutorialján alapszik, csak átalakítanám box2d-re (gravitáció, "szél" [x tengelyen gravitáció], box2dlight, stbstb miatt)

    Tehát beraktam ez helyett a box2d-s collision detection-t. így:

    Iterator < Body > iter = raindrops.iterator();
    while (iter.hasNext()) {
    Body raindrop = iter.next();

    world.setContactListener(new ContactListener() {

    @Override
    public void beginContact(Contact contact) {
    Fixture fixtureA = contact.getFixtureA();
    Fixture fixtureB = contact.getFixtureB();
    if ((String) fixtureA.getBody().getUserData() == "bucket" && (String) fixtureB.getBody().getUserData() == "drop" || (String) fixtureA.getBody().getUserData() == "drop" && (String) fixtureB.getBody().getUserData() == "bucket") {
    //csepp és vödör ütközik
    dropSound.play();
    catched++;
    iter.remove();

    }
    if ((String) fixtureA.getBody().getUserData() == "ground" && (String) fixtureB.getBody().getUserData() == "drop" || (String) fixtureA.getBody().getUserData() == "drop" && (String) fixtureB.getBody().getUserData() == "ground") {
    //csepp és föld ütközik
    dropped++;
    iter.remove();
    }
    }

    @Override
    public void endContact(Contact contact) {}

    @Override
    public void preSolve(Contact contact, Manifold oldManifold) {
    // TODO Auto-generated method stub

    }

    @Override
    public void postSolve(Contact contact, ContactImpulse impulse) {
    // TODO Auto-generated method stub

    }

    });
    }

    Viszont az iter.remove()-ra ezt a hibát dobja:

    "Cannot refer to a non-final variable iter inside an inner class defined in a different method"

    Ráraktam az iterátorra a "final" modifikációt, akkor nem hibázik, de amikor valami ütközik (csepp - talaj, csepp - vödör), akkor nem az tűnik el amelyik ütközött, hanem egy tök random.

    Értitek, hogy mit magyarázok? :D Tudok készíteni egy videót a dologról, ha kell.

    Köszönöm szépen előre is a segítséget! :R :R

    Ilyen esetben példányszintű változót használj és osztálynév.this.változónévként hivatkozz rá.

    Viszont nem itt. Contactlistenerben ne törölj physicsworld elemet, mert több, egyszeri ütközés elején crashelni fog az app.

    Egy másik osztályban állítsd be valamilyen flaggel, hogy melyik bodyt akarod törölni és a következő libgdx update ciklusban töröld ki a bodyt és állítsd vissza a flaget (hogy a következő updatenél ne próbálja meg törölni megint).

Új hozzászólás Aktív témák