这是最基本的。我不想使用图像文件。相反,我想以编程的方式画一个圆圈,并将它绘制到一个曲面上(就像他们在游戏中所说的那样)。
我试着在这里遵循“使用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类型。
然而,在链接的示例中,这就是它的使用方式。
发布于 2012-02-28 16:46:58
如果您提供的代码甚至进行了编译,那么您将使用一些非常老的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自然执行的双缓冲之外),从而生成整个屏幕的不必要副本。
发布于 2012-02-28 15:02:55
你的密码在我看来很好..。设置canvasTransform,
canvas.setTransform(1, 0, 0, 1, 0, 0);为了测试的目的,请让bg更大
graphics().createImage(circleRadius, circleRadius); (400,400)https://stackoverflow.com/questions/9478065
复制相似问题