【问题标题】:Extreme Zoom with gamecam - Libgdx带游戏摄像头的极致变焦 - Libgdx
【发布时间】:2017-11-05 10:53:18
【问题描述】:

大家好,我是 libgdx 的新手,我试图让相机跟随玩家。 尝试这样做时,我在网上看到我必须添加这行代码。

game.getBatch().setProjectionMatrix(gamecam.combined);

通过这样做,我注意到我的游戏真的被放大了,我试图去缩小它,但我无法让它工作。你们有什么建议吗? 这是我渲染玩家的游戏画面。

`public class GameScreen 实现 Screen {

private Logang game;

//basic playscreen variables
private OrthographicCamera gamecam;
private Viewport gamePort;

//Box2d variables
private World world;
private Box2DDebugRenderer b2dr;

boolean drawn = true;
private Player p;
private int pX = 100, pY = 300;

public GameScreen(Logang game) {

    this.game = game;
    //create cam used to follow mario through cam world
    gamecam = new OrthographicCamera(Logang.GWIDTH, Logang.GHEIGHT);
    gamecam.update();

    //create our Box2D world, setting no gravity in X, -10 gravity in Y, and allow bodies to sleep
    world = new World(new Vector2(0, Logang.GRAVITY), true);
    //allows for debug lines of our box2d world.
    b2dr = new Box2DDebugRenderer();


    //create a FitViewport to maintain virtual aspect ratio despite screen size
    gamePort = new ScalingViewport(Scaling.fill, Logang.GWIDTH / Logang.PPM, Logang.GHEIGHT / Logang.PPM, gamecam);

    p = new Player(new Sprite(new Texture("badlogic.jpg")), world, pX, pY, 1);

    //initially set our gamcam to be centered correctly at the start of of map
    //gamecam.position.set(gamePort.getWorldWidth() / 2, gamePort.getWorldHeight() / 2, 0);

    line();
}


@Override
public void show() {

}

public void update(float dt) {
    //handle user input first
    p.update(dt);
    //update our gamecam with correct coordinates after changes
    /*gamecam.position.set(p.getSprite().getX(),0,0);
    gamecam.update();*/
}


@Override
public void render(float delta) {
    //separate our update logic from render
    update(delta);

    //Clear the game screen with Black
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    world.step(1f / 60f, 6, 2);

    gamecam.position.set(p.getSprite().getX(), p.getSprite().getY(), 0); // x and y could be changed by Keyboard input for example

    //gamecam.position.set(p.getSprite().getX(), p.getSprite().getY(), 0);
    gamecam.update();

    game.getBatch().setProjectionMatrix(gamecam.combined);

    //renderer our Box2DDebugLines
    b2dr.render(world, gamecam.combined);

    System.out.println("Player x: " + p.getSprite().getX() + " Camera X: " + gamecam.position.x + " Body X: " + p.getBody().getPosition().x);
    //System.out.println("Player y: " + p.getSprite().getY() + " Camera Y: " + gamecam.position.y + " Body Y: " + p.getBody().getPosition().y);


    game.getBatch().begin();


    if (p.getBody() != null)
        p.render(game.getBatch());

    EntityManager.renderTerra(game.getBatch(), delta);


    game.getBatch().end();

}

public void line() {
    Texture tmp = new Texture("dirt.png");
    tmp.setWrap(Texture.TextureWrap.MirroredRepeat, Texture.TextureWrap.MirroredRepeat);
    for (int i = 0; i < 10; i++) {
        EntityManager.add(new Ground(new Sprite(tmp), world, i * Logang.TILE, 0, 2));
    }
    //EntityManager.changeSize(Logang.TILE * 5,Logang.TILE);
}

@Override
public void resize(int width, int height) {
    //updated our game viewport
    gamePort.update(width, height);
}

public World getWorld() {
    return world;
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    world.dispose();
    b2dr.dispose();
}`

