2012-03-31 38 views
1

我寫了一個簡單的例子,我期望能做到。相關代碼粘貼在下方,完整源代碼可用here在PlayN中,如何創建透明的CanvasImage?

首先,我的遊戲類的,吸引我的Circle類三圈與使用asCanvasImage方法畫布圖像的方法:

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

然後asCanvasImageCircle類的方法:

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值使每個圓形圖像獨立透明。這是否意味着我必須將每個圖像添加到其自己的圖層並在該圖層上設置透明度?

回答

2

我能夠使用圖像層創建獨立的透明圓圈。這是完成這個最好的方法嗎?

我加入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

它的工作原理,但運動似乎隨着時間的推移放緩。性能問題?

+0

我想出性能問題是由於rootLayer組積累圖層造成的。我通過清除它來解決它。或者,就我而言,限制它的大小。請參閱trimRootLayer方法[此處](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 2012-04-01 00:06:44