Как нарисовать один и тот же спрайт в нескольких слоях объекта box2d.? - PullRequest
0 голосов
/ 24 октября 2018

Я работаю над игрой, это мой первый раз ... Я столкнулся с проблемой, которую не могу решить сам.Давайте перейдем к преследованию, у меня есть класс монет, он тянет монеты только к одному телу box2D, но в этом слое (который я сделал в плитке) у меня есть еще 1 тело, но монета появляется только в 1 из них, последнийодин.Я хочу, чтобы текстура монеты появлялась во всех слоях объектов, которые я определил для монет. Я также опубликую изображение, чтобы лучше понять мой вопрос. Код и изображение для монеты приведены ниже;

Изображение: https://ibb.co/nAoYFq

public class Coin extends Sprite{


protected PlayScreen screen;
private Body body;
private BodyDef bodyDef;
private FixtureDef fixtureDef;
private PolygonShape polygonShape;


public Coin(PlayScreen screen, World world,TiledMap map) {
super(screen.getAtlas().findRegion("Gold"));
this.screen = screen;
this.bodyDef = new BodyDef();
this.fixtureDef = new FixtureDef();
this.polygonShape = new PolygonShape();

TextureRegion coinTexture = new TextureRegion(getTexture(),0,0,64,64);
setBounds(0, 0, 84 / trollVersusZombies.PPM, 84 / trollVersusZombies.PPM);
setRegion(coinTexture);

for(MapObject mapObject: map.getLayers().get(6).getObjects().getByType(RectangleMapObject.class))
{
Rectangle rectangle = ((RectangleMapObject)mapObject).getRectangle();

bodyDef.type = BodyDef.BodyType.StaticBody;
bodyDef.position.set((rectangle.getX() + rectangle.getWidth() / 2)/ trollVersusZombies.PPM, (rectangle.getY() + rectangle.getHeight() / 2) / trollVersusZombies.PPM);

body = world.createBody(bodyDef);

polygonShape.setAsBox(rectangle.getWidth() / 2 / trollVersusZombies.PPM, rectangle.getHeight() / 2 / trollVersusZombies.PPM);
fixtureDef.shape = polygonShape;

fixtureDef.isSensor = true;
body.createFixture(fixtureDef);




}


}

public void update()
{
setPosition(body.getPosition().x - getWidth() / 2, body.getPosition().y - getHeight() / 2);

}
}

К вашему сведению:

В моем основном классе игрового экрана я объявил и создал экземпляр своего класса монет для передачи соответствующих параметров, а метод обновления класса монет вызывается в методе обновления основного игрового экрана.class, также в методе рендеринга класса playscreen, я назвал coin.draw (playscreen.batch), то есть;

public void update(float dt) {
//Other code...
coin.update();
}


public void render(float delta) {

//Other Code
gameScreen.batch.begin();
coin.draw(gameScreen.batch);
gameScreen.batch.end();
}

1 Ответ

0 голосов
/ 27 октября 2018

Проблема в том, что вы помещаете все созданные вами тела в 1 переменную.В результате в этой переменной сохраняется только последнее созданное тело.Вместо этого вы должны создать массив для хранения каждого созданного тела и нарисовать спрайт для каждой позиции тела.Если вы хотите использовать расширенный класс sprite, вам лучше создать отдельный объект 'Coin' для каждого тела, но с использованием одного и того же объекта области текстуры.И лучший способ - создать тела и области в отдельном классе, а не в конструкторе.

Пример (это псевдокод):

public class Main {
    private Array<Coin> coins = new Array<>();

    public void create(){
        TextureRegion region = assets.getAtlas().findRegion("Gold");
        for(MapObject mapObject : mapObjects){
            Body body = createBody(mapObject);
            Coin coin = new Coin(region, body)
            coins.add(coin);
        }
    }

    public void render(SpriteBatch batch){
        for(Coin coin : coins){
            coin.draw(batch);
        }
    }

    public Body createBody(MapObject mapObject){
        // here create body using map object
    }
}

public class Coin extends Sprite {

    private Body body;

    public Coin(TextureRegion region, Body body){
        super(region);
        this.body = body;
    }

    public void update(){
    // here update sprite position using body coordinates
    }
}

Надеюсь, это поможет!)

...