这是基本的。我不想使用图像文件。相反,我想以编程方式绘制一个圆圈并将其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
然而,这是在链接示例中使用的方式。
答案 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而不是SurfaceLayer
。 ImmediateLayer
将直接针对帧缓冲发出drawImage等调用。 SurfaceLayer
将制作一个离屏帧缓冲区并将所有内容渲染到其中,然后将每个帧中的屏幕外帧缓冲区复制到主帧缓冲区(除了由OpenGL自然执行的双缓冲等),从而产生整个屏幕的不必要副本。
答案 1 :(得分:0)
你的代码对我来说很好...... 设置canvasTransform,
canvas.setTransform(1, 0, 0, 1, 0, 0);
请出于测试目的使bg更大
graphics().createImage(circleRadius, circleRadius); (400,400)