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 может любой помочь мне или дать ссылки для учебников о box2D на java.
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>();
}
надеюсь, что это помогает!
поскольку ваш вопрос помечен как 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()
это вернет спрайт с соответствующим положением, вращением и т. д.
обратите внимание, что я не тестировал свой код, могут быть ошибки.
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.0 f, -1.1 f), и это именно то, что я хочу.