LIBGDX/BOX2D:调用 Table.setBounds 时,重新调整触摸板大小不起作用


public class PlayScreen implements Screen {

private final float PPM = 100f;
private final float GAME_WORLD_WIDTH = 1920;
private final float GAME_WORLD_HEIGHT = 1080;
private OrthographicCamera cam;
private Viewport viewport;
private Stage uiControls;
private TextureAtlas uiAtlas;
private Skin uiSkin;
private Table uiTable;
private Touchpad leftTouchPad;
private World world;
private Box2DDebugRenderer renderer;
private Body ship;
private SpriteBatch batch;
@Override
public void show() {
    batch = new SpriteBatch();
    world = new World(new Vector2(0,0), true);
    renderer = new Box2DDebugRenderer();
    //////////////////////////////////////////////////////////////////////////////
    //*************************SET UP CAMERA/VIEWPORT***************************//
    //////////////////////////////////////////////////////////////////////////////
    float aspectRatio = (float)Gdx.graphics.getHeight() / (float)Gdx.graphics.getWidth();
    cam = new OrthographicCamera(GAME_WORLD_WIDTH / PPM ,GAME_WORLD_HEIGHT / PPM);
    cam.position.set(0,0,0);
    viewport = new ExtendViewport( (GAME_WORLD_WIDTH * aspectRatio) / PPM, (GAME_WORLD_HEIGHT)/PPM, cam);
    viewport.apply();
    ////////////////////////////////////////////////////////////////////
    // ****************** SET UP STAGE AND ADD UI ******************* //
    ////////////////////////////////////////////////////////////////////
    uiControls = new Stage(viewport);
    uiAtlas = new TextureAtlas(Gdx.files.internal("ui/playScreen/playUI.pack"));
    uiSkin = new Skin(uiAtlas);
    uiTable = new Table(uiSkin);
    uiTable.setBounds(-(GAME_WORLD_WIDTH / PPM) / 2, -(GAME_WORLD_HEIGHT / PPM) / 2, GAME_WORLD_WIDTH / PPM, GAME_WORLD_HEIGHT / PPM);

    ////////////////////////////////
    // ** UI CONTROLS AND VIEW ** //
    ////////////////////////////////
    //*** CONTROL PAD ***//
    TouchpadStyle positionControlStyle = new TouchpadStyle();
    positionControlStyle.knob = uiSkin.getDrawable("knob");
    positionControlStyle.background = uiSkin.getDrawable("background");
    leftTouchPad = new Touchpad(1, positionControlStyle);
    ////////////////////////
    // ** ADD TO STAGE ** //
    ////////////////////////
    uiTable.top();
    uiTable.add(leftTouchPad);
    uiControls.addActor(uiTable);

    ///////////////////////////////////////////////////////////////////
    // ************************* SET UP WORLD ********************** //
    ///////////////////////////////////////////////////////////////////
    BodyDef testDef = new BodyDef();
    testDef.type = BodyDef.BodyType.DynamicBody;
    testDef.linearDamping = 2f;
    testDef.position.set(0, 0);
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(1,1);
    FixtureDef def = new FixtureDef();
    def.shape = shape;
    ship = world.createBody(testDef);
    ship.createFixture(def);
    ///////////////////////////////////////////////////////
    // **************** SET UP SPRITES ***************** //
    ///////////////////////////////////////////////////////

    Gdx.input.setInputProcessor(uiControls);
}
@Override
public void render(float delta) {
    Gdx.gl20.glClearColor(0, 0, 0, 1);
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
    ship.applyForceToCenter(5 * leftTouchPad.getKnobPercentX(), 5 * leftTouchPad.getKnobPercentY(), true);
    cam.update();
    world.step(1 / 30f, 8, 3);
    renderer.render(world, cam.combined);
    batch.begin();
    batch.end();
    uiTable.act(delta);
    uiTable.debug();
    uiControls.draw();
}
@Override
public void resize(int width, int height) {
    viewport.update(width,height);
    cam.position.set(0, 0, 0);
    uiControls.getViewport().update(width,height,false);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}

}

所以,这就是正在发生的事情。我将触摸板添加到桌子上,但它似乎离它应该在的地方很远,而且比正常情况大得多。调试图表明载物台和工作台肯定处于正确的位置。

我尝试调用touchpad.setBouds((和touchpad.setSize((,但它们都不起作用。

舞台也许是问题所在吗?

当您将任何Actor放入表中时,对其调用setBoundssetSize将不再有效,因为表现在正在管理Actor的边界,并将继续覆盖您对Actor边界的直接更改。相反,您可以通过它所在的表格单元格来控制其大小。

调用 table.add() 时,将返回一个 Cell,您可以在其中调整单元格大小以及如何在单元格内处理单元格中的 Actor。例如:

uiTable.add(leftTouchPad).width(300).height(300).fill();

将使单元格为 300 x 300,fill调用告诉它将其中的 Actor 缩放到与单元格相同的尺寸。

此外,您不应该调用uiTable.act,而应该调用uiControls.act

最新更新