如何使用PlayN为圆圈设置动画?

时间:2012-02-29 04:07:38

标签: playn

这是对我上一期提问的跟进:

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

对于我的简单情况,我想以编程方式创建一个彩色圆圈并将其移动到二维平面(不需要使用box2d lib)。

一个真实的例子可能涉及动画几个圆圈。本案例的两个真实案例(抱歉,我不得不删除链接 - 不够业力!):

  • Browsmos for Chrome
  • Ants AI Challenge

我在回答上一个问题时建议我想使用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回调中的每个圆创建一个圆圈图像?或者您是否可以为每个圆创建一个立即图层并将其添加到根图层?

2 个答案:

答案 0 :(得分:0)

我不会使用ImmediateLayer与渲染(Surface surf)适配器。你在这里创建了一个图像

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

把它放在paint方法

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

使用普通图层,你应该没问题

绘画是用paint方法完成的,不要在那里进行计算 更新用于计算和面向物理的东西

答案 1 :(得分:0)

我在PlayN示例中的Cute Game源中发现了ImmediateLayer使用的详细实例:

CuteGame.java (code.google.com)