我几年没与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));
答案 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();
}