试图在 LibGDX 中画一个圆圈

Posted

技术标签:

【中文标题】试图在 LibGDX 中画一个圆圈【英文标题】:Trying to draw a circle in 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()) 画圆前必须先设置颜色。 【参考方案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 东西。

【讨论】:

以上是关于试图在 LibGDX 中画一个圆圈的主要内容,如果未能解决你的问题,请参考以下文章

围绕另一个 Sprite 旋转一个 Sprite -libGDX-

libgdx- pixmap:我能以某种方式改变线条的宽度吗?

libgdx上的无限滚动背景

libgdx getHeight() 没有覆盖整个屏幕

启动失败,LibGDX IOS 设备

Libgdx 未缩放全屏