【问题标题】:Drawing shapes in Scene2d Actor (IE. Image or ImageTextButton)在 Scene2d Actor 中绘制形状(IE. Image 或 ImageTextButton)
【发布时间】:2016-08-15 01:56:45
【问题描述】:

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

到目前为止,我已经尝试创建自己的自定义 Actor 并在 draw 方法中使用 ShapeRenderer,但它不会更新矩形的位置、不透明度等。换句话说,它没有利用任何 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 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));

【问题讨论】:

    标签: java animation libgdx scene2d shape-rendering


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我使用了 get / set 方法...仍然没有更新位置等(见上文)。还有其他提示吗?
    • 关于 NinePatch 的想法,我的目标是最终将按钮轮廓线的宽度设置为与屏幕分辨率相关的值(即 1% 屏幕宽度)。如果我要使用 NinePatch 来做这件事,我需要为不同的分辨率创建一些它们,对吗?
    • 我不知道 ShapeRenderer 是这么大的对象。这些信息不应该在 wiki 中吗?
    • 您已将形状调整为按钮的大小,但按钮的大小为 0, 0,因为您从未在按钮上调用 setWidth 或 setHeight。您仍然可以看到该按钮,因为如果它们的 minWidth 和 minHeight 小于其存储的宽度和高度,它就会绘制。您可以在按钮上调用 pack() 将其 minSize 转换为实际大小,以便正确报告其大小。但也许您可以将按钮子类化并在那里添加大纲代码,以避免在混合中添加额外的演员的复杂性。
    • ShapeRenderer 不支持所有设备上的可变宽度线,据我所知。一些 GPU 会简单地忽略线宽参数并始终绘制 1 像素宽的线。使用 NinePatch,您可以调用 setLeftWidth、setTopHeight 等方法将不可拉伸区域的大小设置为图像中原始大小以外的大小。所以它对你想做的事情非常有效。
    【解决方案2】:

    我有类似的情况。我注意到我必须从 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2018-09-24
      • 1970-01-01
      相关资源
      最近更新 更多