LibGDX - Scene2D 平移

LibGDX - Scene2D panning

我最近一直在做一个项目,作为我的家庭作业。
好吧,直截了当,我有一个 Scene2D 的屏幕实现,我遇到的问题是我在小部件上的触摸事件不会在小部件上停止。
我的意思是,如果我弹出一个 window,并尝试移动它,它也会触发我的图形平移,或者如果我移动滑块,它也会平移相机。

这里是my project on GitHub
我的事件是在 Core 上的 class Pantalla 上配置的,Here
提前致谢。

你的问题是你正在使用舞台和所有演员(小部件等)作为相机手势动作的输入处理器。这意味着无论何时您将对属于它的任何 actor 应用一些手势,它都会触发。

解决方案是在当前阶段 上仅针对相机手势创建另一个阶段。所以你的代码应该是这样的:

    //show method
    viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    // Creamos el stage, el cual albergara los botones entre otras cosas
    stage = new Stage(viewport);

    cameraStage = new Stage(viewport); //I'm not super-sure if you can user viewport second time - if not create new one

    ...

    //render method
    stage.act();
    stage.draw(); 

    cameraStage.act();
    cameraStage.draw(); //cameraStage is drawn after stage so it will be over it!

    ...

那么你应该将所有与相机手势连接的监听器添加到 cameraStage 而不是舞台 但当然它的功能应该影响静止演员舞台 .

好的,那么你有两个舞台,摄像机舞台在演员的舞台上方,所以你可以触摸任何你想触摸的地方,你确定你正在触摸两个舞台,你现在要做的是将两个舞台设置为输入处理器 演员阶段作为第一个,相机阶段作为第二个,您将确保来自演员阶段的事件作为第一个进行。

您需要 InputMultiplexer 才能执行此操作。主要代码方案为:

    InputMultiplexer inputMultiplexer = new InputMultiplexer();

    inputMultiplexer.addProcessor(stage);
    inputMultiplexer.addProcessor(cameraStage);

    Gdx.input.setInputProcessor(inputMultiplexer);

现在您的小部件事件将作为第一个处理。

如果某些东西不起作用,还可以考虑在触摸 stade 时从 inputMultiplexer 中删除 cameraStage,然后在触摸 stade 时再次添加它。


还有一个简单的建议 - 特别是当您创建一个将在未来共享的工具时,在代码中使用英文 variables/methods/etc 名称 - 其他用户会更清楚