3

我正在使用 libGDX 为 Android 开发游戏。我实现了“聚光灯效果”来突出教程关卡中的一些场景元素。我确实使用 Pixmap 类来实现这一点。所以我做了这样的事情:

public class ComplexSpotlight implements MoveObserver{

// somewhere in class

    public void update(){
        black.setColor(0, 0, 0, 0.7f);
        black.fill();

        black.setColor(0, 0, 0, 0);

        for(Map.Entry<MoveObservable, Vector2> entry : currentObservablePositions.entrySet()){
            Vector2 position = entry.getValue();

            int x = (int)(Gdx.graphics.getWidth()/2+position.x);
            int y = (int)(Gdx.graphics.getHeight()*1.5f-position.y);

            int radius = 50;

            black.fillCircle(x, y, radius);
            System.out.println("at "+x+" "+y);
        }

        overlay.dispose();
        overlay = new Texture(black);
    }

    public Texture getOverlayTexture(){
        return overlay;
    }

快速解释 - 我正在创建一个像素图,用颜色(0,0,0,0.7f)填充它。在此之后,我使用 Pixmap.fillCircle() 方法绘制透明圆圈。然后我正在使用这个像素图创建新的纹理。我使用以下设备测试了此代码:HTC One V(480*800)、Sony XPeria Neo 15i(480*854)、HTC Desire S(480*800),效果很好;

在此处输入图像描述

但是今天我发现 HTC One X(1280*720) 和 Gamsung Nexus(1280*720) 有问题 - 我只看到黑屏。

因此,如果有人给我一些关于这个问题的解释,那就太好了。链接,想法 - 任何事情都可能有帮助。提前致谢!

4

2 回答 2

1

我不确定,但我在我的应用程序上也遇到了 Pixmap 填充 alpha 的问题。我发现 pixmap 中的 fillCircle 只是没有正确设置 alpha。当我稍微研究一下时,我发现更好的方法是使用 FrameBuffer。

我在以下 libgdx SpriteBatch 渲染到纹理中找到了详细信息

我一直在使用的一些代码是

public class SplashScreen extends GameScreen {

SpriteBatch batch;
BitmapFont font;

FrameBuffer frmBuff;
TextureRegion frm;
OrthographicCamera frmCam;

int frmSizeX = 256;
int frmSizeY = 256;

public SplashScreen(ReactorApp game) {
    super(game);
    setClearColor(new Color(1,1,1,1));
}

@Override
public void show() {
    // TODO Auto-generated method stub
    super.show();
    batch = new SpriteBatch();
    font = new BitmapFont();

    frmBuff = new FrameBuffer(Format.RGBA8888, frmSizeX, frmSizeY, false);
    frm = new TextureRegion(frmBuff.getColorBufferTexture());
    frmCam= new OrthographicCamera(frmSizeX, frmSizeY);
    frmCam.translate(frmSizeX/2, frmSizeY/2);
}

@Override
public void dispose() {
    // TODO Auto-generated method stub
    super.dispose();
}


public void drawToTexture(){
    frmCam.update();
    ShapeRenderer shape = new ShapeRenderer();
    shape.setProjectionMatrix(frmCam.combined);
    frmBuff.begin();

    Gdx.gl.glClearColor(0, 0, 0, 0);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    shape.begin(ShapeType.FilledRectangle);
    shape.setColor(Color.BLACK);
    shape.filledRect(0,0,frmSizeX/2, frmSizeY/2);
    shape.end();

    shape.begin(ShapeType.FilledCircle);
    shape.setColor(Color.GREEN);
    shape.filledCircle(MathUtils.random(frmSizeX), MathUtils.random(frmSizeY), 20);
    shape.end();

    frmBuff.end();
}

int pos = 0;

@Override
public void render(float delta) {
    super.render(delta);
    drawToTexture();

    batch.setProjectionMatrix(cam.combined);


    batch.begin();
    batch.draw(frm, pos++, 30,frmSizeX,frmSizeY);
    if(pos>Gdx.graphics.getWidth()-frmSizeX)pos=0;
    font.setColor(Color.RED);
    StringBuilder message = new StringBuilder();
    message.append("Time :"+(int)(delta*1000)+"\n");
    font.drawMultiLine(batch, message.toString(), 10, Gdx.graphics.getHeight());
    batch.end();
}

}

这给出了我一直在玩的想法,但它似乎运作良好。

于 2013-01-24T20:55:22.983 回答
1

有问题的手机都是相当大的屏幕。你的纹理内存用完了还是类似的东西?(假设您以全分辨率绘图。)您可以尝试渲染到较小的视口,看看是否能解决问题。

既然我知道这个猜测是正确的,我很好奇应用程序(或 Android 的?)日志或 OpenGL 错误状态中是否有任何证据表明这个问题,因为您知道原因是什么。

于 2013-01-25T08:13:18.677 回答