Мой Box2D Body падает на немного при создании box2d libgdx

244
23 августа 2018, 04:20

Я создаю для практики игру арканоид. У меня есть родительский абстрактный класс GameObject для каждого спрайта в игре(Bat, Brick, Ball):

public abstract class GameObject extends Sprite {
    protected World world;
    protected Body body;
    public GameObject(Texture texture, float width, float height, Vector2 centerPosition, World world) {
        super(texture);
        this.world = world;
        setOrigin(width / 2, height / 2);
        setSize(width, height);
        setCenter(centerPosition.x, centerPosition.y);
        defineBody();
    }
    public void render(float delta) {
        setPosition(body.getPosition().x - getWidth() / 2, body.getPosition().y - getHeight() / 2);
        draw(batch);
    }
    protected abstract void defineBody();
    public Body getBody() {
        return body;
    }
}

Мой Bat:

public class Bat extends GameObject {
    public Bat(World world) {
        super(batTexture, BAT_WIDTH, BAT_HEIGHT, new Vector2(WORLD_WIDTH / 2, 5 + BAT_HEIGHT / 2), world);
    }
    public void moveLeft(float delta) {
        body.getPosition().set(-BAT_MOVEMENT_SPEED * delta, 0);
        checkForBoundaries();
    }
    public void moveRight(float delta) {
        translateX(BAT_MOVEMENT_SPEED * delta);
        checkForBoundaries();
    }
    private void checkForBoundaries() {
        if (body.getPosition().x - getWidth() / 2 < 0) setX(getWidth() / 2);
        else if (body.getPosition().x + getWidth() / 2 > WORLD_WIDTH) setX(WORLD_WIDTH - getWidth() / 2);
    }
    @Override
    protected void defineBody() {
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyDef.BodyType.StaticBody;
        bodyDef.position.set(getX() + getWidth() / 2, getY() + getHeight() / 2);
        body = world.createBody(bodyDef);
        FixtureDef fixtureDef = new FixtureDef();
        PolygonShape shape = new PolygonShape();
        shape.setAsBox(getWidth() / 2, getHeight() / 2);
        fixtureDef.shape = shape;
        fixtureDef.friction = 0;
        fixtureDef.density = 700;
        fixtureDef.restitution = 1;
        body.createFixture(fixtureDef);
    }
}

Мой Ball:

public class Ball extends GameObject {
    public Ball(World world) {
        super(ballTexture, BALL_RADIUS * 2, BALL_RADIUS * 2, new Vector2(WORLD_WIDTH / 2, BALL_Y), world);
    }
    @Override
    protected void defineBody() {
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyDef.BodyType.DynamicBody;
        bodyDef.position.set(getX() + getWidth() / 2, getOriginY() + getHeight() / 2);
        System.out.println("X: " + (getX() + getWidth() / 2) + " Y: " + (getY() + getHeight() / 2));
        body = world.createBody(bodyDef);
        System.out.println(bodyDef.position);
        System.out.println(body.getPosition());
        FixtureDef fixtureDef = new FixtureDef();
        CircleShape shape = new CircleShape();
        shape.setRadius(BALL_RADIUS);
        fixtureDef.shape = shape;
        fixtureDef.friction = 0;
        fixtureDef.density = 700;
        fixtureDef.restitution = 1;
        body.createFixture(fixtureDef);
    }
}

Bat правильно работает и отображается, но Ball падает при создании на 30ед:

До world.createBody() bodyDef.position: X: 200.0 Y: 50.0
После world.createBody() bodyDef.position: (200.0,20.0)
После world.createBody() body.getPosition(): (200.0,20.0)

Для ясности гравитация у моего world = 0 И если поднять начальное положение мяча допустим с 50 на 100, то все равно мячик падает на 30ед:

До world.createBody() bodyDef.position: X: 200.0 Y: 100.0
После world.createBody() bodyDef.position: (200.0,70.0)
После world.createBody() body.getPosition(): (200.0,70.0)
Answer 1

Решил. Проблема была в том что я случайно в Ball.defineBody() при задании позиции написал getOriginY() вместо getY()

READ ALSO
Сравнивание двух объектов

Сравнивание двух объектов

Имеется абсолютно рабочий класс с методом в котором сравниваются два объекта

250
Многопоточность в одном методе

Многопоточность в одном методе

Есть метод, который декомпресит файл, но этот процесс довольной долгий (а файлов 130+)Я решил реализовать это многопоточно

205
Данные в series

Данные в series

Нашёл пример круговой диаграммы написанной на javascript на сайте HighCharts:

268
Как Показать/скрыть div при выборе radio?

Как Показать/скрыть div при выборе radio?

Есть 2 radio "частное лицо" и "фирма"При выборе "фирма" мне надо показать поле для заполнения, а при выборе "частное лицо" это поле скрыть

232