LibGDX在小Actor上拖动侦听器

时间:2016-06-06 05:40:50

标签: libgdx scale viewport drag orthographic

我有一个设置了一个拖动侦听器的Actor:

ballActor.addListener(new DragListener() {
    public void drag(InputEvent event, float x, float y, int pointer) {
        ballActor.moveBy(x - ballActor.getWidth() / 2, y - ballActor.getHeight() / 2);
    }
});

此演员被添加到舞台:

W = Gdx.graphics.getWidth();
H = Gdx.graphics.getHeight();
camera = new OrthographicCamera(W / RATE, H / RATE);
stage = new Stage(new ScreenViewport(camera));
stage.addActor(ballActor);
Gdx.input.setInputProcessor(stage);

现在,如果我使用1:1的米到像素比率,拖动效果非常好,但如果我使用另一个比例,例如1:160,则拖动事件不会触发。

在调整大小方法中,我更新相机:

camera.viewportHeight = H/RATE;
camera.viewportWidth = W/RATE;
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
camera.update();

我读到如果我使用舞台,我不必从屏幕坐标转换到相机坐标。演员设置了位置,宽度,高度和界限。我做错了什么?

更新

以下是代码:

public class Pendulum extends ApplicationAdapter {

    private Stage stage;

    public static final float RATE = 160f; //with 1f..20f drag works

    float W;
    float H;

    @Override
    public void create() {

        W = Gdx.graphics.getWidth() / RATE;
        H = Gdx.graphics.getHeight() / RATE;

        Texture ballTexture = new Texture(Gdx.files.internal("ball.png"), true);
        ballTexture.setFilter(Texture.TextureFilter.MipMapLinearNearest, Texture.TextureFilter.Linear);
        TextureRegion ballRegion = new TextureRegion(ballTexture);

        final Image image = new Image(ballRegion);
        image.setSize(image.getWidth()/RATE, image.getHeight()/RATE);
        image.setPosition(0f, 0f);
        image.addListener(new DragListener() {
            public void drag(InputEvent event, float x, float y, int pointer) {
                Gdx.app.log("LOG", "DRAG IMAGE");
                image.moveBy(x - image.getWidth() / 2, y - image.getHeight() / 2);
            }
        });
        image.debug();
        image.setBounds(image.getX(), image.getY(), image.getWidth(), image.getHeight());

        stage = new Stage(new FitViewport(W, H));
        stage.addActor(image);

        Gdx.input.setInputProcessor(stage);
    }


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

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        float delta = Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f);
        stage.act(delta);
        stage.draw();
    }

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

我需要让RATE大于100f因为Image actor附加了Box2D Body。请参阅here why。

2 个答案:

答案 0 :(得分:0)

使用scene2d时,必须使用Viewport,Viewport管理其摄像头的大小。当您在相机上设置显式尺寸时,舞台将会混淆,因为它假定视口正在管理相机(现在相机的世界坐标与视口的屏幕尺寸之间存在不匹配)。

我不确定你是如何计算RATE的,但你应该做的是使用ExtendViewport或FitViewport。在resize()方法中,您需要在视口上调用update(),而不是修改相机。

答案 1 :(得分:0)

当我看到你的更新时,我看到你增加/减少了演员的大小,同时增加/减小了视口的大小。

执行以下操作:为视口提供固定的宽度/高度,这就是它的用途 如果要使用视口,则需要了解以下内容:
如果您有一个20 * 20的视口,那么您的整个屏幕的大小将为“20x20”。

这只是“虚构的” - 魔术

如果你想获得一个非常小的Object(对于box2d)而不是你需要使用一个小视口。

那我们现在该怎么办? 我们希望屏幕显示我们游戏的20个单位。

所以我们说新的视口(20,20)..

我们现在所做的是,我们将1280/800“映射”到20/20。

所以,现在我们可以显示我们的图像了。 我们做什么?我们有一个160的meterToPixel比率。 我们有600x600图像(宽度,高度) 现在我们计算我们的比率(600/160)= 3,75 现在,图像将填满你屏幕的3/20。

我们的屏幕是20x20,我们的图像是3,75。

简短回答:为视口提供固定大小(要查看多少Box2d单位(米)),而不是计算出的大小)并向视口或现有

OrthographicCamera cam = new OrthographicCamera();
cam.setToOrtho(false, 20,20);
Stage.setViewport(new FitViewport(20,20,cam));