Java 带有摄影机位置的LibGDX浮动导致带有平铺贴图的黑线

Java 带有摄影机位置的LibGDX浮动导致带有平铺贴图的黑线,java,libgdx,Java,Libgdx,我正在创建一个自上而下的射击游戏,每当我移动相机或变焦时,黑色的物体就会像网格一样出现 我正在使用“平铺”来创建贴图,我的相机跟随我居中的box2d身体。我发现,使摄影机位置与具有int cast的box2d主体位置相等会导致黑线消失,如下所示: 但问题是,因为我缩小了游戏的规模,玩家会移动一两秒钟,然后当玩家到达任意一个轴上的下一个整数时,相机会捕捉到玩家,这不是我想要的游戏,因为它发出刺耳的声音。玩家的动作是颗粒状的,但相机的动作不是圆形的。我不知道这是否是我的瓷砖表的问题,或者是我可以通过

我正在创建一个自上而下的射击游戏,每当我移动相机或变焦时,黑色的物体就会像网格一样出现

我正在使用“平铺”来创建贴图,我的相机跟随我居中的box2d身体。我发现,使摄影机位置与具有int cast的box2d主体位置相等会导致黑线消失,如下所示:

但问题是,因为我缩小了游戏的规模,玩家会移动一两秒钟,然后当玩家到达任意一个轴上的下一个整数时,相机会捕捉到玩家,这不是我想要的游戏,因为它发出刺耳的声音。玩家的动作是颗粒状的,但相机的动作不是圆形的。我不知道这是否是我的瓷砖表的问题,或者是我可以通过修改一些代码来解决的问题。我尝试了各种不同的填充组合,以及间距和边距的值。那么,最终,我如何让相机与球员的位置平滑匹配,而不造成黑线呢?我非常感谢任何帮助或建议。提前谢谢你

在游戏类中,我将玩家的浮动位置类型转换为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);
    } 
游戏渲染和调整大小方法:

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

我通过在GDX纹理打包机中摆弄瓷砖集的填充来解决这个问题。我在32x32瓷砖周围添加了5个像素的填充。我在平铺中将边距设置为2,间距设置为4。我尝试了很多不同的填充/间距/边距组合,但都不起作用,这让我觉得这是一个编码问题,但这些设置起作用了,我不必对浮动进行取整

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