在Libgdx中实现滚动UI

我正在使用LibGDX框架。 我没有使用Scene2D,但我想实现我自己的“滚动UI”。 这只是我能想到的(见下图):

两个摄像头

我会让第二台相机看很远的坐标(并在那里绘制用户界面的东西),让它(在蓝色框内)接收自己的input。 但是我认为这对于LibGDX来说是不可能的,因为如果你设置摄像头的大小,你就可以设定观察世界的大小,而不是视口的大小。 我的意思是你不能设置像50px宽度和高度的相机的大小,并把它放在中心。 如果您设置了位置,则将其设置为它所在的位置,而不是放置在二维空间中的位置。 我试图解释清楚,我希望很清楚。

Solutions Collecting From Web of "在Libgdx中实现滚动UI"

由于您在每个单独的区域使用2个摄像头,因此可以使用input多路复用器为每个区域分割input 。 现在,您可以为主摄像头设置一个input处理器,为用户界面设置一个处理器。 然后,仅仅是在UI处理器中响应鼠标拖动事件的情况,并且如果该事件不在UI区域中,则在input处理器方法中返回false以表示该处理器不处理该事件,并且需要将其传递给复用器链中的下一个input处理器(主摄像头input处理器)。

import com.badlogic.gdx.InputProcessor; public class UIInputProcessor implements InputProcessor{ @Override public boolean touchDragged(int screenX, int screenY, int pointer) { if(screenX >= 50 && screenX <= 100 && screenY >= 50 && screenY <= 150 ){ // I assume the sreen UI window is 50px x 100px with its lower left corner at 50,50 //TODO respond to UI events return true; // this event has been processed so respond true so events do not get passed to next input processor } return false; } //.. some events removed for clarity } 

主input处理器

 import com.badlogic.gdx.InputProcessor; public class MainInputProcessor implements InputProcessor{ @Override public boolean keyDown(int keycode) { // input events for main area return false; } //.. some events removed for clarity @Override public boolean scrolled(int amount) { // input events for main area return false; } } 

游戏/屏幕类

使用2个普通的InputProcessors

  MyProcessor = new InputMultiplexer(new UIInputMuliplexer(), new MainInputProcessor()); 

或者如果你使用scene2d阶段

 MyProcessor = new InputMultiplexer(MyStage, new MainInputProcessor()); 

相机现在你需要制造2个相机。 一个用于主要区域,一个用于UI

这个例子是从如何使用LibGDX在一个独特的阶段实现2台摄像机

 mainCamera = new OrthographicCamera(GAME_WIDTH,GAME_HEIGHT); mainCamera.position.set(GAME_WIDTH /2, GAME_HEIGHT /2, 0); mainCamera.update(); secondCamera = new OrthographicCamera(UI_WIDTH,UI_HEIGHT); secondCamera.position.set(UI_WIDTH /2,UI_HEIGHT /2, 0); secondCamera.update(); 

在你的渲染方法中,你会添加

 //For the main cam Gdx.gl.glViewport(0,0,GAME_WIDTH, GAME_HEIGHT); // set viewport to full screen batch.setProjectionMatrix(mainCamera.combined); batch.begin(); // draw main screen items batch.end(); //For the UI cam Gdx.gl.glViewport(100,100,300, 400); // set smaller region for UI batch.setProjectionMatrix(secondCamera.combined); batch.begin(); // draw UI items batch.end(); 

重要的是glViewport设置画面的哪一部分。