2013-03-20 14 views
5

Bir pixmap'i değiştirmeye ve oluşturmaya çalışıyorum ancak değiştirilen pikseller ekranda gösterilmiyor. Bir Pixmap'ın bunu yapmanın en iyi yolu olup olmadığından emin değilim. Hatalarımın aşağıdaki kodda nerede olduğunu bana açıklayan var mı? teşekkürlerlibgdx - Bazı pikselleri çizme

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

bir doku kullanmak yerine, belki de [ShapeRenderer] kullanarak daha iyi performans elde edebilirsiniz (http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/ShapeRenderer.html) ? – 7yl4r

cevap

3

Her döngüde yeni bir pixmap oluşturuyorsunuz ve görüntünüzde tüm dokuyu çizmiyorsunuz.

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

Fakat bu çok yavaş, peki neden yapmak istiyorsun?

+0

Teşekkür ederim, çok fazla doku nesnesi çizmekten daha verimli olacağını düşünüyordum. Amaç, piksellerin hücreler olduğu bir tür “Conway'in yaşam oyunu” yaratmaktır. Sadece bu kütüphaneden bazı şeyleri daha çok anlamaya çalışıyorum. Kodunuzu birkaç saat sonra, uyuduktan sonra deneyeceğim :) – user2190718

+0

Kodunuz iyi çalışıyor. Sanırım çizginin neden bu kadar yavaş olduğunu anlıyorum. Pixmap işlemi render() yöntemindedir. render yöntemi saniyede 60 kez (60fps) olarak adlandırılır, böylece 1 saniyede sadece 60 piksel çizebilirim. sonunda çok yavaş değil, sadece render frekansına "senkronize" oluyor. Bu noktaya daha iyi bakmak için aşağıdaki kodu ekleyebilirsiniz: BitmapFont fontmessage = new BitmapFont(); fontmessage.draw (batch, "fps:" + Gdx.graphics.getFramesPerSecond() + "/ DeltaTime:" + Gdx.graphics.getDeltaTime(), 20, 30); – user2190718

+0

Ben pixmaps çok yavaş, çünkü onlar cpu tarafından ele alınırlar ve onlardan bir doku yaparsanız, o zaman gpu'ya gönderilir. –