Libgdx Box2D creates an image for the body

I have a problem setting the image to a dynamic / static body.

I found flash code about it

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

but converting it to java :( plz can someone help me or give links to tutorials about box2D in java.

+7
source share
3 answers

You have a very useful link about box2D and libgdx learning concepts about logic and rendering. here

Then you can split the logical part of the rendering part as follows:

The logical part:

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

Part of rendering:

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

Loader: you can find the loader from the link.

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

And finally ... models

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

Hope this helps!

+9
source

Since your question is marked as LibGDX, it would be convenient for you to use Sprites .

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

then in render() might be something like this

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

It is a good idea to create a wrapper class around the body using the getImage() method, which will return the sprite with the appropriate position, rotation, etc.

Please note that I have not tested my code, there may be errors.

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

sprite delay due to gravity, acceleration, but works fine with gravity = Vector2 (0.0f, -1.1f) and exactly the way I want it.

+4
source

All Articles