在PlayN中,如何创建透明的CanvasImage?

时间:2012-03-31 04:41:52

标签: playn

我写了一个我希望会做的简单例子。相关代码粘贴在下方,完整的源代码here

首先,我的游戏类使用asCanvasImage类上的Circle方法将三个圆绘制为画布图像的方法:

public void drawThreeTransparentCircles() {
    // create an immediate layer and add to root layer
    ImmediateLayer circleLayer = graphics().createImmediateLayer(
            new ImmediateLayer.Renderer() {
                public void render(Surface surf) {
                    Circle redCircle = new Circle(-25, 0, 50, Color.rgb(
                            255, 0, 0), 0.5f);
                    Circle whiteCircle = new Circle(0, 0, 50, Color.rgb(
                            255, 255, 255), 0.5f);
                    Circle blueCircle = new Circle(25, 0, 50, Color.rgb(0,
                            0, 255), 0.5f);
                    surf.drawImage(redCircle.asCanvasImage(),
                            redCircle.getScreenX(), redCircle.getScreenY());
                    surf.drawImage(whiteCircle.asCanvasImage(),
                            whiteCircle.getScreenX(),
                            whiteCircle.getScreenY());
                    surf.drawImage(blueCircle.asCanvasImage(),
                            blueCircle.getScreenX(),
                            blueCircle.getScreenY());
                }
            });

    rootLayer.add(circleLayer);
}

然后asCanvasImage类的Circle方法:

public CanvasImage asCanvasImage() {
    int diameter = radius * 2;
    CanvasImage circleImage = graphics().createImage(diameter, diameter);
    Canvas canvas = circleImage.canvas();
    canvas.setFillColor(color);
    canvas.fillCircle((float) radius, (float) radius, (float) radius);
    canvas.setAlpha(alpha);
    return circleImage;
}

每个圆圈的alpha值设置为0.5。但这是我运行Java版本时的结果:

enter image description here

编辑:我发现如果我更改rootLayer上的alpha值,它会使图片透明:

rootLayer.setAlpha(0.5f);

但是我希望每个圆形图像都能以不同的alpha值独立透明。这是否意味着我必须将每个图像添加到其自己的图层并在该图层上设置透明度?

1 个答案:

答案 0 :(得分:2)

我能够使用图像层创建独立的透明圆圈。这是实现这一目标的最佳方式吗?

我在我的asImageLayer课程中添加了Circle方法,该方法使用上面的asCanvasImage方法创建圆形图像,然后从中创建图像图层并成功应用Alpha值:

public ImageLayer asImageLayer() {
    CanvasImage image = asCanvasImage();
    ImageLayer imageLayer = graphics().createImageLayer(image);
    imageLayer.setAlpha(alpha);
    imageLayer.transform().translate(getScreenX(), getScreenY());
    return imageLayer;
}

我调用asImageLayer的游戏类方法,后者又被paint方法调用:

public void drawTransparentImageLayers() {
    GroupLayer groupLayer = graphics().createGroupLayer();
    groupLayer.add(bgLayer);
    groupLayer.add(redCircle.asImageLayer());
    groupLayer.add(whiteCircle.asImageLayer());
    groupLayer.add(blueCircle.asImageLayer());
    rootLayer.add(groupLayer);
}

结果(圆圈随意稍微移动,留下痕迹):

enter image description here

它有效,但随着时间的推移,运动似乎会减慢。性能问题?