我正在使用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。在此之后,我使用Pixmap.fillCircle()方法绘制透明圆圈。然后我使用这个Pixmap创建新的纹理。 我使用以下设备测试了这段代码: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)存在问题 - 我只看到黑屏。
如果有人给我一些关于这个问题的解释,那就太好了。链接,想法 - 任何事情都可能有所帮助。 提前谢谢!
答案 0 :(得分: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();
}
}
这给了我一直在玩的想法,但似乎运作良好。
答案 1 :(得分:1)
有问题的手机都是相当大的屏幕。你没有纹理内存或类似的东西吗? (假设您正在以全分辨率绘制。)您可以尝试渲染到较小的视口以查看是否可以解决问题。
现在我知道这个猜测是正确的,我很好奇是否有任何证据表明应用程序(或Android的?)日志或OpenGL错误状态指出此问题,因为您知道原因是什么。