0

这几乎是最基本的。我不想使用图像文件。相反,我想以编程方式绘制一个圆圈并将其粘贴到一个表面(正如他们在 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 抱怨:

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

但是,这是链接示例中使用它的方式。

4

2 回答 2

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 自然执行的双缓冲等),从而导致整个不必要的副本屏幕。

于 2012-02-28T16:46:58.540 回答
0

你的代码对我来说看起来不错......设置canvasTransform,

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

并请出于测试目的使 bg 更大

graphics().createImage(circleRadius,  circleRadius); (400,400)
于 2012-02-28T15:02:55.163 回答