2012-04-04 34 views
0

我已經創建了一個簡單的例子:背景表面層和10個小「點」(10個表面層10x10像素,每個填充顏色通過fillRect())。 Paint方法簡單地圍繞週期性地移動點:我應該在每一幀重新繪製SurfaceLayer嗎?

private SurfaceLayer background; 
private List<Layer> dots = new ArrayList<Layer>(); 

@Override 
public void init() 
{ 
    background = graphics().createSurfaceLayer(graphics().width(), graphics().height()); 
    background.surface().setFillColor(Color.rgb(100, 100, 100)); 
    background.surface().fillRect(0, 0, graphics().width(), graphics().height()); 
    graphics().rootLayer().add(background); 

    for (int i = 0; i < 10; i++) 
    { 
     SurfaceLayer dot = graphics().createSurfaceLayer(10, 10); 
     dot.surface().clear(); 
     dot.surface().setFillColor(Color.rgb(250, 250, 250)); 
     dot.surface().fillRect(0, 0, 10, 10); 
     dot.setDepth(1); 
     dot.setTranslation(random()*graphics().width(), random()*graphics().height()); 
     dots.add(dot); 

     graphics().rootLayer().add(dot); 
    } 
} 

@Override 
public void paint(float alpha) 
{ 
    for (Layer dot : dots) 
    { 
     if (random() > 0.999) 
     { 
      dot.setTranslation(random()*graphics().width(), random()*graphics().height()); 
     } 
    } 
} 

不知何故java版繪製所有點而HTML和Android版本借鑑,只有1

手冊沒有明確說,如果我要重新繪製所有這些點在每次paint()調用中。據我瞭解,SurfaceLayer適用於不修改每一幀圖層的情況(這樣可以重複使用相同的緩衝區?),但這不起作用。

那麼你們可以幫助我正確使用SurfaceLayer嗎?如果我只是在SurfaceLayer上填充了一個矩形 - 它會永久保留在這個層上,還是應該在每次調用paint時填充它?如果是 - 這與ImmeadiateLayer不同嗎?

回答

1

您不需要在每次調用繪製時重繪表面圖層。如您所示,只有在準備時才繪製它,並且您繪製的紋理將在每幀中呈現,而無需您採取進一步的操作。

如果Android和HTML後端未繪製所有表面圖層,則必須有一個錯誤。我會盡力重現你的測試,看看它是否適合我。

一注:創建一個巨大的表面和屏幕的大小,並繪製一個純色,它是一個巨大的紋理內存浪費。只需創建一個在每幀上調用fillRect()的ImmediateLayer,這比創建大量覆蓋屏幕的紋理效率更高。

+0

我在PlayN表面測試中添加了一個類似於您的測試,它們在Java,HTML和Android上對我的工作很好。所以也許別的東西是錯的? – samskivert 2012-04-04 21:30:50

+0

現在,這裏是一個測試遊戲:http://speedy.sh/Q56mx/test-game.tar.gz 我啓動它: MVN全新安裝 MVN測試-Ptest-HTML 然後打開本地主機: 8080在FF或Chrome中 - 它顯示一個白點的黑屏。 也許你可以看看代碼並快速找到錯誤?或者分享你的測試,以便我可以自己解決問題。 – user1312030 2012-04-06 16:12:35

相關問題