在LibGDX中尝试绘制一个圆形

3

这很基础,但我无法弄清楚出了什么问题。基本上,我正在尝试在我的某个对象的特定区域周围画一个圆。我在构造函数中初始化了一个ShapeRenderer(称为srDebugCircle),并在render()方法中有一个循环来绘制每个对象。

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()) - BillHaggerty
在绘制圆形之前,您必须设置颜色。 - Murat Karagöz
2个回答

5

除了Springrbua的答案之外,另一种方法是使用Pixmaps而不是ShapeRenderer进行绘制。在SpriteBatch和ShaperRenderer之间切换是昂贵的操作,而Pixmaps不需要结束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();

1
在屏幕绘制后,为了内存管理,您应该始终使用 pixmap.dispose() 和 texture.dispose()。 - MarsPeople

3
问题是,您同时运行了两个Renderer/Batch
SpriteBatch batchShapeRenderer srDebugCircle
这可能导致奇怪的行为。
要解决问题,请在调用另一个Renderer/Batchbegin()之前,调用其中一个Renderer/Batchend()
在您的情况下,代码可能如下所示:

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中的所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接