2012-04-04 30 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

相关问题