2012-02-29 38 views
0

這是一個後續行動,我的最後一個問題:如何使用PlayN爲一個圓圈設置動畫?

How can I draw a circle to the screen with PlayN?

對於我的簡單的情況下,我想以編程方式創建一個單一的彩色圓圈和移動它在一個2-d平原(不需要使用box2d lib)。

一個真實世界的例子可能涉及動畫幾個圈子。這種情況下,兩個真實的例子(對不起,我不得不刪除鏈接 - 沒有足夠的因果報應!):

  • Browsmos爲Chrome
  • 螞蟻AI挑戰

這是爲迴應我的最後一個問題而提出的建議,我想使用ImmediateLayer class,所以我期待了解如何正確地將其納入我的遊戲循環。

這裏是我的代碼示例:

public class SimpleCircleAnimation implements Game { 

    // Surface  
    private GroupLayer rootLayer; 
    private ImmediateLayer surface; 
    private Canvas canvas; 

    private Circle circle; 
    private CanvasImage circleImage;   

    @Override 
    public void init() { 
     // create root layer 
     rootLayer = graphics().rootLayer(); 

     // a simple circle object 
     int circleX = 0; int circleY = 0; 
     int circleRadius = 20; 
     circle = new Circle(circleX, circleY, circleRadius); 

     // create an immediate layer and add to root layer 
     ImmediateLayer circleLayer = graphics().createImmediateLayer(new ImmediateLayer.Renderer() { 
      public void render (Surface surf) { 
       circleImage = graphics().createImage(circle.radius*2, circle.radius*2); 
       canvas = circleImage.canvas(); 
       canvas.setFillColor(0xff0000eb); 
       canvas.fillCircle(circle.radius, circle.radius, circle.radius); 
       surf.drawImage(circleImage, circle.x, circle.y); 
      } 
     }); 
     rootLayer.add(circleLayer); 
    } 

    @Override 
    public void paint(float alpha) { 
    } 

    @Override 
    public void update(float delta) { 
     // move circle 
     int newX = circle.x + 4; int newY = circle.y + 4; 
     circle.setPoint(newX, newY); 
    } 

    @Override 
    public int updateRate() { 
     return 25; 
    } 
} 

這成功地移動一圈下來對角線屏幕從左至右。幾個問題:

  • 這是否正確實施?
  • 對於多個動畫圓的情況,ImmediateLayer的想法是,您將爲Renderer回調中的每個圓創建一個圓形圖像?或者你可能會爲每個圓圈創建一個立即圖層並將它們添加到根層?
+0

讓我們來看看,如果我可以在這裏添加的例子鏈接:[Browsmos(HTTP:// html5games。 com/2011/06/browsmos /),[Ant AI Challenge](http://aichallenge.org/visualizer.php?game=346330) – klenwell 2012-02-29 04:09:58

回答

0

我不會使用具有渲染(Surface surf)適配器的ImmediateLayer。這裏u有,裏面的渲染圖像的方法創作

circleImage = graphics().createImage(circle.radius*2, circle.radius*2); 

只是把這個在使用普通層paint方法

surf.drawImage(circleImage, circle.x, circle.y); 

和u應該罰款

繪畫在繪畫方法中完成,並且不要在那裏進行計算 更新用於計算,面向物理的東西

+0

感謝您的迴應。這個建議與@samskivert給出的相反:http://stackoverflow.com/a/9486105/1093087。對於我描述的情況,他建議使用ImmediateLayer將獲得更好的性能。 – klenwell 2012-03-03 04:20:05

+0

比聽到samskivert的答案...我不知道什麼是你的確切實現,但如果他說應該立即他很可能是正確的 – Darwly 2012-03-03 19:39:23

+0

我的具體情況是以編程方式創建圖像(繪製一個圓圈,移動它)而不是動畫加載的圖像文件/精靈。然而,CuteGame正在使用ImmediateLayer加載的圖像,所以我不太確定參數是否反對使用ImmediateLayer。 – klenwell 2012-03-03 20:26:29