Как нарисовать круг на экране с помощью PlayN? - PullRequest
0 голосов
/ 28 февраля 2012

Это так же просто, как и получается.Я не хочу использовать файл изображения.Скорее, я хочу программно нарисовать круг и переместить его на поверхность (как говорят в 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 ]

2 голосов
/ 28 февраля 2012

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

0 голосов
/ 28 февраля 2012

Ваш код выглядит нормально для меня ... установите canvasTransform,

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

и, пожалуйста, в целях тестирования увеличьте bg

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