簡體   English   中英

將兒童演員相對於舞台而不是父母定位

[英]Position Child Actor relative to Stage and NOT Parent

我有添加演員的Horizo​​ntalGroup。 當我點擊一個演員時,我希望它以(偽代碼)出現在屏幕中央。

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

問題在於演員正在相對於父對象而不是舞台/屏幕獲得位置。

我該如何解決呢?

有很多可能性可以解決您的問題。

  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. 禁用組布局,因此,如果您操縱角色,則不會再次計算組布局,並禁用對父坐標的子轉換:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM