在Scene2d Actor中绘制形状(IE。图像或ImageTextButton)

时间:2016-04-21 17:41:17

标签: java animation libgdx scene2d shape-rendering

我几年没与LibGdx合作,但我记得在某些时候搞过这个问题。我试图创建一个按钮,并使用ShapeRenderer在按钮边缘周围绘制一个Rectangle(以勾画它)。

到目前为止,我已尝试创建自己的自定义Actor并在draw方法中使用ShapeRenderer,但它不会更新矩形的位置,不透明度等等。换句话说,它没有#&# 39; t利用任何Actor类的好处。有没有办法使用Actor类绘制线条或形状,然后使用应用的动作等进行更新?

以下是我在自定义Actor类中执行操作的示例:

public class Shape extends Actor {

ShapeRenderer sr;
float x, y, w, h;

public Shape (float x, float y, float w, float h) {
    sr = new ShapeRenderer();
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
}

@Override
public void draw(Batch batch, float parentAlpha) {
    super.draw(batch, parentAlpha);
    batch.end();
    sr.begin(ShapeRenderer.ShapeType.Line);
    sr.setColor(Color.BLACK);
    sr.rect(x, y, w, h);
    sr.end();
    batch.begin();
}}

非常感谢任何帮助;提前谢谢!

编辑4/21美国东部时间下午2:39 建议的更改,形状仍然不会随着动作移动/旋转。还有其他建议吗?

public class Shape extends Actor {

ShapeRenderer sr;

public Shape (ShapeRenderer sr, float x, float y, float w, float h) {
    this.sr = sr;
    setX(x);
    setY(y);
    setWidth(w);
    setHeight(h);
}

@Override
public void draw(Batch batch, float parentAlpha) {
    super.draw(batch, parentAlpha);
    batch.end();
    sr.begin(ShapeRenderer.ShapeType.Line);
    sr.setColor(Color.BLACK);
    sr.rect(getX(), getY(), getWidth(), getHeight());
    sr.end();
    batch.begin();
}}

编辑4/21美国东部时间下午2:46 以下是我实现自定义actor的方法,我将其添加到父组并在组中设置操作...

//Generate buttons
    ImageTextButton.ImageTextButtonStyle style = new ImageTextButton.ImageTextButtonStyle();
    parameter.size = game.labelButtonSize;
    style.font = generator.generateFont(parameter);
    style.fontColor = Color.BLACK;
    buttonYes = new ImageTextButton(Consts.CAMERA_STRING_BUTTON_YES, style);
    buttonYes.align(Align.left);
    buttonYes.addListener(new ClickListener() {
        @Override
        public void clicked(InputEvent event, float x, float y) {
            Gdx.app.log("TAG", "Clicked Yes");
        }
    });
    Group bY = new Group();
    bY.addActor(buttonYes);
    bY.addActor(new Shape(sr, buttonYes.getX(), buttonYes.getY(), buttonYes.getWidth(), buttonYes.getHeight()));
    bY.addAction(Actions.rotateTo(90, 2));

2 个答案:

答案 0 :(得分:1)

Actor已经有x,y,width,height和color的字段。您必须使用getter方法来访问它们。通过使用您自己的,您忽略了内置功能。<​​/ p>

此外,您可能希望整个应用中只有一个ShapeRenderer,因为每个ShapeRenderer实例都有一个大的顶点数据数组并编译着色器。

请注意,您创建了许多额外的绘制调用,因为您不得不为执行此操作的每个actor刷新Batch和ShapeRenderer。如果您的表现开始受损,您可能希望用NinePatch替换此矩形,您可以使用Batch绘制。

或者,如果您根本不使用精灵,可以考虑覆盖drawDebug而不是draw,这样您就可以使用SpriteBatch内置的ShapeRenderer并避免所有额外的刷新。

答案 1 :(得分:0)

我有类似的情况。我注意到的是我必须从批处理中获取TransformMatrix并将其应用于ShapeRenderer。请参阅下面的代码。

@Override
public void draw(Batch batch, float parentAlpha) {
    batch.end();
    shapeRenderer.setTransformMatrix(batch.getTransformMatrix());
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    Color color = getColor();
    shapeRenderer.setColor(color.r, color.g, color.b, color.a * parentAlpha);
    shapeRenderer.rect(getX(), getY(), getWidth(), getHeight());
    shapeRenderer.end();
    batch.begin();
}