LibGDX - 如何绘制一些像素

5

我试图修改一个pixmap并进行渲染,但修改后的像素没有显示在屏幕上。我不确定pixmap是否是最好的方法。有人能否向我解释一下下面代码中我的错误在哪里?谢谢。

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

也许你可以使用ShapeRenderer而不是纹理来获得更好的性能?ShapeRenderer - 7yl4r
1个回答

3
您每次循环都在创建一个新的像素图,并且您没有在视图中绘制完整的纹理。
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);
    }
}

但这很慢,那么为什么要这样做呢?

谢谢,我认为这比绘制大量纹理对象更有效率。 目标是创建一种“康威生命游戏”,其中像素是细胞。 我只是尝试使用此库中的一些东西来更好地理解它。 我会在几个小时后尝试您的代码,睡醒后 :) - user2190718
你的代码运行良好。我认为我明白了为什么线条的渲染如此缓慢。像素图处理在render()方法中。render方法每秒调用60次(60fps),因此在1秒钟内只能绘制60个像素。最后它并不是很慢,只是“同步”到渲染频率。您可以添加以下代码以更好地查看此点:BitmapFont fontmessage = new BitmapFont(); fontmessage.draw(batch, "fps: " + Gdx.graphics.getFramesPerSecond() + " / DeltaTime: " + Gdx.graphics.getDeltaTime(), 20, 30); - user2190718
我指的是像素图非常缓慢,因为它们由CPU处理,如果你从中制作纹理,那么它会被发送到GPU。 - Pinkie Swirl
它们很慢,你需要在使用后调用.dispose()。Pixmap不是一个只保持存在的变量。 - Maarten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接