J'ai écrit un exemple simple que je m'attendais à le faire. Le code pertinent est collé ci-dessous, source complète disponible here.Dans PlayN, comment créer une CanvasImage transparente?
D'abord, la méthode de ma classe de jeu qui attire trois cercles comme des images de toile en utilisant la méthode asCanvasImage
sur ma Circle
classe:
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);
}
Et puis asCanvasImage
méthode de ma Circle
classe:
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;
}
La valeur alpha est définie sur 0,5 pour chaque cercle. Mais cela est le résultat quand je lance la version Java:
Edit: j'ai découvert que si je change la valeur alpha sur le rootLayer, il rend les images transparentes:
rootLayer.setAlpha(0.5f);
Cependant, je souhaite que chacune des images du cercle soit indépendamment transparente avec des valeurs alpha différentes. Cela signifie-t-il que je dois ajouter chaque image à son propre calque et définir la transparence sur ce calque?
J'ai compris que le problème de performance était dû aux couches d'accumulation du groupe rootLayer. Je l'ai résolu en le nettoyant simplement. Ou, dans mon cas, en limitant sa taille. Voir la méthode trimRootLayer [ici] (http://code.google.com/p/klenwell/source/browse/trunk/projects/java/playndev/playndev/core/src/main/java/com/googlecode/klenwell/playndev /core/PlaynDev.java#100). – klenwell