В PlayN, как мне создать прозрачный CanvasImage? - PullRequest
1 голос
/ 31 марта 2012

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

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

enter image description here

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

rootLayer.setAlpha(0.5f);

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

1 Ответ

2 голосов
/ 31 марта 2012

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

Я добавил метод 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);
}

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

enter image description here

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

...