2013-01-23 51 views
3

我正在为使用libGDX的Android开发游戏。我实现了“聚光灯效果”,突出了教程级别中的一些场景元素。我确实使用Pixmap类来实现这一点。所以我做了这样的事情:Android LibGDX 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()方法绘制透明圆。然后我使用这个Pixmap创建新的纹理。我已经使用以下设备测试了此代码:HTC One V(480 * 800),Sony XPeria Neo 15i(480 * 854),HTC Desire S(480 * 800),并且效果不错;

enter image description here

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

所以如果有人给我一些关于这个问题的解释会很好。链接,想法 - 任何事情都可能有帮助。 在此先感谢!

+1

有问题的手机是相当大的屏幕。你用完纹理记忆或类似的东西了吗? (假设您以全分辨率绘制)。你可以尝试渲染到一个较小的视口,看看是否解决了这个问题。还要确保它的覆盖层是真正的问题(如果禁用覆盖层,背景显示是否正确?如果你用红色或白色填充它) –

+0

我也注意了屏幕尺寸,但没有任何建议能够 。创建和呈现我的叠加层时没有发生任何异常/错误。在屏幕上轻敲叠加删除(根据我的游戏逻辑),然后看到我的背景和游戏对象。此外,我显示弹出式文本消息上方此覆盖,它呈现正确。 我会尝试测试你提出并更新我的帖子的结果。 – Viacheslav

+0

@ P.T。对于大屏幕尺寸,您完全正确 - 由于某些原因,我使用了2 *屏幕尺寸,将纹理尺寸增加到4倍!将Pixmap大小更改为屏幕大小后,所有效果都很好。如果您发表评论作为答案,我会批准它作为主题解决方案。谢谢! – Viacheslav

回答

1

有问题的手机都是相当大的屏幕。你用完纹理记忆或类似的东西了吗? (假设你正在以全分辨率进行绘制)。你可以尝试渲染一个较小的视口来查看是否解决了这个问题。

现在我知道这个猜测是正确的,我很好奇,如果有一个在应用程序(或Android的?)日志或在现在指向这个问题了OpenGL错误状态的任何证据,你知道原因是什么。

1

我不确定,但我一直在使用Pixmap在我的应用程序中填充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(); 
} 

} 

这给了我一直在玩的想法,但它似乎工作得很好。

+0

谢谢你的例子,乔伊!我会尝试实施这种方法,因为我认为它会有更好的表现。 – Viacheslav