【问题标题】:Trying to draw a circle in LibGDX试图在 LibGDX 中画一个圆圈
【发布时间】:2015-05-16 03:08:48
【问题描述】:

这真的很基本,但我不知道出了什么问题。基本上我试图在我的一个对象的某个区域周围画一个圆圈。我在构造函数中初始化了一个ShapeRenderer(称为srDebugCircle),并在render()方法中使用了这个for循环来绘制每个对象。

for (GameObject object : levels.get(LEVEL_INDEX)) {
        if (object.getType() == ObjectType.SWINGING_SPIKES) {
            object.draw(batch);
            srDebugCircle.begin(ShapeType.Filled);
            srDebugCircle.circle(object.getxPos() + object.getWidth()/2, object.getyPos(), object.getWidth()/2);
            srDebugCircle.setColor(Color.BLACK);
            srDebugCircle.end();
        }

        if (object.getType() == ObjectType.COIN && (Coin) object).isVisible()) {
            object.draw();
        }
        ...
}

问题是当我为圆圈添加代码时,我只看到 15 个对象中的 4 个。当我删除它/评论它时,它照常工作 - 但是,在这两种情况下,我永远看不到黑色实心圆圈。

我专门说这部分:

            srDebugCircle.begin(ShapeType.Filled);
            srDebugCircle.circle(object.getxPos() + object.getWidth()/2, object.getyPos(), object.getWidth()/2);
            srDebugCircle.setColor(Color.BLACK);
            srDebugCircle.end();

谁能明白我为什么会遇到这个问题?

【问题讨论】:

  • 我认为您在引号之间缺少括号。也许不是原因。(object.getType() == ObjectType.COIN && "("(Coin) object).isVisible())
  • 画圆前必须先设置颜色。

标签: java android libgdx 2d render


【解决方案1】:

Springrbua 的替代方案是使用 Pixmaps 而不是 ShapeRenderer 进行绘制。在 SpriteBatch 和 ShaperRenderer 之间切换是一项昂贵的操作,并且 Pixmap 不需要结束 SpriteBatch。 Pixmap 提供的绘制方法比 ShapeRenderer 少,但它确实包括绘制一个实心圆。

Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888);
pixmap.setColor(Color.BLACK);
pixmap.fillCircle(x, y, r);
Texture texture = new Texture(pixmap);

// render
batch.begin();
batch.draw(texture, x, y);
batch.end();

【讨论】:

  • 在屏幕上进行内存管理后,您应该始终使用 pixmap.dispose() 和 texture.dispose()
【解决方案2】:

问题是,你有两个Renderer/Batches 同时运行:
SpriteBatch batchShapeRenderer srDebugCircle
这可能会导致奇怪的行为。
要解决此问题,请先调用end() 获取一个Renderer/Batch,然后再调用begin() 获取另一个。
在您的情况下,它看起来像这样:

object.draw(batch);
batch.end()
srDebugCircle.begin(ShapeType.Filled);
srDebugCircle.setColor(Color.BLACK);    // Set Color before drawing
srDebugCircle.circle(object.getxPos() + object.getWidth()/2, object.getyPos(), object.getWidth()/2);
srDebugCircle.end();

另请注意,在SpriteBatch 上调用end() 会调用flush(),应尽可能少地调用它。因此,最好先用SpriteBatch 绘制所有东西,然后再绘制所有ShapeRenderer 东西。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2014-11-15
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多