Как в PlayN создать прозрачный CanvasImage?

Я написал простой пример, который, как я ожидал, сделает это. Соответствующий код вставлен ниже, полный исходный код доступен здесь.

Во-первых, метод моего игрового класса, который рисует три круга в виде изображений холста, используя метод 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;
}

Значение альфа установлено равным 0,5 для каждого круга. Но это результат, когда я запускаю версию Java:

введите здесь описание изображения

Редактировать: я обнаружил, что если я изменю альфа-значение в корневом слое, это сделает изображения прозрачными:

rootLayer.setAlpha(0.5f);

Однако я хочу сделать каждое из изображений круга независимо прозрачным с разными значениями альфа. Означает ли это, что я должен добавлять каждое изображение в отдельный слой и устанавливать прозрачность для этого слоя?


person klenwell    schedule 31.03.2012    source источник


Ответы (1)


Я смог создать независимые прозрачные круги, используя слои изображений. Это лучший способ добиться этого?

Я добавил метод asImageLayer в свой класс Circle, который создает изображение круга с помощью метода asCanvasImage, описанного выше, затем создает из него слой изображения и успешно применяет альфа-значение:

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

Результат (круги слегка хаотично двигаются, оставляя след):

введите здесь описание изображения

Это работает, но движение со временем замедляется. Проблема с производительностью?

person klenwell    schedule 31.03.2012
comment
Я понял, что проблема с производительностью связана с тем, что группа rootLayer накапливает слои. Я решил это, просто очистив его. Или, в моем случае, ограничение его размера. См. метод trimRootLayer здесь. - person klenwell; 01.04.2012