2013-02-03 8 views
7

画像をダイナミック/静的なボディに設定する際に問題があります。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に変換し、それについてのフラッシュコードを見つけ:( plzのいずれかが私を助けるか、JavaをBOX2Dについてのチュートリアルへのリンクを与えることができます。

+0

andengineやsmthのようなフレームワークを使用していますか? – Pavel

+0

は彼がLibGDXを使用しているように見えます – jellyfication

答えて

9

ロジックとレンダリングに関するbox2Dとlibgdxの教育の概念については、非常に便利なリンクがあります。 here

は、その後、あなたは、このようなレンダリング部分のロジック部を分離することができます:

ロジック部分:

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

はそれが役に立てば幸い!

+0

リンクが無効です – Zoe

5

あなたの質問があるので、 LibGDXとしてタグ付け、あなたがTU Spritesを使用するために。

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

、その後render()に、何かがあるかもしれないとても便利になります、このことは、適切な位置にスプライトを返す方法getImage()と体の周りのラッパークラス、回転を行うことが悪い考えではないでしょう

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

など

ノートのような、私は避難所」私のコードをテストしたが、エラーがある可能性があります。

+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

あなたのチップのために多くのthx、ありがとうございました。 –

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

重力のためスプライト遅れ、加速が、重力=ベクトル2(は0.0f、-1.1f)で正常に動作し、それは私がそれをしたい正確にどのようにです。

関連する問題