【问题标题】:Pixmaps or Textures for dynamicalliy colored graphics in LibGdx?LibGdx中动态彩色图形的像素图或纹理?
【发布时间】:2019-06-19 15:34:33
【问题描述】:

我试图创建一个包含精灵的动态数组,它是从像素图纹理创建的。我也想给这个数组元素随机不同的颜色。 没有一个工作。

然后我尝试创建一个像素图。这也显示了相同的行为。

我在show() 中创建了一个像素图,如下所示:

pixmap = new Pixmap(128, 128, Format.RGBA8888);
Pixmap.setBlending(Pixmap.Blending.None);
pixmap.setColor(128, 0, 0, 1f);
pixmap.fillCircle(64, 64, 64);
texture = new Texture(pixmap);
pixmap.dispose();

render()

sprite = new Sprite(texture);
sprite.setPosition(b.getX()-sprite.getWidth()/2, b.getY()-sprite.getHeight()/2);
sprite.draw(batch);

每当我给出一个 rgb 颜色代码时,它都会给出一些不同的颜色或黑色作为输出。也尝试了十六进制代码。

我在这里做错了什么?

以前我使用像素图作为叠加和单一纹理等。但没有深入尝试。

在这里,我打算用像素图绘制实心圆,而不是使用图形。因为我的游戏元素是非常简单的实心圆圈和我应该实现的 10 多种颜色。

这些圆形对象将在整个游戏中动态生成。

现在我想知道我计划做的事情对像素图是否有效。我在网上没有找到示例。

是否可以创建具有不同颜色对象的动态数组?

或者与像素图相比,使用图形是更好的选择?

如果我得到有经验的人的建议会非常有帮助。

【问题讨论】:

    标签: libgdx


    【解决方案1】:

    r,g,b,a 值应在 0f 到 1f 的范围内。在render() 中创建新的精灵是很糟糕的,因为它每帧都会被调用。

    我将尝试用这个小代码示例来回答您的问题(在代码中留下 cmets):

    public class MyGdxGame extends ApplicationAdapter {
    
        SpriteBatch spriteBatch;
    
        Pixmap pixmap;
        Texture texture;
    
        Array<Sprite> sprites = new Array<Sprite>();
    
        @Override
        public void create() {
            spriteBatch = new SpriteBatch();
    
            // you should use only one Pixmap object and one Texture object
            pixmap = new Pixmap(128, 128, Pixmap.Format.RGBA8888);
            pixmap.setBlending(Pixmap.Blending.None);
            pixmap.setColor(Color.WHITE);
            pixmap.fillCircle(64, 64, 64);
            texture = new Texture(pixmap);
            pixmap.dispose();
    
            // generate sprites with different colors
            // r,g,b,a values should be in range from 0f to 1f
            addCircleSprite(128f / 255f, 0f, 0f, 1f);
            addCircleSprite(0.4f, 0.2f, 0.5f, 1f);
            addCircleSprite(0.6f, 0f, 1f, 1f);
            addCircleSprite(0.3f, 0.8f, 1f, 1f);
            addCircleSprite(0.1f, 1f, 1f, 1f);
        }
    
        void addCircleSprite(float r, float g, float b, float a) {
            // every sprite references on the same Texture object
            Sprite sprite = new Sprite(texture);
            sprite.setColor(r, g, b, a);
            // I just set random positions, but you should handle them differently of course
            sprite.setCenter(
                MathUtils.random(Gdx.graphics.getWidth()),
                MathUtils.random(Gdx.graphics.getHeight()));
            sprites.add(sprite);
        }
    
        @Override
        public void render() {
            Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            spriteBatch.begin();
            for (Sprite sprite : sprites) {
                sprite.draw(spriteBatch);
            }
            spriteBatch.end();
        }
    
        @Override
        public void dispose() {
            texture.dispose();
        }
    }
    

    还阅读此Q/A。我想你可以从带有白色圆圈的 .png 文件中加载 Texture 对象:

    texture = new Texture("whiteCircle.png");
    

    但是创建半径只有 64 像素的Pixmap 圆(然后从中创建一个Texture)也可以,应该没什么区别。

    【讨论】:

    • 感谢您的回答!我阅读了示例代码并以我的方式实现了它。现在有许多问题悬而未决。它现在显示正确的颜色。但没有得到一个平滑的圆圈。而且我从来没有加载了这样一个白色圆圈的图像。我找不到它的用途。如果你解释一下会很有帮助。
    • 像素图圆不平滑的原因是因为您对圆中的所有像素使用相同的颜色。您无法使用方形像素创建圆的平滑边缘,但为了使其看起来平滑,您可以在边缘添加一些部分透明的像素。尝试自己执行此操作将是矫枉过正,因此这是从文件加载纹理的另一个原因。只需使用一些图形编辑器创建一个平滑的圆圈并加载它。 stackoverflow.com/questions/33262697/…
    • 另外,您可能需要在游戏中添加其他纹理。建议将所有纹理放在图集中,这样它们都是同一纹理的一部分。它将减少加载时间和纹理绑定的数量。如果您像现在一样以编程方式创建像素图圆圈,它们将代表一个单独的纹理,这意味着它们总是会导致额外的纹理绑定。您应该阅读以下内容:github.com/mattdesl/lwjgl-basics/wiki/Textures
    • 所以你建议我使用白色圆圈图形而不是创建像素图对象?这是更好的方法吗?
    • 是的,我将引用我在回答中留下的链接:“Pixmap 应该只用于需要动态更改或作为缓存形式生成的纹理。”。我假设,您不需要动态更改圆形纹理(即更改纹理中的实际像素,而不是精灵的颜色/大小/等)。
    【解决方案2】:

    setColor() 接受rgba 参数将其转换为rgba8888 格式-

    public void setColor (float r, float g, float b, float a) {
        color = Color.rgba8888(r, g, b, a);
    }
    

    所以将rgb 和 alpha 分量设置为 [0,1] 范围内的浮点数。

    使用

    pixmap.setColor(128f/255, 0, 0, 1f);
    

    而不是

    pixmap.setColor(128, 0, 0, 1f);
    

    如果你想使用十六进制,那么 -

    Color color = new Color(0x000000a6) //(Black with 65% alpha).
    

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多