2012-03-31 3 views
1

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:

enter image description here

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?

Répondre

2

J'ai été capable de créer des cercles transparents indépendants en utilisant des couches d'images. Est-ce la meilleure façon d'accomplir cela?

I a ajouté une méthode asImageLayer à ma classe Circle qui crée une image de cercle en utilisant la méthode asCanvasImage ci-dessus puis crée une couche d'image de celle et applique avec succès la valeur alpha:

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

Ma méthode de classe de jeu qui appelle asImageLayer qui à son tour est appelée par la méthode 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); 
} 

le résultat (cercles se déplace légèrement au hasard, en laissant une trace):

enter image description here

Il fonctionne, mais le mouvement semble ralentir au fil du temps. Problème de performance?

+0

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

Questions connexes