gpt4 book ai didi

java - 相对于舞台而不是父级 Actor 的位置

转载 作者:行者123 更新时间:2023-12-01 11:03:07 25 4
gpt4 key购买 nike

我有 Horizo​​ntalGroup,其中添加了 Actor 。当我点击一个 Actor 时,我希望它在屏幕中央弹出(伪代码)

Gdx.graphics.getWidth()/2 - myActor.getWidth()/2;
Gdx.graphics.getHeight()/2 - myActor.getHeight()/2;

问题在于 Actor 正在获取相对于父级而不是舞台/屏幕的位置。

我该如何解决这个问题?

最佳答案

有很多可能性可以解决您的问题。

  1. 将屏幕坐标转换为舞台坐标(相同则跳过),然后将舞台坐标转换为群组坐标,然后将 Actor 设置为转换后的位置

    vector = stage.screenToStageCoordinates(vector);
    vector = group.stageToLocalCoordinates(vector);
    actor.setPosition(vector.x, vector.y);
  2. 将一个Stack添加到您的舞台,将现有的组添加到其中,然后如果您点击 Actor ,则将其添加到堆栈中(这会自动将其从其旧父级中删除)

    Stack stack = new Stack();
    stage.addActor(stack);
    stack.add(yourGroup);

    // then on tap
    stack.add(actor);
  3. 禁用组布局,因此如果您操作 actor,则不会再次计算组布局,并且禁用子坐标到父坐标的转换:

    group.setLayoutEnabled(false);
    group.setTransform(false);

    您可以稍后再次启用布局/转换。

  4. 与2.类似,但将 Actor 添加到舞台上并将位置设置为中心

    // 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();
}
}

关于java - 相对于舞台而不是父级 Actor 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com