java - 在 Scene2d Actor 中绘制形状(即 Image 或 ImageTextButton)

标签 java animation libgdx scene2d shape-rendering

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

到目前为止,我已经尝试创建自己的自定义 Actor 并在绘制方法中使用 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 进行了建议的更改,形状仍然不会随着操作移动/旋转。还有其他建议吗?

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

最佳答案

Actor 已经具有 x、y、宽度、高度和颜色字段。您必须使用 getter 方法来访问它们。如果使用您自己的功能,您将忽略内置功能。<​​/p>

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

请注意,您会创建大量额外的绘制调用,因为您必须不断地为执行此操作的每个 actor 刷新 Batch 和 ShapeRenderer。如果您的性能开始受到影响,您可能需要用 NinePatch 替换该矩形,您可以使用 Batch 绘制它。

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

关于java - 在 Scene2d Actor 中绘制形状(即 Image 或 ImageTextButton),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36776823/

相关文章:

java - 无法从我的 Android 应用程序向 Web 服务执行 HTTP 发布

java - 在 sbt 中强制执行 Scala 项目的 Java 版本?

html - 图像在屏幕上滑动 - CSS3

java - Libgdx 让灯光忽略 body

android - 如何在 libgdx 中显示纹理的反射?

java - AutoIncrement Id PostgreSQL 和 Spring Boot Data JPA

java - 如何通过两跳 SSH 隧道使用 JProfiler

cocoa-touch - 为什么在动画 block 中设置图层 anchorPoint 时我的 View 跳转?

iphone - 如何创建 iphone 的摇摆图标效果?

Android libgdx 首选项迷路了