Libgdx Box2D настройва изображение към тяло

Имам проблем с настройването на изображение към динамично/статично тяло.

намерих флаш код за това

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;
}

но конвертирането му в java :( моля, може ли някой да ми помогне или да даде връзки за уроци за box2D на java.


person Methnani Bilel    schedule 03.02.2013    source източник
comment
Използвате ли някаква рамка, като andengine или smth?   -  person Pavel    schedule 04.02.2013
comment
изглежда, че използва LibGDX   -  person jellyfication    schedule 04.02.2013


Отговори (3)


Имате много полезна връзка относно концепциите за преподаване на box2D и libgdx относно логиката и рендирането. тук

След това можете да отделите логическата част от частта за изобразяване по следния начин:

Логическа част:

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);
}

Рендиране на част:

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);

    ...
}

Товарачът: Във връзката можете да намерите товарач.

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);

    }
}

И накрая... модели

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>();
}

Дано помогне!

person Ricardo    schedule 15.04.2013
comment
Връзката е мъртва - person Zoe; 24.09.2017

Тъй като въпросът ви е маркиран като LibGDX, би било удобно да използвате Спрайтове.

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

тогава в render() може да има нещо подобно

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();  
}

Не би било лоша идея да направите обвиващ клас около тялото с метод getImage(), който да връща спрайт с подходяща позиция, ротация и т.н.

Имайте предвид, че не съм тествал кода си, възможно е да има грешки.

person jellyfication    schedule 04.02.2013
comment
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(); - person Methnani Bilel; 05.02.2013

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();
....}

забавяне на спрайта поради гравитацията, ускорението, но работи добре с гравитация = Vector2(0.0f, -1.1f) и точно така го искам.

person Methnani Bilel    schedule 04.02.2013