【问题标题】:LibGDX drag listener on small Actor小演员上的 LibGDX 拖动侦听器
【发布时间】:2016-06-06 05:40:49
【问题描述】:

我有一个设置了拖动监听器的 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为什么。

【问题讨论】:

    标签: libgdx scale viewport drag orthographic


    【解决方案1】:

    当使用scene2d时,你必须使用一个视口,一个视口管理它的相机的大小。当您在相机上设置显式尺寸时,Stage 会感到困惑,因为它假定视口正在管理相机(现在相机的世界坐标和视口的屏幕尺寸不匹配)。

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

    【讨论】:

    • 现在我有stage = new Stage(new FitViewport(W/RATE, H/RATE));resizestage.getViewport().update((int)(width/RATE), (int)(height/RATE), true);RATE = 160f; 是一个常数,我用它来缩放世界,以使 box2d phisycs 正常工作。如果我不缩小世界 (RATE = 1f) 对象的移动速度非常慢,如果我缩小拖动不会触发。
    • W和H是常数,还是当前屏幕的大小?您应该只将常量传递给 Viewport 构造函数。否则,您当前正在设计您的游戏,使其仅适用于您正在开发它的显示器的尺寸。例如,您可能希望屏幕垂直显示 8m 的 Box2d 世界,因此您将使用new ExtendViewport(8, 8)。然后在resize 中调用viewport.update(width, height) 并使用实际的屏幕尺寸。现在,您的游戏在每台设备上的高度将达到 8 box2d 米。
    • 屏幕尺寸:W = Gdx.graphics.getWidth()Here 是完整代码。如果你能看一下,我将不胜感激
    • 如果你想得到高质量的答案,你真的应该缩短你的代码。我会尝试用最少的代码检查我的功能(没有图像,没有多个演员,只有一个演员和整个世界)从那里你可以找到问题所在。恕我直言,您应该将 box2d 和 scene2d 与视口一起使用。按照规定,你不应该自己煮汤。链接:github.com/libgdx/libgdx/wiki/Viewports -- viewport stackoverflow.com/questions/26089303/… -- 像素到米
    • 我添加了最后一件事:我从未使用过 getViewport().update(int, int, boolean) 方法,而是使用了 update(int, int)。也许这会有所帮助
    【解决方案2】:

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

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

    这只是“想象的”——魔术

    如果你想得到一个非常小的对象(对于 box2d),你需要使用一个小的视口。

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

    所以我们说 new Viewport(20, 20)..

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

    所以,现在我们可以显示我们的图像了。 我们做什么?我们有一个 160 的meterToPixel Ratio。 我们有 600x600 图像(宽度,高度) 现在我们计算我们的比率到 this(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));
    

    【讨论】:

    • 也许我很笨,但这不是我做的?我放了固定大小stage = new Stage(new FitViewport(20f, 20f)); 但还是不行
    • 好的,现在您的视口在 box2d 方面的大小还可以。你的形象就是你的问题。开始时有多大,设置费率后有多大?我猜第二个问题是你的视口,尝试在构造函数中给它一个具有相同宽度高度的相机(新正交相机(假,20,20)
    • 400x320 之前和 2.5x2 之后
    • 舞台 stage = new Stage(); OrthographicCamera cam = new Orthographic Camera(); cam.setToOrtho(false,20,20) stage.setViewport(new Viewport(20,20, cam) 我希望能解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多