2013-01-23 4 views
3

Je développe un jeu pour Android en utilisant libGDX. J'ai mis en place un "effet de projecteur" pour mettre en évidence certains éléments de la scène dans les niveaux du tutoriel. J'ai utilisé la classe Pixmap pour implémenter ceci. Donc, je l'ai fait quelque chose comme ceci:Android LibGDX Pixmap issue

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

explication rapide - Je crée un remplissage Pixmap avec la couleur (0,0,0,0.7f). Après cela, je dessine un cercle transparent en utilisant la méthode Pixmap.fillCircle(). Et puis je crée une nouvelle texture en utilisant ce Pixmap. J'ai testé ce code en utilisant les appareils suivants: HTC One V (480 * 800), Sony XPeria Neo 15i (480 * 854), HTC Desire S (480 * 800) et il fonctionne bien;

enter image description here

Mais aujourd'hui, je trouve qu'il ya des problèmes sur le HTC One X (1280 * 720) et Gamsung Nexus (1280 * 720) - Je vois un écran noir seulement.

Alors ce serait bien si quelqu'un me donnait quelques explications sur ce problème. Liens, pensées - tout peut être utile. Merci d'avance!

+1

Les téléphones problématiques sont des écrans assez grands. Vous manquez de mémoire de texture ou quelque chose comme ça? (En supposant que vous dessinez en pleine résolution). Vous pouvez essayer de rendre le rendu dans une fenêtre d'affichage plus petite pour voir si cela résout le problème. Assurez-vous également que c'est vraiment le problème qui se pose (l'arrière-plan s'affiche-t-il correctement si vous désactivez la superposition? Si vous le remplissez avec du rouge ou du blanc?) –

+0

J'ai également fait attention à la taille de l'écran pouvez . Aucune exception/erreur ne s'est produite lors de la création et du rendu de ma superposition. Après avoir tapé sur l'écran de superposition supprime (selon ma logique de jeu) et je vois mes objets de fond et de jeu. Aussi, je montre popup avec un message texte au-dessus de cette superposition et il rend correctement. Je vais essayer de tester que vous avez proposé et mettre à jour mon message avec les résultats. – Viacheslav

+0

@ P.T. Vous aviez parfaitement raison quant à la taille de l'écran - pour certaines raisons, j'ai utilisé des dimensions d'écran 2 * qui augmentent la taille de la texture jusqu'à 4x! Après avoir changé la taille de Pixmap à la taille de l'écran tout fonctionne bien. Si vous postez votre commentaire comme réponse, je l'approuverai comme solution de sujet. Merci! – Viacheslav

Répondre

1

Les téléphones problématiques sont tous des écrans assez grands. Vous manquez de mémoire de texture ou quelque chose comme ça? (En supposant que vous dessinez en pleine résolution.) Vous pouvez essayer de rendre le rendu dans une fenêtre d'affichage plus petite pour voir si cela résout le problème. Maintenant que je sais que cette supposition était correcte, je suis curieux de savoir s'il y avait des preuves dans les journaux de l'application (ou Android?) Ou dans l'état d'erreur OpenGL qui pointe vers ce problème maintenant que vous savez quelle était la cause .

1

Je ne suis pas sûr mais j'ai eu des problèmes avec Pixmap remplissage alpha sur mon application aussi. J'ai trouvé que le fillCircle dans pixmap n'a pas défini l'alpha correctement. Quand j'ai examiné un peu, j'ai trouvé qu'une meilleure approche était d'utiliser un FrameBuffer.

Je trouve les détails dans le libgdx SpriteBatch render to texture

Certains de mon code que je l'ai utilisé est

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

} 

cela donne l'idée de ce qui suit je joue avec, mais il semble bien travailler.

+0

Merci par exemple, Joey! Je vais essayer de mettre en œuvre cette approche car je suppose qu'elle aura de meilleures performances. – Viacheslav