2014-03-05 16 views
5

Ich habe derzeit einen Körper erstellt, der dynamisch ist und bewegt sich mit einer konstanten Geschwindigkeit mit einem Vector2(). Was ich will ist, wenn der Körper den Rand des Bildschirms verlässt, um von diesem aktuellen Punkt sofort zu seinem ursprünglichen Punkt zurück zu kommen. Wie mache ich das?So ändern Sie die Position eines sich bewegenden Körpers - Box2D

a.applyForceToCenter(aMovement, true); 
    a.applyTorque(3000, true); 

    FixtureDef fDef = new FixtureDef(); 
    BodyDef ballD = new BodyDef(); 

    ballD.type = BodyType.DynamicBody; 

    //random location for asteroid 
    int aLoc = (int) (aLocation * 15); 
    float x = 300; 
    switch(aLoc) 
    { 
    case 0: 
     ballD.position.set(x, -105); 
     break; 
    case 1: 
     ballD.position.set(x, -95); 
     break; 
    case 2: 
     ballD.position.set(x, -80); 
     break; 
    case 3: 
     ballD.position.set(x, -65); 
     break; 
    case 4: 
     ballD.position.set(x, -50); 
     break; 
    case 5: 
     ballD.position.set(x, -35); 
     break; 
    case 6: 
     ballD.position.set(x, -20); 
     break; 
    case 7: 
     ballD.position.set(x, -5); 
     break; 
    case 8: 
     ballD.position.set(x, 10); 
     break; 
    case 9: 
     ballD.position.set(x, 25); 
     break; 
    case 10: 
     ballD.position.set(x, 40); 
     break; 
    case 11: 
     ballD.position.set(x, 55); 
     break; 
    case 12: 
     ballD.position.set(x, 70); 
     break; 
    case 13: 
     ballD.position.set(x, 85); 
     break; 
    default: 
     ballD.position.set(x, 0); 
    } 

    PolygonShape asteroid = new PolygonShape(); 
    asteroid.setAsBox(12.5f, 12.5f); 

    //asteroid definition 
    fDef.shape = asteroid; 
    fDef.density = .5f; 
    fDef.friction = .25f; 
    fDef.restitution = .75f; 

    a = world.createBody(ballD); 
    a.createFixture(fDef); 
    a.setFixedRotation(false); 

    //asteroid image 
    aSprite = new Sprite(new Texture("img/asteroid-icon.png")); 
    aSprite.setSize(12.5f * 4, 12.5f * 4); 
    aSprite.setOrigin(aSprite.getWidth()/2, aSprite.getHeight()/2); 
    a.setUserData(aSprite); 
    asteroid.dispose(); 

Antwort

2

Sie können die Position Ihrer Box2D a Körper sofort durch diese Methode gesetzt:

a.setTransform(new_x, new_y, new_angle);

Mit diesem können Sie eine Bedingung erstellen, die die x- und y-Position des Körpers setzt zurück zu seiner ursprünglichen Position, wenn der x- oder y-Wert des Körpers außerhalb des Bildschirms ist.

if(outsideBounds()){ 
    a.setTransform(start_x, start_y, start_angle); 
} 

können Sie überprüfen, ob Ihr Objekt entweder durch Überprüfung seiner Box2D Position und ihre umgewandelten Bildschirmkoordinaten offscreen ist, oder durch die Position des Sprites zu überprüfen.

Sobald Sie die x- und y-Bildschirmpositionen erhalten haben, können Sie sie auf dem Bildschirm Grenzen wie folgt vergleichen:

pos_x>screenWidth||pos_x<0||pos_y>screenHeight||pos_y<0

Dies kann, indem die Abmessungen des Objekts verbessert werden, je nachdem, wenn Sie die Transformation geschehen soll:

(pos_x-objWidth)>screenWidth || (pos_x+objWidth)<0 || 
(pos_y-objHeight)>screenHeight || (pos_y+objHeight)<0 
+0

Wie bekomme ich die Position des Körpers? – Mercify

+0

Sie können die Position 'Vector2' des Körpers durch' a.getPosition() 'erhalten. Weitere Informationen über LibGDX/Box2D-Körper finden Sie in diesem [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/physics/box2d/Body.html] Link. Wie in keiner Antwort erwähnt, kann die Verwendung von 'setTransform' zu Problemen führen. Verwenden Sie diese Methode also auf eigene Gefahr oder um Probleme zu vermeiden, folgen Sie niemandem und erstellen Sie den Körper neu. – user3312130

4

Sie Body.setTransform() für diese Aufgabe verwenden könnte, aber ich würde das nicht tun. setTransform() verursacht auf lange Sicht eine Menge Ärger.

Für mich führte es zu seltsamen Bugs. Zum Beispiel mit setTransform deaktiviert meine ContactFilter in zufälligen Momenten, die mich mehrere Tage Debugging kostete, bis ich das gefunden.

Darüber hinaus verursacht es nicht-physikalische Verhalten, weil Sie im Grunde die Body teleportieren.

Besser wäre es, die Body komplett zu zerstören und eine neue an der gleichen ursprünglichen Position der alten neu zu erstellen.

+0

Wie könnte ich das so machen wie ich will? Ich möchte, dass dies für immer geschieht, wenn der Asteroid sich über den Bildschirm bewegt und dann wieder an seinen ursprünglichen Platz zurückgelegt wird, um sich wieder zu bewegen. – Mercify

Verwandte Themen