LibGDX плавает с положением камеры, вызывая черные линии с мозаичной картой - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю шутер сверху вниз, и всякий раз, когда я перемещаю камеру или увеличиваю масштаб изображения, черные лайки выглядят как сетка image

Я использую Tiled для созданиякарта, и у меня есть камера, следующая за моим центрированным телом box2d.Я обнаружил, что при сопоставлении положения камеры с положением тела box2d с помощью целочисленного типа черные линии исчезают следующим образом: image

Проблема заключается в том, чтоУ меня игра уменьшена, игрок будет двигаться в течение секунды или двух, а затем, когда игрок достигает следующего целого числа на любой из осей, камера привязывается к игроку, а это не то, что я хочу для игры, поскольку это раздражает.Движение игрока гранулировано, но, в то время как округлено, движение камеры нет.Я не знаю, если это проблема с моим листом плитки, или я могу исправить это, изменив некоторый код.Я испробовал все виды комбинаций отступов, значений пробелов и полей.Итак, в конечном итоге, как я могу сделать так, чтобы камера плавно соответствовала положению игрока и не вызывала черных линий?Я был бы очень признателен за любую помощь или рекомендации.Заранее спасибо!

Там, где я пишу тип, разыгрываю плавающую позицию игрока в int в игровом классе:

    public void cameraUpdate(float delta) {

    //timeStep = 60 times a second, velocity iterations = 6, position iterations = 2
    world.step(1/60f, 6, 2); //tells game how many times per second for Box2d to make its calculations
    cam.position.x = (int)playerOne.b2body.getPosition().x;
    cam.position.y = (int)playerOne.b2body.getPosition().y;

    cam.update();
}

Большинство игроков класса:

