我正在努力改造我几年前制作的游戏。它最初是在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对象一起。
非常感谢任何帮助。