【问题标题】:How to set the position of Actor subclass ignoring the position in draw method如何设置Actor子类的位置忽略draw方法中的位置
【发布时间】:2014-01-31 10:57:27
【问题描述】:

我有这门课:

public class MyActor extends Actor{
TextureRegion region;

public MyActor(TextureRegion region)
{
    this.region = region;
}

@Override
public void draw(Batch batch, float parentAlpha) {
    super.draw(batch, parentAlpha);
    batch.draw(region, 0, 0);
}

}

我在这里像这样使用它:

public class MyGame implements ApplicationListener {

Stage stage;
MyActor myActor;

@Override
public void create() {
    stage = new Stage(0, 0, false);
    myActor = new MyActor(new TextureRegion(new Texture(
            Gdx.files.internal("texture.png"))));

    myActor.setPosition(200, 50);
    stage.addActor(myActor);

}

@Override
public void render() {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
}
}

MyActor 类中,我将演员的位置设置为(0, 0)。我只是将其用作某种默认值,因为我希望能够在它实际绘制在舞台上之前改变它的位置。原因是我有几个MyActor 对象,我想把它们都画在舞台上但在不同的位置。

所以我做了myActor.setPosition(200, 50);,但是没有用。

我的问题:如何在舞台上绘制myActor 的位置不是draw(Batch, float) 中设置的位置?

【问题讨论】:

    标签: java android libgdx stage


    【解决方案1】:
    public void draw(Batch batch, float parentAlpha) {
        super.draw(batch, parentAlpha);
        batch.draw(region, 0, 0);
    }
    

    在此处删除super.draw 调用。现在它不应该做任何事情,如果它会做任何事情,它可能会导致问题。

    此外,您还抱怨您的演员职位未被使用。那是因为你没有使用它。

    试试这样的:

    public void draw(Batch batch, float parentAlpha) {
        batch.draw(region, getX(), getY());
    }
    

    【讨论】:

    • 但我们为什么要在 Actor 内部使用 getX()、getY() 呢?我的意思是,如果我们仍然需要根据一些外部值来计算位置,我们为什么还需要演员..
    • Actor 是 Scene2D 的一部分,它是一个场景图。场景图中的每个节点都有一个相对于其父节点的局部坐标系。所以 getX() 和 getY() 返回 local 坐标。结果位置基于外部值,但您不必关心这一点。场景图会为您解决这个问题。如果您的场景中没有实体的层次结构,那么几乎没有优势。除了能够注册 EventListener 来处理点击等。
    【解决方案2】:

    您可以扩展Image,而不是扩展Actor,它是Actor 的子类。 Image 已经拥有一个Drawable(你可以在TextureRegionDrawable 的构造函数中使用你的TextureRegion)。然后在您的Image-子类中,您可以覆盖draw(Batch batch, float parentAlpha),如有必要,请执行一些控制并调用suoer.draw(batch, parentAlpha),您的Actor 将在右侧positionrotationscale 绘制。 .

    编辑: ImageWidget 的子类。 Widget 本身扩展了 Actor。 来自 LibGDX Api:

    在小部件范围内以各种方式显示 Drawable。这 首选尺寸是可绘制的最小尺寸。仅当使用 TextureRegionDrawable 将actor的缩放、旋转和原点 绘图时使用。

    因此,如果您使用 TextureRegionDrawable,它还将处理您设置为 Actor 的旋转、缩放和原点,如果您需要的话。它拥有Actor 类所拥有的一切以及MORE

    另一个编辑:正如你所说,你必须存储其他数据,你可以简单地拥有你的MyActor extends Image。在您的MyActor 中,您可以存储您需要的所有数据,但您不再需要存储图像并且您不必再关心绘图了。所以这只是一个建议。

    【讨论】:

    • 您能否告诉我拒绝投票的原因,以便我改进我的答案并帮助其他人。谢谢
    • 我无法扩展图像,因为 MyActor 类不仅仅是图像。
    • Image 拥有 Actor 所做的一切,甚至更多。因此,如果您扩展 Actor 并将 TextureRegion 存储在其中,您与直接扩展 Image 或多或少相同。
    • 我的意思是我只在上面显示的示例中显示了TextureRegion,但在我的实际代码中MyActor 还存储了String
    • 您可以让“MyActor”扩展“Image”并仅存储“String”。 Drawable 已经存储在超类 Image 中。如果你设置了位置和其他一切都正确,你就不必再关心绘图了。
    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多