LibGDX pixmap无法正确更新像素

时间:2016-05-04 15:08:19

标签: libgdx pixmap

我正在努力创造" destructable"使用Pixmap在LibGDX中进行地形(2D)。 但是,我设置的颜色无法在屏幕上正确显示。

完整源代码(当前颜色用于调试,发布时应为alpha = 0):

public class Terrain extends Actor implements Disposable {
private Sprite mySprite;
private Texture myTexture;
private Pixmap myMap;

public Terrain(Texture texture, Vector2 position)
{
    setPosition(position.x, position.y);
    if (!texture.getTextureData().isPrepared()) {
        texture.getTextureData().prepare();
    }
  // Final product will take original image from a texture to create pixmap
  //  myMap = texture.getTextureData().consumePixmap();
    myMap = new Pixmap(400, 400, Pixmap.Format.RGBA8888);
    myMap.setBlending(Pixmap.Blending.SourceOver);
    myMap.setColor(Color.BLUE);
    myMap.fillRectangle(0, 0, 400, 400);
    myTexture = new Texture(myMap, Pixmap.Format.RGBA8888, false);
    mySprite = new Sprite(myTexture);
}

public void removePixels(List<Vector2> pixels)
{
    myMap.setColor(Color.GREEN);
    myMap.fillCircle(1,1,1);
    myMap.setColor(Color.YELLOW);
    for (Vector2 pixel:pixels) {
        myMap.fillCircle((int)pixel.x, (int)pixel.y, 1); // Works, but is Black?
        myMap.drawPixel((int)pixel.x, (int)pixel.y, 255) // Does not work
    }
    myTexture = new Texture(myMap, Pixmap.Format.RGBA8888, false);
    mySprite = new Sprite(myTexture);

    System.out.println("Pixels Removed");
}

@Override
public void draw(Batch batch, float parentAlpha) {
    batch.draw(mySprite, getX(), getY(), mySprite.getWidth(), mySprite.getHeight());
 //   batch.draw(myMap, getX(), getY(), myMap.getWidth(), myMap.getHeight());
}

@Override
public void dispose() {
    myMap.dispose();
}

由于某种原因,fillCircle中绘制的形状始终为黑色,而使用drawPixel绘制的像素似乎甚至不更新(保持原始颜色)。 如何在LibGDX中设置像素(alpha为0)? (最好不使用glsl)

1 个答案:

答案 0 :(得分:1)

当您拨打drawCircle(x, y, 1)时,您传入的是RGBA8888颜色1,相当于我认为R = 0,G = 0,B = 0,A = 1/255。当你调用.drawPixel((int)pixel.x, (int)pixel.y, 255)时,你传入的是RGBA8888颜色255,我认为它是R = 0,G = 0,B = 0,A = 1。在这两种情况下,调用都会忽略您在像素图上设置的最后一种颜色。使用不带颜色参数的这些方法的版本。

我看到其他一些错误。如果您不处理旧纹理,每次拨打myTexture = new Texture(...)时都会泄漏纹理。但实际上你应该将更新的像素图绘制到纹理上,这可能更快。 myTexture.draw(myMap, 0, 0);此外,如果您没有使用sprite.draw,则没有理由使用Sprite对象。如果你使用batch.draw绘制一个精灵,你也可以使用TextureRegion。