2015-10-17 60 views
0

我有Horizo​​ntalGroup演员添加到它。当我点击一个演员,我希望它在屏幕与(伪)中央弹出职位子级演员相对于舞台而不是家长

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

的问题是,演员越来越位置相对于父,而不是舞台/屏幕。

我怎么能解决这个问题?

回答

1

有很多可能性来解决你的问题。

  1. 变换的屏幕坐标到阶段坐标(跳过如果它们是相同的),那么变换阶段坐标组的坐标,然后将演员设置为经变换的位置

    vector = stage.screenToStageCoordinates(vector); 
    vector = group.stageToLocalCoordinates(vector); 
    actor.setPosition(vector.x, vector.y); 
    
  2. 添加Stack你的舞台,加已经存在的组,然后如果你轻按演员将其添加到堆栈(这会自动从旧的父代中删除)

    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类似,但增加了演员的舞台和位置设置在中心

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

完美的例子,非常感谢你!第一版完美运作。我敢肯定,号码2也会起作用,但是在3号关闭Horizo​​ntalGroup的布局时出现问题,因为它需要正确定位子级。非常感谢你,很高兴有学到新东西:) – Jonas

+0

小平漩涡,你能否详细说明你的建议2?你写了“添加一个堆栈到你的舞台,添加已经存在的组,然后如果你点击这个actor将它添加到堆栈(这会自动从它的旧父母中删除它)”。 “已有团体”是什么意思?包含我想要点击并缩放的卡片的组?我遇到了解决方案1的一些问题,并且想知道堆栈可能是最干净的解决方案,不需要太多的来回计算。谢谢! – Jonas

+1

用新解决方案和示例实施更新了答案。 –

相关问题