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 名称 - 其他用户会更清楚
我最近一直在做一个项目,作为我的家庭作业。
好吧,直截了当,我有一个 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 名称 - 其他用户会更清楚