每次运行

时间:2017-08-17 02:26:54

标签: java opengl libgdx

我正在努力改造我几年前制作的游戏。它最初是在Swing / AWT中制作的,我打算用JavaFX重新制作它,但决定使用更强大的库,并选择使用LibGDX。

我目前的障碍是绘制简单的原始形状。在Swing或JavaFX中,这是微不足道的。你只需要一个Graphics2D / GraphicsContext对象并调用它们的绘图方法。但是在LibGDX中,我需要为基元使用单独的渲染对象,因为SpriteBatch只能绘制纹理。

所以我试图在我的Particle类中绘制一个基本的旋转矩形来表示一个抛射物。

@Override
public void render(SpriteBatch batch, ShapeRenderer sr, long cTime) {
    if(image != null) {
        batch.begin();
        batch.draw(image, 
                   (float)(position.x - (image.getWidth() / 2)), 
                   (float)(position.y - (image.getHeight() / 2)), 
                   0.0f, 0.0f, 
                   (float)image.getWidth(), (float)image.getHeight(), 
                   1.0f, 1.0f, (float)(Math.toDegrees(theta + (Math.PI / 2))), 
                   0, 0, image.getWidth(), image.getHeight(), 
                   false, true);
        batch.end();
    } else {
        double x = position.x - (size.x / 2);
        double y = position.y - (size.y / 2);

        sr.begin(ShapeType.Filled);
        sr.setColor(color);
        sr.rotate(0.0f, 0.0f, 1.0f, (float)(Math.toDegrees(theta + (Math.PI / 2))));
        sr.rect((float)x, (float)y, 
                size.x.floatValue(), size.y.floatValue());
        sr.end();
    }
}

这个渲染是从玩家的渲染函数中调用的,该函数由ApplicationAdapter类调用'渲染方法。

@Override
public void render(SpriteBatch batch, ShapeRenderer sr, long cTime) {
    getCurrentWeapon().render(batch, sr, cTime);
    if(img != null) {
        batch.begin();
        batch.draw(img, 
                   (float)(position.x - (img.getWidth() / 2)), 
                   (float)(position.y - (img.getHeight() / 2)), 
                   (img.getWidth() / 2), (img.getHeight() / 2), 
                   img.getWidth(), img.getHeight(), 
                   1.0f, 1.0f, (float)getDoubleAttribute("theta"), 
                   0, 0, img.getWidth(), img.getHeight(), 
                   false, true);
        batch.end();
    } else {
        sr.begin(ShapeType.Filled);
        sr.setColor(Color.RED);
        sr.circle(position.x.floatValue(), position.y.floatValue(), 40.0f);
        sr.end();
    }
}

主渲染方法:

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

    long cTime = TimeUtils.millis();

    camera.update();
    batch.setProjectionMatrix(camera.combined);
    sr.setProjectionMatrix(camera.combined);

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

    // Begin drawing here.
    player.render(batch, sr, cTime);
}

这是我实例化SpriteBatch和ShapeRenderer的地方。

@Override
public void create () {
    camera = new OrthographicCamera(Globals.WIDTH, Globals.HEIGHT);
    camera.setToOrtho(true, Globals.WIDTH, Globals.HEIGHT);

    batch = new SpriteBatch();
    sr = new ShapeRenderer();

    player = new Player();

    Cursor customCursor = Gdx.graphics.newCursor(new Pixmap(Gdx.files.internal("images/GZS_Crosshair.png")), 16, 16);
    Gdx.graphics.setCursor(customCursor);

    Gdx.input.setInputProcessor(this);
}

SpriteBatch和ShapeRenderer对象都存在于ApplicationAdapter类中,并传递给各种渲染方法,以便在其所有渲染调用中使用。

但是当我试图发射射弹时,我立即遇到了这个例外:

Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: no uniform with name 'u_projModelView' in shader
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:308)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:298)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.setUniformMatrix(ShaderProgram.java:528)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.setUniformMatrix(ShaderProgram.java:519)
    at com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer20.flush(ImmediateModeRenderer20.java:147)
    at com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer20.end(ImmediateModeRenderer20.java:160)
    at com.badlogic.gdx.graphics.glutils.ShapeRenderer.end(ShapeRenderer.java:1197)
    at gzs.game.gfx.particles.Particle.render(Particle.java:105)
    at gzs.game.objects.weapons.Pistol.render(Pistol.java:90)
    at gzs.entities.Player.render(Player.java:170)
    at gzs.game.GZS_Game.render(GZS_Game.java:65)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:126)

我完全不知道这个例外意味着什么,而Google上的极少数结果没有任何用处。在着色器中没有该名称的统一是什么意思?我没有使用任何着色器。

我是否创建了ShapeRenderer错误?它在ApplicationAdapter类中实例化了#39; create()方法,与SpriteBatch对象一起。

非常感谢任何帮助。

0 个答案:

没有答案