0

这是我最后一个问题的后续:

如何使用 PlayN 在屏幕上画一个圆圈?

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

一个现实世界的例子可能涉及为几个圆圈设置动画。此案例的两个真实示例(抱歉,我不得不删除链接 - 业力不足!):

  • Chrome 浏览器
  • 蚂蚁人工智能挑战赛

在回答我的最后一个问题时建议我使用ImmediateLayer 类,因此我希望了解如何将其正确地合并到我的游戏循环中。

这是我的代码示例:

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 回调中的每个圆圈创建一个圆圈图像吗?或者您可能会为每个圆圈创建一个即时图层并将其添加到根图层?
4

2 回答 2

0

我不会使用带有渲染(Surface surf)适配器的 ImmediateLayer。在这里,您在图像的渲染方法中创建

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

把它放在paint方法中

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

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

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

于 2012-03-02T08:40:34.273 回答
0

我在 PlayN 示例中的可爱游戏源中发现了 ImmediateLayer 使用的详细实际示例:

CuteGame.java (code.google.com)

于 2012-03-03T04:57:35.627 回答