2013-02-03 9 views
7

Ho un problema con l'impostazione di un'immagine in un corpo dinamico/statico.Libgdx Box2D che imposta un'immagine su un corpo

ho trovato un codice di lampeggio su di esso

public void setImage() 
{ 
    sprite = new B2Sprite(); 
    var bitmap:Bitmap = new Image(); 
    sprite.addChild(); 
    bitmap.x -= bitmap.width/2; 
    bitmap.y -= bitmap.height/2; 
    body.SetUserData(sprite); 
    sprite.body = body; 
} 

ma convertendolo in java :( plz uno può aiutare o dare link di tutorial su Box2D su Java.

+0

Si sta utilizzando un framework, ad esempio andina o smth? – Pavel

+0

sembra che stia usando LibGDX – jellyfication

risposta

9

Hai un link molto utile sui concetti di insegnamento di box2D e libgdx su logica e rendering. here

Quindi è possibile separare la parte logica della parte renda in questo modo:

parte Logic:

private void createBottleBody() { 
    // 0. Create a loader for the file saved from the editor. 
    BodyEditorLoader loader = new BodyEditorLoader(sourceFile); 

    // 1. Create a BodyDef, as usual. 
    BodyDef bd = new BodyDef(); 
    bd.position.set(0, 0); 
    bd.type = BodyType.DynamicBody; 

    // 2. Create a FixtureDef, as usual. 
    FixtureDef fd = new FixtureDef(); 
    fd.density = 1; 
    fd.friction = 0.5f; 
    fd.restitution = 0.3f; 

    // 3. Create a Body, as usual. 
    bottleModel = world.createBody(bd); 

    // 4. Create the body fixture automatically by using the loader. 
    loader.attachFixture(bottleModel, "test01", fd, BOTTLE_WIDTH); 
} 

Render parte:

public void render() { 
    Vector2 bottlePos = bottleModel.getPosition().sub(bottleModelOrigin); 

    bottleSprite.setPosition(bottlePos.x, bottlePos.y); 
    bottleSprite.setOrigin(bottleModelOrigin.x, bottleModelOrigin.y); 
    bottleSprite.setRotation(bottleModel.getAngle() * MathUtils.radiansToDegrees); 

    ... 
} 

Il caricatore: Nel link può trovare un caricatore.

public void attachFixture(Body body, String name, FixtureDef fd, float scale) { 

    //Load the rigidModel by key 
    RigidBodyModel rbModel = (RigidBodyModel) this.model.rigidBodies.get(name); 

    if (rbModel == null) 
     throw new RuntimeException("Name '" + name + "' was not found."); 

    //Loading polygons 
    Vector2 origin = this.vec.set(rbModel.origin).mul(scale); 
    Vector2[] vertexes; 
    PolygonModel polygon; 

    for (int i = rbModel.polygons.size()-1; 0 <= i; i--) { 
     polygon = (PolygonModel) rbModel.polygons.get(i); 
     vertexes = polygon.vectorBuffer; 

     //Loading vertexes (scaled) from polygon 
     for (int ii = vertexes.length-1; 0 <= ii; ii--) { 
      vertexes[ii] = new Vector2().set((Vector2) polygon.vertices.get(ii)).mul(scale); 
      vertexes[ii].sub(origin); 
     } 

     //sets vertexs to polygon 
     this.polygonShape.set(vertexes); 
     fd.shape = this.polygonShape; 
     body.createFixture(fd); 

    } 


    //Loading circles 
    CircleModel circle; 
    Vector2 center; 
    float radius; 

    for (int i = rbModel.circles.size()-1; 0 <= i; i--) { 
     circle = (CircleModel) rbModel.circles.get(i); 
     center = new Vector2().set(circle.center).mul(scale); 
     radius = circle.radius * scale; 

     this.circleShape.setPosition(center); 
     this.circleShape.setRadius(radius); 
     fd.shape = this.circleShape; 
     body.createFixture(fd); 

    } 
} 

E infine ... modelli

public static class CircleModel { 
    public final Vector2 center = new Vector2(); 
    public float radius; 
} 

public static class PolygonModel { 
    public final List<Vector2> vertices = new ArrayList<Vector2>(); 
    private Vector2[] vectorBuffer; 
} 

public static class RigidBodyModel { 
    public String name; 
    public String imagePath; 
    public final Vector2 origin = new Vector2(); 
    public final List<PolygonModel> polygons = new ArrayList<PolygonModel>(); 
    public final List<CircleModel> circles = new ArrayList<CircleModel>(); 
} 

public static class Model { 
    public final Map<String, RigidBodyModel> rigidBodies = new HashMap<String, RigidBodyModel>(); 
} 

Speranza che aiuta!

+0

Il link è morto – Zoe

5

Dal momento che la tua domanda è contrassegnati come LibGDX, sarebbe comoda per te tu usi Sprites.

public void setImage(Sprite sprite){ 
    body.setUserData(sprite); 
} 

poi nel render(), ci potrebbe essere qualcosa di Ti piace questa

private SpriteBatch batch = new SpriteBatch(); 
public void render() { 
    batch.begin(); 
    Iterator<Body> iter = world.getBodies(); 
    Body body; 
    Sprite sprite; 
    while (iter.hasNext()) { 
     body = iter.next(); 
     sprite = (Sprite) body.getUserData(); 
     // I did not take a look at implementation but you get the idea 
     sprite.x = body.x; 
     sprite.y = body.y; 
     sprite.draw(batch); 
    } 
    batch.end(); 
} 

Non sarebbe una cattiva idea di fare una classe wrapper intorno al corpo con il metodo getImage() che sarebbe tornato uno sprite con la posizione del caso, la rotazione, ecc

Si noti che, mi rifugio' t testato il mio codice, potrebbero esserci errori.

+0

xball = PIXELS_PER_METER * (theBall.getWorldCenter(). X) -sprite.getWidth()/2; \t \t yball = PIXELS_PER_METER * (theBall.getPosition(). Y) -sprite.getHeight()/2; \t \t \t \t batch_sprite.begin(); \t \t sprite.draw (batch_sprite); \t \t sprite.setX (xball); \t \t sprite.setY (yball); \t \t batch_sprite.end(); –

+0

grazie mille per la mancia, grazie signore. –

4
public void create() 
{texture = new Texture(Gdx.files.internal("data/ball.png")); 
sprite = new Sprite(texture,0,0,32,32); 
batch_sprite = new SpriteBatch(); 
..... 
} 
public void render() 
{ 
.... 
xball=PIXELS_PER_METER*(theBall.getWorldCenter().x)-sprite.getWidth()/2; 
yball=PIXELS_PER_METER*(theBall.getPosition().y)-sprite.getHeight()/2; 

batch_sprite.begin(); 
sprite.draw(batch_sprite); 
sprite.setX(xball); 
sprite.setY(yball); 
batch_sprite.end(); 
....} 

ritardo sprite a causa della forza di gravità, l'accelerazione, ma funziona bene con la gravità = Vector2 (0.0f, -1.1f) ed è esattamente come lo voglio.