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放入表中时,对其调用setBounds
或setSize
将不再有效,因为表现在正在管理Actor的边界,并将继续覆盖您对Actor边界的直接更改。相反,您可以通过它所在的表格单元格来控制其大小。
调用 table.add()
时,将返回一个 Cell,您可以在其中调整单元格大小以及如何在单元格内处理单元格中的 Actor。例如:
uiTable.add(leftTouchPad).width(300).height(300).fill();
将使单元格为 300 x 300,fill
调用告诉它将其中的 Actor 缩放到与单元格相同的尺寸。
此外,您不应该调用uiTable.act
,而应该调用uiControls.act
。