如何使用PlayN在屏幕上绘制圆圈?

时间:2012-02-28 07:36:15

标签: playn

这是基本的。我不想使用图像文件。相反,我想以编程方式绘制一个圆圈并将其blit到一个表面(正如他们在pygame中所说的那样)。

我尝试按照“使用CanvasLayers”示例进行操作:

https://developers.google.com/playn/devguide/rendering

从我的游戏课程中:

// Surface
SurfaceLayer surface;

// Background
int width = 640;
int height = 480;
//ImageLayer bgLayer;
CanvasImage bgImage;
Canvas canvas;

// Circle
CanvasImage circleImage;
//ImageLayer circleLayer;
int circleRadius = 20;
int circleX = 0;
int circleY = 0;


@Override
public void init() {

    // create a surface
    surface = graphics().createSurfaceLayer(width, height);
    graphics().rootLayer().add(surface);

    // create a solid background
    // http://code.google.com/p/playn101/source/browse/core/src/main/java/playn101/core/J.java#81
    bgImage = graphics().createImage(width, height);
    canvas = bgImage.canvas();
    canvas.setFillColor(0xff87ceeb);
    canvas.fillRect(0, 0, width, height);
    //bgLayer = graphics().createImageLayer(bgImage);
    //graphics().rootLayer().add(bgLayer);

    // create a circle
    circleImage = graphics().createImage(circleRadius,  circleRadius);
    canvas = circleImage.canvas();
    canvas.setFillColor(0xff0000eb);
    canvas.fillCircle(circleX, circleY, circleRadius);
    //circleLayer = graphics().createImageLayer(circleImage);
    //graphics().rootLayer().add(circleLayer);
}

@Override
public void paint(float alpha) {
    // the background automatically paints itself, so no need to do anything
    // here!
    surface.clear(0);
    surface.drawImage(bgImage, 0, 0);
    surface.drawImage(circleImage, 100, 100);
}

但我在Java中得到一个空白窗口,Eclipse抱怨道:

  

未定义类型的drawImage(CanvasImage,int,int)方法   SurfaceLayer

然而,这是在链接示例中使用的方式。

2 个答案:

答案 0 :(得分:2)

如果您提供的代码甚至编译,那么您正在使用一些非常旧版本的PlayN。

更新到PlayN 1.1.1并修复导致的编译错误,您的代码将正常工作。

以下是您的代码已更新,可与PlayN 1.1.1配合使用:

  private SurfaceLayer surface;
  private CanvasImage bgImage;
  private CanvasImage circleImage;

  @Override
  public void init() {
    // create a surface
    int width = graphics().width(), height = graphics().height();
    surface = graphics().createSurfaceLayer(width, height);
    graphics().rootLayer().add(surface);

    // create a solid background
    bgImage = graphics().createImage(width, height);
    Canvas canvas = bgImage.canvas();
    canvas.setFillColor(0xff87ceeb);
    canvas.fillRect(0, 0, width, height);

    // create a circle
    int circleRadius = 20;
    int circleX = 0;
    int circleY = 0;
    circleImage = graphics().createImage(circleRadius,  circleRadius);
    canvas = circleImage.canvas();
    canvas.setFillColor(0xff0000eb);
    canvas.fillCircle(circleX, circleY, circleRadius);
  }

  @Override
  public void paint(float alpha) {
    Surface s = surface.surface();
    s.clear();
    s.drawImage(bgImage, 0, 0);
    s.drawImage(circleImage, 100, 100);
  }

如果您真的打算使用此方法制作游戏,则应使用ImmediateLayer而不是SurfaceLayerImmediateLayer将直接针对帧缓冲发出drawImage等调用。 SurfaceLayer将制作一个离屏帧缓冲区并将所有内容渲染到其中,然后将每个帧中的屏幕外帧缓冲区复制到主帧缓冲区(除了由OpenGL自然执行的双缓冲等),从而产生整个屏幕的不必要副本。

答案 1 :(得分:0)

你的代码对我来说很好...... 设置canvasTransform,

canvas.setTransform(1, 0, 0, 1, 0, 0);

请出于测试目的使bg更大

graphics().createImage(circleRadius,  circleRadius); (400,400)