2

我已经有几年没有使用过 LibGdx 了,但我记得在某个时候发现了这一点。我正在尝试创建一个按钮,并使用 ShapeRenderer 在按钮的边缘周围绘制一个矩形(以勾勒它的轮廓)。

到目前为止,我已经尝试创建自己的自定义 Actor 并在 draw 方法中使用 ShapeRenderer,但它不会更新矩形的位置、不透明度等。换句话说,它没有利用任何演员等级的好处。有什么方法可以使用 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 EST 进行了建议的更改,形状仍然不会随着动作移动/旋转。还有其他建议吗?

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 EST 这是我实现自定义演员的方式,我将其添加到父组并在组上设置操作...

//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));
4

2 回答 2

1

Actor 已经具有 x、y、宽度、高度和颜色的字段。您必须使用 getter 方法来访问它们。通过使用您自己的,您忽略了内置功能。

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

请注意,您创建了许多额外的绘制调用,因为您必须不断刷新执行此操作的每个 Actor 的 Batch 和 ShapeRenderer。如果您的性能开始受到影响,您可能想用 NinePatch 替换这个矩形,您可以使用 Batch 进行绘制。

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

于 2016-04-21T18:18:11.870 回答
0

我有一个类似的场景。我注意到我必须从 Batch 中获取 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();
}
于 2017-01-08T23:00:50.177 回答