Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to zoom in and out on a stage in libgdx Scene2d?

I am making a 2d game using libgdx and am adding hexagon shaped actors to a group which is then added to a stage. For a normal camera you can use camera.zoom in the render method to zoom in and out along with camera.translate to pan around the world.

I have been getting the camera used by the stage using stage.getCamera() and I can still call stage.getcamera().translate however there is no stage.getCamera().zoom option.

Here is my code:

//import statements

public class HexGame implements ApplicationListener{

private Stage stage;

private Texture hexTexture;
private Group hexGroup;

private int screenWidth;
private int screenHeight;


@Override
public void create() {

    hexTexture = new Texture(Gdx.files.internal("hex.png"));

    screenHeight = Gdx.graphics.getHeight();
    screenWidth = Gdx.graphics.getWidth();

    stage = new Stage(new ScreenViewport());

    hexGroup = new HexGroup(screenWidth,screenHeight,hexTexture);

    stage.addActor(hexGroup);
}

@Override
public void dispose() {
    stage.dispose();
    hexTexture.dispose();
}

@Override
public void render() {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();

    handleInput();
    stage.getCamera().update();

}


private void handleInput() {

    if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
        stage.getCamera().translate(-3, 0, 0);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
        stage.getCamera().translate(3, 0, 0);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
        stage.getCamera().translate(0, -3, 0);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
        stage.getCamera().translate(0, 3, 0);
    }

    //This is the part that doesn't work
    /*
    if (Gdx.input.isKeyPressed(Input.Keys.Z)) {
        stage.getCamera().zoom += 0.02;
    }
    */

    }



@Override
public void resize(int width, int height) {
    stage.getViewport().update(width, height);
}

@Override
public void pause() {
}

@Override
public void resume() {
}


}

Any help is appreciated, and if there is anything else wrong with my code please let me know, I'm new to libgdx. Thanks

like image 452
EssEllDee Avatar asked Dec 25 '22 16:12

EssEllDee


1 Answers

Zoom is available in OrthographicCamera class and by default Stage class create a OrthographicCamera

/** Creates a stage with a {@link ScalingViewport} set to {@link Scaling#stretch}. The stage will use its own {@link Batch}
     * which will be disposed when the stage is disposed. */
    public Stage () {
        this(new ScalingViewport(Scaling.stretch, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), new OrthographicCamera()),
            new SpriteBatch());
        ownsBatch = true;
    }

So what you need is to cast your camera to OrthographicCamera:

((OrthographicCamera)stage.getCamera()).zoom += 0.02f;

like image 129
Saeed Masoumi Avatar answered Jan 05 '23 00:01

Saeed Masoumi