【问题标题】:Android LibGDX Pixmap issueAndroid LibGDX 像素图问题
【发布时间】:2013-01-06 21:10:04
【问题描述】:

我正在使用 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) 有问题 - 我只看到黑屏。

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

【问题讨论】:

  • 有问题的手机是相当大的屏幕。你的纹理内存用完了还是类似的东西? (假设您以全分辨率绘图)。您可以尝试渲染到较小的视口,看看是否能解决问题。还要确保它真的是覆盖问题(如果禁用覆盖,背景是否正确显示?如果用红色或白色填充它?)
  • 我也关注过屏幕尺寸,但没有任何建议。在创建和渲染我的叠加层期间没有发生任何异常/错误。点击屏幕覆盖后删除(根据我的游戏逻辑),我看到了我的背景和游戏对象。此外,我还在此叠加层上方显示带有文本消息的弹出窗口,并且它可以正确呈现。我将尝试测试您提出的建议并用结果更新我的帖子。
  • @P.T.您对大屏幕尺寸完全正确-出于某些原因,我使用了 2*screen 尺寸尺寸,这将纹理尺寸增加到了 4 倍!在我将 Pixmap 大小更改为屏幕大小后,一切正常。如果您将评论作为答案发布,我将批准它作为主题解决方案。谢谢!

标签: android libgdx pixmap


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我在下面找到了详细信息 libgdx SpriteBatch render to texture

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

    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();
    }
    
    }
    

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

    【讨论】:

    • 谢谢乔伊!我会尝试实施这种方法,因为我认为它会有更好的性能。
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2016-06-11
    • 2016-06-10
    相关资源
    最近更新 更多