有很多可能性来解决你的问题。
变换的屏幕坐标到阶段坐标(跳过如果它们是相同的),那么变换阶段坐标组的坐标,然后将演员设置为经变换的位置
vector = stage.screenToStageCoordinates(vector);
vector = group.stageToLocalCoordinates(vector);
actor.setPosition(vector.x, vector.y);
添加Stack
你的舞台,加已经存在的组,然后如果你轻按演员将其添加到堆栈(这会自动从旧的父代中删除)
Stack stack = new Stack();
stage.addActor(stack);
stack.add(yourGroup);
// then on tap
stack.add(actor);
禁用组布局,因此,如果您操作演员,组布局不重新计算,再加上禁用子改造父坐标:
group.setLayoutEnabled(false);
group.setTransform(false);
你可能会再次启用布局/改造,更新版本。
到2类似,但增加了演员的舞台和位置设置在中心
// then on tap
stage.addActor(actor);
actor.setPosition(
(stage.getWidth() - actor.getWidth())/2f,
(stage.getHeight() - actor.getHeight())/2f);
根据您的设置如预期的一些解决方案可能无法正常工作。
这里的4:
public class TestGame extends ApplicationAdapter
{
private Skin skin;
private Stage stage;
private Texture t;
@Override
public void create()
{
skin = new Skin(Gdx.files.internal("uiskin.json"));
t = new Texture(Gdx.files.internal("badlogic.jpg"));
// So we see everything
stage = new Stage(new ExtendViewport(4000, 400));
HorizontalGroup hGroup = new HorizontalGroup();
hGroup.setFillParent(true);
// So that the hGroup is on top
Table filler = new Table(skin);
filler.setFillParent(true);
filler.add(hGroup).fill().center();
stage.addActor(filler);
for (int i = 0; i < 10; i++)
{
final ImageButton b = new ImageButton(
new TextureRegionDrawable(new TextureRegion(t)));
b.addListener(new ClickListener()
{
@Override
public void clicked(InputEvent event, float x, float y)
{
if (b.getParent().equals(hGroup))
{
stage.addActor(b);
b.setPosition(
(stage.getWidth() - b.getWidth())/2f,
(stage.getHeight() - b.getHeight())/2f);
} else
{
hGroup.addActor(b);
}
}
});
hGroup.addActor(b);
}
Gdx.input.setInputProcessor(stage);
}
@Override
public void resize(int width, int height)
{
stage.getViewport().update(width, height);
}
@Override
public void render()
{
Gdx.gl.glClearColor(0f, 0f, 0f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
@Override
public void dispose()
{
stage.dispose();
skin.dispose();
t.dispose();
}
}
完美的例子,非常感谢你!第一版完美运作。我敢肯定,号码2也会起作用,但是在3号关闭HorizontalGroup的布局时出现问题,因为它需要正确定位子级。非常感谢你,很高兴有学到新东西:) – Jonas
小平漩涡,你能否详细说明你的建议2?你写了“添加一个堆栈到你的舞台,添加已经存在的组,然后如果你点击这个actor将它添加到堆栈(这会自动从它的旧父母中删除它)”。 “已有团体”是什么意思?包含我想要点击并缩放的卡片的组?我遇到了解决方案1的一些问题,并且想知道堆栈可能是最干净的解决方案,不需要太多的来回计算。谢谢! – Jonas
用新解决方案和示例实施更新了答案。 –