首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用PlayN在屏幕上画一个圆圈?

如何用PlayN在屏幕上画一个圆圈?
EN

Stack Overflow用户
提问于 2012-02-28 07:36:15
回答 2查看 876关注 0票数 0

这是最基本的。我不想使用图像文件。相反,我想以编程的方式画一个圆圈,并将它绘制到一个曲面上(就像他们在游戏中所说的那样)。

我试着在这里遵循“使用CanvasLayers”的示例:

https://developers.google.com/playn/devguide/rendering

在我的游戏课上:

代码语言:javascript
复制
// 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类型。

然而,在链接的示例中,这就是它的使用方式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-28 16:46:58

如果您提供的代码甚至进行了编译,那么您将使用一些非常老的PlayN版本。

更新到PlayN 1.1.1并修复所产生的编译错误,您的代码就会正常工作。

下面是为使用PlayN 1.1.1更新的代码:

代码语言:javascript
复制
  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自然执行的双缓冲之外),从而生成整个屏幕的不必要副本。

票数 2
EN

Stack Overflow用户

发布于 2012-02-28 15:02:55

你的密码在我看来很好..。设置canvasTransform,

代码语言:javascript
复制
canvas.setTransform(1, 0, 0, 1, 0, 0);

为了测试的目的,请让bg更大

代码语言:javascript
复制
graphics().createImage(circleRadius,  circleRadius); (400,400)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9478065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档