public class PlayerOne extends Sprite implements Disposable{
public World world; // world player will live in
public Body b2body; //creates body for player
private BodyDef bdef = new BodyDef();
private float speed = 1f;
private boolean running;
TextureAtlas textureAtlas;
Sprite sprite;
TextureRegion textureRegion;
private Sound runningSound;



public PlayerOne(World world) {
    this.world = world;
    definePlayer();
    textureAtlas = new TextureAtlas(Gdx.files.internal("sprites/TDPlayer.atlas"));
    textureRegion = textureAtlas.findRegion("TDPlayer");
    sprite =new Sprite(new Texture("sprites/TDPlayer.png"));
    sprite.setOrigin((sprite.getWidth() / 2) / DunGun.PPM, (float) ((sprite.getHeight() / 2) / DunGun.PPM - .08));
    runningSound = Gdx.audio.newSound(Gdx.files.internal("sound effects/running.mp3"));

}


public void definePlayer() {
    //define player body
    bdef.position.set(750 / DunGun.PPM, 400 / DunGun.PPM);

    bdef.type = BodyDef.BodyType.DynamicBody;
    //create body in the world
    b2body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    CircleShape shape = new CircleShape();
    shape.setRadius(12 / DunGun.PPM);

    fdef.shape = shape;
    b2body.createFixture(fdef);
}

public void renderSprite(SpriteBatch batch) {
    float posX = b2body.getPosition().x;
    float posY = b2body.getPosition().y;
    float posX2 = (float) (posX - .14);
    float posY2 = (float) (posY - .1);
    sprite.setSize(32 / DunGun.PPM, 32 / DunGun.PPM);
    sprite.setPosition(posX2, posY2);
    float mouseX = Level1.mouse_position.x; //grabs cam.unproject x vector value
    float mouseY = Level1.mouse_position.y; //grabs cam.unproject y vector value

    float angle = MathUtils.atan2(mouseY - getY(), mouseX - getX()) * MathUtils.radDeg; //find the distance between mouse and player

    angle = angle - 90; //makes it a full 360 degrees
    if (angle < 0) {
        angle += 360 ;
    }
    float angle2 = MathUtils.atan2(mouseY - getY(), mouseX - getX()); //get distance between mouse and player in radians
    b2body.setTransform(b2body.getPosition().x, b2body.getPosition().y, angle2); //sets the position of the body to the position of the body and implements rotation
    sprite.setRotation(angle); //rotates sprite
    sprite.draw(batch); //draws sprite
    }

public void handleInput(float delta) {
    setPosition(b2body.getPosition().x - getWidth() / 2, b2body.getPosition().y - getHeight() / 2 + (5 / DunGun.PPM));

    this.b2body.setLinearVelocity(0, 0);

    if(Gdx.input.isKeyPressed(Input.Keys.W)){
        this.b2body.setLinearVelocity(0f, speed);
    }if(Gdx.input.isKeyPressed(Input.Keys.S)){
        this.b2body.setLinearVelocity(0f, -speed);
    }if(Gdx.input.isKeyPressed(Input.Keys.A)){
        this.b2body.setLinearVelocity(-speed, 0f);

    }if(Gdx.input.isKeyPressed(Input.Keys.D)){
        this.b2body.setLinearVelocity(speed, 0f);

    }if(Gdx.input.isKeyPressed(Input.Keys.W) && Gdx.input.isKeyPressed(Input.Keys.A)){
        this.b2body.setLinearVelocity(-speed, speed);

    }if(Gdx.input.isKeyPressed(Input.Keys.W) && Gdx.input.isKeyPressed(Input.Keys.D)){
        this.b2body.setLinearVelocity(speed, speed);
    }
    if(Gdx.input.isKeyPressed(Input.Keys.S) && Gdx.input.isKeyPressed(Input.Keys.A)){
        this.b2body.setLinearVelocity(-speed, -speed );

    }if(Gdx.input.isKeyPressed(Input.Keys.S) && Gdx.input.isKeyPressed(Input.Keys.D)){
        this.b2body.setLinearVelocity(speed, -speed);
    } 

Где я объявляю количество пикселей на метр шкалы:

public class DunGun extends Game{
public SpriteBatch batch;
//Virtual Screen size and Box2D Scale(Pixels Per Meter)
public static final int V_WIDTH = 1500;
public static final int V_HEIGHT = 800;
public static final float PPM = 100; //Pixels Per Meter

Методы рендеринга и изменения размера игры:

    @Override
public void render(float delta) {
    cameraUpdate(delta);
    playerOne.handleInput(delta);
    //clears screen
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    if (Gdx.input.isButtonPressed(Input.Buttons.LEFT)) {
        cam.zoom -= .01;

    }
    if (Gdx.input.isButtonPressed(Input.Buttons.RIGHT)) {
        cam.zoom += .01;

    }


    mapRenderer.render();
    b2dr.render(world, cam.combined); //renders the Box2d world

    mapRenderer.setView(cam);
    //render our game map
    //mapRenderer.render(); // renders map
    //mapRenderer.render(layerBackround); //renders layer in Tiled that p1 covers
    game.batch.setProjectionMatrix(cam.combined); //keeps player sprite from doing weird out of sync movement

    mouse_position.set(Gdx.input.getX(), Gdx.input.getY(), 0);
    cam.unproject(mouse_position); //gets mouse coordinates within viewport
    game.batch.begin(); //starts sprite spriteBatch

    playerOne.renderSprite(game.batch);

    game.batch.end(); //starts sprite spriteBatch
    //mapRenderer.render(layerAfterBackground); //renders layer of Tiled that hides p1
}


@Override
public void resize(int width, int height) {
    viewport.update(width, height, true); //updates the viewport camera
}

1 Ответ

0 голосов
/ 24 ноября 2018

Я решил это, поигравшись с отступами наборов плиток в GDX Texture Packer.Я добавил 5 пикселей отступов вокруг плиток 32х32.Я установил поля на 2, а интервал на 4 в Tiled.Я пробовал много разных комбинаций отступов / интервалов / полей, которые не работали, что заставляло меня думать, что это проблема кодирования, но эти настройки работали, и мне не пришлось округлять поплавки.

...