java - LIBGDX/BOX2D : Re-sizing Touchpad is not working when the Table. setBounds 被调用

标签 java libgdx game-engine physics-engine

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() {

}

}

所以,这就是发生的事情。我将触摸板添加到 table 上,但它似乎偏离了应有的位置,而且比正常情况大得多。调试图表明舞台和工作台的位置绝对正确。

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

舞台可能是问题所在吗?

最佳答案

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

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

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

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

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

关于java - LIBGDX/BOX2D : Re-sizing Touchpad is not working when the Table. setBounds 被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347738/

相关文章:

c++ - 使用 'new'创建实例后出现堆栈溢出错误

java - 一个字母在一个短语中的出现

java - 在 Web 应用程序中使用 twilio 进行语音通话

java - Android:SQLite cursor.getPosition() 返回字符串?

java - 彻底改变spring项目的响应从渲染jsp变为json对象

java - 有没有办法在 LibGDX 中暂时隐藏场景小部件

java - LibGDX FreeTypeFont 轮廓和投影?

android - Libgdx Android 设置屏幕分辨率

artificial-intelligence - 开源城市驾驶模拟器

Java简单游戏测试错误