有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java(LibGDX)更改参与者的颜色

因此,我有一个扩展了Actor的类,我试图改变它的alpha值objectPreview是该类的一种类型:

@Override
public void display() {

    ...

    // remove previous object preview from stage
    objectPreview.remove();

    ... 

    // add a translucent preview of where the object will be added
    objectPreview.getColor().a = 0.5f;
    stage.addActor(objectPreview);

    ...

    stage.draw();
}

这是我的自定义Actordraw方法:

@Override
public void draw(Batch batch, float alpha) {
    batch.enableBlending();
    batch.draw(texture, pos.x, pos.y);
}

每个帧调用display方法,objectPreview是添加到stageActor

但是,修改objectPreview的alpha值不起作用

否则,这将按预期工作,在屏幕上放置Actor的预览,并每帧清除/重画一次

我还尝试了setColor()方法,但这不起作用。即使我改变r,g,b值,也不会发生任何事情;对象仍然是原始的Actor's纹理

为什么演员的角色没有改变


共 (1) 个答案

  1. # 1 楼答案

    当您将Actor子类化时,它将由您在draw方法中应用自己的颜色。我不确定他们为什么没有将其构建到Actor类中,除了可能有很多可能使用颜色的方法,或者因为一些演员没有任何与他们相关的视觉效果,所以应用颜色会浪费时间

    首先,请注意,传递到draw方法的第二个参数是parentAlpha,而不是您标记的alpha。这是因为父母的阿尔法应该乘以孩子的阿尔法,以获得适当的淡入淡出效果

    因此,更新的draw方法应该如下所示:

    @Override
    public void draw(Batch batch, float parentAlpha) {
        batch.enableBlending(); //You can probably remove this line*
        Color color = getColor(); //keep reference to avoid multiple method calls
        batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
        batch.draw(texture, pos.x, pos.y);
    }
    
    /*    * It would only be useful if you have some custom Actors that disable blending. 
    I don't think any of the built-in actors disable blending. Since many actors will 
    require blending, it is usually best to leave it on even for fully opaque sprites, in 
    order to avoid ending up with many draw calls. */
    

    还请注意,如果您想利用Actor已经存在的scaleXscaleY字段,那么您也可以相应地修改draw方法来使用它们