Libgdx创建屏幕控件

4

我正在使用libgdx框架来创建游戏。我试图创建屏幕按钮/控件。

目前,我有一个

class LevelOne that implements Screen. 

这个类有一个私有变量 world(来自Box2d)。
我想在Box2d世界中添加一个带有文本按钮的表格或Libgdx触摸板。但是,我不确定如何做到这一点。
接下来,我知道可以将表格或触摸板添加到Libgdx舞台上。是否有任何方式让Libgdx舞台和Box2d世界一起工作,以便我可以将触摸板或表格添加到Box2d世界中?

我想在Box2d世界中添加一个带有文本按钮或Libgdx触摸板的表格。你能解释一下为什么你想要这个吗?对于你的第二个问题,请访问此链接http://stackoverflow.com/questions/10112868/example-of-director-stage-group-actor-box2d-and-gesturedector-libgdx - Pranav008
我想使用带有按钮或触摸板的表格来创建屏幕控件。 - Mandeep
无论是表格还是触摸板都不需要Box2D... - Pranav008
1
Box2D 世界完全独立于其他所有事物。它甚至是一个 C++ 库,通过 JNI 由 LibGDX 调用。它对 LibGDX 一无所知。您不能向其中添加任何 Actor。您可以建立一个(独立的)舞台,上面有“BodyActors”,这些 Actos 在每帧中更新。但您甚至不需要那样做。只需拥有一个舞台并添加演员即可。这是用户界面(UI)的工作。 - noone
这是我正在寻找的答案链接: https://bitbucket.org/dermetfan/somelibgdxtests/src/42dbb0e34af0fbe6d9d2e88eea6b90a1f464eb65/SomeLibgdxTests/src/net/dermetfan/someLibgdxTests/screens/Box2DAndScene2DTest.java?at=default ,你可以在同一个Libgdx屏幕中同时拥有一个Box2d世界和一个Libgdx舞台渲染,而不会相互干扰。 - Mandeep
感谢所有的回复。我想我找到了你可能说的例子。 - Mandeep
2个回答

9

对于屏幕上的控件,您可以按照以下方式进行:

创建一个新的摄像机,用于固定控件:

OrthographicCamera guicam = new OrthographicCamera(480, 320);
guicam.position.set(480/2F, 320/2F, 0);

为每个控件创建一个(libgdx)矩形:
Rectangle wleftBounds = new Rectangle(0, 0, 80, 80);
Rectangle wrightBounds = new Rectangle(80, 0, 80, 80);

创建一个新的Vector3来保存未投影的触摸坐标:
Vector3 touchPoint = new Vector3();

接下来,您可以轮询输入以查看用户是否触摸了这些矩形:

//in render method
for (int i=0; i<5; i++){
    if (!Gdx.input.isTouched(i)) continue;
    guicam.unproject(touchPoint.set(Gdx.input.getX(i), Gdx.input.getY(i), 0));
    if (wleftBounds.contains(touchPoint.x, touchPoint.y)){
        //Move your player to the left!
    }else if (wrightBounds.contains(touchPoint.x, touchPoint.y)){
        //Move your player to the right!
    }
}

请注意,我正在检查前5个触摸索引,因为您肯定希望同时使用的控件(例如向右移动时跳跃)。

最后但并非最不重要的是,您需要在控件上绘制一些漂亮的图形:

batch.draw(leftRegion, wleftBounds.x, wleftBounds.y, wleftBounds.width, wleftBounds.height);
batch.draw(rightRegion, wrightBounds.x, wrightBounds.y, wrightBounds.width, wrightBounds.height);

这对我有效。但是,我不确定如何使用第二个相机使控件保持在屏幕上。我创建了一个新的正交相机和一个新的SpriteBatch(与用于绘制玩家、敌人、背景等的不同)。但是,我可能做错了什么,因为随着第一个相机跟随移动的玩家,控件被切断了。 - Mandeep
没关系,我解决了。我一开始创建了一个相机对象的副本,并将其用作第二个相机。但是,我需要实例化一个新的第二个相机对象,它不像第一个相机对象那样调用camera.setToOrtho()。现在它可以工作了。 - Mandeep

0
如果您想要包含一个HUD舞台:
创建HUD矩阵(导入com.badlogic.gdx.math.Matrix4):
HUDMatrix = camera.combined.cpy();
HUDMatrix.setToOrtho2D(0, 0, wwidth, wheight);

然后绘制它的HUD

batch.setProjectionMatrix(HUDMatrix);
batch.begin();
    stage.draw(batch)
batch.end();     

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接