2017-02-18 19 views
0

Я пытаюсь нарисовать полый круг на экране. Я получил класс в implements экране, и это это render метод:Libgdx Pixmap drawCircle теперь рисунок

@Override 
public void render(float delta) { 
    update(delta); 
    Gdx.gl.glClearColor(1,0,0,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    myGame.batch.setProjectionMatrix(gamecam.combined); 
    myGame.batch.begin(); 
    Pixmap pixmap = new Pixmap(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Pixmap.Format.RGBA8888); 
    pixmap.setColor(Color.BLACK); 
    pixmap.drawCircle(100, 100, 15); 
    Texture texture = new Texture(pixmap); 
    myGame.batch.draw(texture, 0, 0); 
    myGame.batch.end(); 
} 

Но по какой-то причине я получаю красный экран

+0

ли '' myGame.batch' в SpriteBatch'? – RadekJ

+0

Я добавил свой код (withoud setProjectionMatrix) в свой проект, и каждый из них правильно разбирается. Я думаю, что с 'setProjectioMatrix' вы делаете область вокруг 0,0 (где расположен круг) невидимой, поэтому она не отображается. – RadekJ

ответ

2

растрового изображения хранит свои данные в родной памяти кучи, не создаю в render() метод. Не создавайте текстуру также в методе render.

private Pixmap pixmap; 
private Texture texture; 

@Override 
public void show() { 

    float w = Gdx.graphics.getWidth(); 
    float h = Gdx.graphics.getHeight(); 

    gamecam = new OrthographicCamera(30, 30 * (h/w)); 
    gamecam.position.set(gamecam.viewportWidth/2f, gamecam.viewportHeight/2f, 0); 
    gamecam.update(); 

    pixmap= getPixmapCircle(10, Color.WHITE,false); 
    texture=new Texture(pixmap); 
    texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 

} 

@Override 
public void render() { 

    Gdx.gl.glClearColor(0,0,0,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    myGame.batch.setProjectionMatrix(gamecam.combined); 
    myGame.batch.begin(); 
    myGame.batch.draw(texture,100,100); 
    myGame.batch.end(); 
} 

public static Pixmap getPixmapCircle(int radius, Color color, boolean isFilled) { 
    Pixmap pixmap=new Pixmap(2*radius+1, 2*radius+1, Pixmap.Format.RGBA8888); 
    pixmap.setColor(color); 
    if(isFilled) 
     pixmap.fillCircle(radius, radius, radius); 
    else 
     pixmap.drawCircle(radius, radius, radius); 
    pixmap.drawLine(radius, radius, 2*radius, radius); 
    Pixmap.setFilter(Pixmap.Filter.NearestNeighbour); 
    return pixmap; 
} 

@Override 
public void dispose() { 
    pixmap.dispose(); 
    texture.dispose(); 
} 

Он является обязательным для вызова Dispose(), когда пиксельная или текстуры больше не требуется, в противном случае утечки памяти не приведет

+0

вы можете немного объяснить, почему бы не создать его в обработчике render() ' – Roni

+0

, вызываемом в игровом цикле из приложения каждый раз, когда должен выполняться рендеринг. Каждый раз он создает отдельную новую текстуру и pixmap, как в вашем коде. Pixmap и Texture - довольно тяжелый объект, который загружается в память графического процессора. Даже Texture/Pixmap вы не должны создавать объект в рендере до тех пор, пока не будет надлежащего условия. – Aryan