Percy

使组将Actor隐藏在其边界之外

java

我创建了一个非常简单的图,可以通过在屏幕的右侧添加新图像,然后使它们向左侧移动来动态更新。这样,屏幕范围内的绘图就好像随着时间的流逝而绘制一样。

不幸的是,以这种方式执行操作时,我必须让图像从屏幕外开始并进入视图,并且在图像完全位于屏幕的左侧之前,我无法再次将其删除。这导致图像在屏幕边界之外部分可见。

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

在下图中,控件的边界标记为红色。我想隐藏运动图像中超出这些范围的部分。使用我错过的某些libGDX功能可以做到这一点吗?通过某种方式限制小组的绘图区域?

屏幕的工作方式说明。

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

有什么建议么?


阅读 553

收藏
2020-12-06

共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();
}
2020-12-06