2013-03-20 14 views
5

Sto cercando di alterare una pixmap e renderla, ma i pixel modificati non sono mostrati sullo schermo. Non sono sicuro che una Pixmap sia il modo migliore per farlo. Qualcuno può spiegarmi dove sono i miei errori nel codice qui sotto? grazielibgdx - Come disegnare alcuni pixel

package com.me.mygdxgame; 
import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Pixmap; 
import com.badlogic.gdx.graphics.Pixmap.Format; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.Texture.TextureFilter; 
import com.badlogic.gdx.graphics.g2d.Sprite; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.utils.Array; 

public class MyGdxGame implements ApplicationListener { 

    private OrthographicCamera camera; 
    private SpriteBatch batch; 
    private Pixmap _pixmap; 
    private int _width; 
    private int _height; 
    private Texture _pixmapTexture; 
    private Sprite _pixmapSprite; 
    private int _x = 0; 
    private int _y = 0; 

    @Override 
    public void create() {  
     float w = Gdx.graphics.getWidth(); 
     float h = Gdx.graphics.getHeight(); 

     camera = new OrthographicCamera(1, h/w); 
     batch = new SpriteBatch(); 

     _width = (int)Math.round(w); 
     _height = (int)Math.round(h); 
     _pixmap = new Pixmap(_width, _height, Format.RGBA8888); 
     _pixmap.setColor(Color.RED); 
     _pixmap.fillRectangle(0, 0, _width, _height); 
     _pixmapTexture = new Texture(_pixmap, Format.RGB888, false); 
    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
     _pixmap.dispose(); 
     _pixmapTexture.dispose(); 
    } 

    @Override 
    public void render() { 
     updatePixMap(); 

     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     batch.setProjectionMatrix(camera.combined); 
     batch.begin(); 
     batch.draw(_pixmapTexture, -_width/2, -_height/2); 
     batch.end(); 
    } 

    private void updatePixMap() { 
     _x += 1; 
     if (_x >= _width) { 
      _x = 0; 
     } 

     _y += 1; 
     if (_y >= _height/2) { 
      return; 
     } 

     _pixmap = new Pixmap(_width, _height, Format.RGBA8888); 
     _pixmap.setColor(Color.CYAN); 
     _pixmap.drawPixel(_x, _y); 
     _pixmapTexture = new Texture(_pixmap, Format.RGB888, false); 
    } 

    @Override 
    public void resize(int width, int height) { 
    } 

    @Override 
    public void pause() { 
    } 

    @Override 
    public void resume() { 
    } 
} 
+0

piuttosto che usare una trama, forse potresti ottenere prestazioni migliori usando [ShapeRenderer] (http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/ShapeRenderer.html) ? – 7yl4r

risposta

3

Si sta creando una nuova pixmap ad ogni ciclo e non si disegna la trama completa nella visualizzazione.

import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Pixmap; 
import com.badlogic.gdx.graphics.Pixmap.Format; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.math.MathUtils; 

public class MyGdxGame implements ApplicationListener { 

    private OrthographicCamera camera; 
    private SpriteBatch   batch; 
    private Pixmap    _pixmap; 
    private Texture    _pixmapTexture; 
    private int     _x = 0; 
    private int     _y = 0; 
    private float    _w; 
    private float    _h; 
    private int     _width; 
    private int     _height; 

    @Override 
    public void create() { 
     _w = Gdx.graphics.getWidth(); 
     _h = Gdx.graphics.getHeight(); 
     _width = MathUtils.round(_w); 
     _height = MathUtils.round(_h); 

     camera = new OrthographicCamera(1f, _h/_w); 
     camera.setToOrtho(false); 
     batch = new SpriteBatch(); 

     _pixmap = new Pixmap(_width, _height, Format.RGBA8888); 
     _pixmap.setColor(Color.RED); 
     _pixmap.fillRectangle(0, 0, _width, _height); 
     _pixmapTexture = new Texture(_pixmap, Format.RGB888, false); 
    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
     _pixmap.dispose(); 
     _pixmapTexture.dispose(); 
    } 

    @Override 
    public void pause() { 
    } 

    @Override 
    public void render() { 
     updatePixMap(); 

     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     batch.setProjectionMatrix(camera.combined); 

     batch.begin(); 
     batch.draw(_pixmapTexture, 1f/2f, _h/_w/2f); 
     batch.end(); 
    } 

    @Override 
    public void resize(final int width, final int height) { 
    } 

    @Override 
    public void resume() { 
    } 

    private void updatePixMap() { 
     _x += 1; 
     if (_x >= _width) _x = 0; 

     _y += 1; 
     if (_y >= _height/2) return; 

     _pixmap.setColor(Color.CYAN); 
     _pixmap.drawPixel(_x, _y); 
     _pixmapTexture = new Texture(_pixmap, Format.RGB888, false); 
    } 
} 

Ma questo è molto lento, quindi perché vuoi farlo?

+0

Grazie, stavo pensando che fosse più efficiente del disegnare molti oggetti di texture. L'obiettivo è creare una sorta di "gioco della vita di Conway", in cui i pixel sono celle. Sto solo provando qualcosa da questa libreria per capirlo di più. Proverò il tuo codice in poche ore, dopo aver dormito :) – user2190718

+0

Il tuo codice funziona bene. Penso di capire perché il rendering della linea è così lento. Il trattamento pixmap è nel metodo render(). il metodo di rendering è chiamato 60 volte al secondo (60fps), quindi in 1 secondo posso solo disegnare 60 pixel. alla fine non è così lento, è solo "sincronizzato" con la frequenza di rendering. È possibile aggiungere il codice qui sotto per avere una vista migliore fino a questo punto: BitmapFont fontmessage = new BitmapFont(); fontmessage.draw (batch, "fps:" + Gdx.graphics.getFramesPerSecond() + "/ DeltaTime:" + Gdx.graphics.getDeltaTime(), 20, 30); – user2190718

+0

Intendevo dire che le pixmap sono molto lente, perché vengono gestite dalla CPU e se si crea una texture da esse, allora viene inviata alla gpu. –

Problemi correlati