这是我的实体类,它由播放器扩展,我现在为空` 公共抽象类实体{

private World world;
private Sprite sprite;
private Body body;
private int tipo;

public Entity(Sprite sprite, World world, int x, int y, int tipo){
    this.sprite = sprite;
    this.world = world;
    getSprite().setPosition(x, y);
    getSprite().setSize(Logang.TILE, Logang.TILE);
    define(tipo);
    this.tipo = tipo;
}

public abstract void update(float dt);

public void define(int tipo){
    BodyDef bdef = new BodyDef();
    bdef.position.set((getSprite().getX() + getSprite().getWidth() / 2) / Logang.PPM, (getSprite().getY() + getSprite().getHeight() / 2) / Logang.PPM);
    switch(tipo){
        case 1: {
            bdef.type = BodyDef.BodyType.DynamicBody;
            break;
        }
        case 2:{
            bdef.type = BodyDef.BodyType.StaticBody;
            break;
        }
        case 3:{
            bdef.type = BodyDef.BodyType.DynamicBody;
            break;
        }

    }

    body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(getSprite().getWidth() / Logang.PPM / 2, getSprite().getHeight() / Logang.PPM / 2);


    fdef.shape = shape;
    body.createFixture(fdef);
    body.setUserData(this);

    shape.dispose();
}

public void render(SpriteBatch batch){
    if(tipo != 2) {
        float posX = getBody().getPosition().x * Logang.PPM;
        float posY = getBody().getPosition().y * Logang.PPM;

        getSprite().setPosition(posX - getSprite().getWidth() / 2, posY - getSprite().getHeight() / 2);

    }
    getSprite().draw(batch);
}

public Sprite getSprite() {
    return sprite;
}

public void setSprite(Sprite sprite) {
    this.sprite = sprite;
}

public Body getBody() {
    return body;
}

public void setBody(Body body) {
    this.body = body;
}`

如果我在开始时删除那条线,游戏尺寸会很好,但我的相机不会跟随我的玩家。

感谢您的回答,如果问题没有很好地提出,我们深表歉意。

【问题讨论】:

  • Logang.TILE 是哪个值?
  • Logang.TILE = 64 int 类型
  • 这一行打印什么。 System.out.println("玩家 x:" + p.getSprite().getX() +" 相机 X:" + gamecam.position.x +" 身体 X:" + p.getBody().getPosition(). x);
  • 玩家相机和身体的坐标
  • 数值相同,但玩家获得视野,我看不到他的身体

标签: java android libgdx


【解决方案1】:

1) 如果您的视口尺寸除以 Logang.PPM,则所有纹理大小也应除以 Logang.PPM。

Logang.TILE 应该是float 并除以Logang.PPM

Player sprite 也应该调整大小**。

2) 要关注玩家,请尝试将gamecam 分辨率除以Logang.PPM

像这样初始化它:

gamecam = new OrthographicCamera(Logang.GWIDTH / Logang.PPM, Logang.GHEIGHT / Logang.PPM);

UPD:我发现了问题,它在播放器渲染方法中:

float posX = getBody().getPosition().x; // delete  * Logang.PPM
float posY = getBody().getPosition().y; // delete  * Logang.PPM

【讨论】:

  • 我改了,但相机还是没有跟随玩家
  • @leonarddrici 是您移动相机的问题还是您的世界规模太大?
  • 缩放问题已修复,但现在相机不跟随播放器
  • @leonarddrici 我找到了。
【解决方案2】:

相机接受两个变量:世界的宽度和高度。这是一个重要的关键字,因为它定义了世界的渲染大小。如果相机的宽度和高度为 300x300,这意味着屏幕上可见 300x300 个单位,即使屏幕是 1920x1080。

当你这样做时:

gamecam = new OrthographicCamera(Logang.GWIDTH, Logang.GHEIGHT);

您将相机的宽度和高度设置为给定值。

你应用它的第二个:

game.getBatch().setProjectionMatrix(gamecam.combined);

您用于渲染的批次使用相机的投影矩阵,这意味着它会根据一次可见的宽度和高度将屏幕坐标转换为世界坐标。对于 300x300 的实例。

如果您认为世界太小(意味着您渲染的内容太大),您当然可以通过添加比例因子来缩小,但您也可以增加相机的宽度和高度。我不知道您将宽度和高度设置为什么,但如果您增加宽度和高度,它可能会起作用。

正如我已经提到的,世界坐标可以与屏幕坐标不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多