2012-02-29 73 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