【问题标题】:Making a Group hide Actors outside of its bounds使 Group 将 Actors 隐藏在其边界之外
【发布时间】:2013-07-08 10:23:57
【问题描述】:

我创建了一个非常简单的绘图,它通过在屏幕右侧添加新图像,然后使它们向左侧移动来动态更新。这样,屏幕边界内的绘图看起来就像是随着时间的推移而绘制的。

不幸的是,这样做时,我必须让图像从屏幕之外开始,然后移动到视图中,并且在它们完全位于左侧屏幕之外之前,我无法再次删除它们。这会导致图像在屏幕边界之外部分可见。

控件创建为Group,其中包含两个静态图像(黑色背景和作为前景的屏幕图像),以及介于两者之间的所有运动图像。这个Group 然后被添加到我的Stage(和所有其他演员一样),并作为Stage 的一部分绘制。

在下图中,控件的边界用红色标记。我想隐藏这些边界之外的运动图像部分。使用我错过的一些 libGDX 功能可以做到这一点吗?也许是通过某种方式限制了 Group 的绘图区域?

我的其他选择是在屏幕前绘制蓝色背景的一部分,隐藏异常值,或者使屏幕边缘足够厚以隐藏它们。我认为这两种解决方案都不必要地带来不便,而且我很确定有更好的方法来做到这一点。

有什么建议吗?

【问题讨论】:

    标签: grouping libgdx


    【解决方案1】:

    解决方案是使用ScissorStack

    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
    
        //Create a scissor recangle that covers my Actor.
        Rectangle scissors = new Rectangle();
        Rectangle clipBounds = new Rectangle(getX(),getY(),getWidth(),getHeight());
        ScissorStack.calculateScissors(camera, batch.getTransformMatrix(), clipBounds, scissors);
        batch.flush(); //Make sure nothing is clipped before we want it to.
        ScissorStack.pushScissors(scissors);
    
        //Draw the actor as usual
        super.draw(batch, parentAlpha);
    
        //Perform the actual clipping
        ScissorStack.popScissors();
    }
    

    【讨论】:

    • 对我来说,这仅在我替换“batch.flush();”时才有效在draw call之后。然而,我自己在这里用“batch.draw(...)”而不是“super.draw(...)”来绘制
    • batch.flush();应该在 super.draw(batch, parentAlpha); 之后
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2016-07-16
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多