Если код, который вы предоставили, даже компилируется, то вы используете очень старую версию 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 и т. Д.), Что приводит к ненужной копиивсего вашего экрана.