【发布时间】:2016-08-30 01:04:25
【问题描述】:
我正在尝试从包含我的渲染方法中的所有游戏对象的数组中选择某些对象。因为它在我的渲染方法中,所以我试图通过只使用成员变量来避免垃圾收集器。我的目标是放入作为 Renderable 实例的 tmpRenderArray 游戏对象。然后我需要对这些对象进行排序并渲染它们。
这是我的代码:
private Array<GameObject> gameObjects = new Array<>();
private Array<Renderable> tmpRenderArray = new Array<>();
//...
@Override
public void render(float delta)
{
Gdx.gl.glClearColor(1f, 0.7f, 0.7f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.begin();
int i = 0;
for(GameObject object : gameObjects)
if(object instanceof Renderable)
tmpRenderArray.set(i++, (Renderable)object);
tmpRenderArray.sort(Renderable.PRIORITY_COMPARATOR);
//PRIORITY_COMPARATOR = (a, b) -> Float.compare(a.getPriority(), b.getPriority());
for(; i-- > 0; )
tmpRenderArray.items[i].render(); //<-- That line
batch.end();
//...
}
之前,我已将 tmpRenderArray 大小设置为 gameObjects 大小,以确保有足够的空间。 tmpRenderArray.setSize(gameObjects.size); tmpRenderArray 和 gameObjects 都是使用默认构造函数创建的普通 Array 对象 (com.badlogic.gdx.utils.Array)。没有对这些数组进行指定以外的其他操作。 (调用add方法创建GameObjects除外)
由于我正在向后循环进行渲染,因此不可能渲染空对象。但是,我在指定的行上遇到了 Class Cast 异常,在我看来这“为时已晚”。 Exception in thread "LWJGL Application" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lme.winter.project2d.Renderable;
如果我是对的,[L 表示数组,但我没有强制转换数组。 items 是一个成员变量,因此没有任何操作可以访问它。如何通过访问数组来启动异常?
编辑
感谢 Tenfour04 修复了一个小错误(索引错误),但主要问题仍然存在。我也会考虑使用 Array 对象的 clear 和 add 方法,但现在我想修复这个 bug,或者至少理解它。我已经用那个小修复更新了下面的代码。我并不是说这种渲染方法是最好的,或者它比 Tenfour04 给出的更好。我只是想了解发生了什么。
正如我们所看到的,当 i = 1 时,tmpRenderArray.items[i] 返回一个 Car(它是一个 Renderable),但是当我介入时,我在 catch 子句中被重定向到 LwjglApplication::initialize 并且我获取原始异常。问题仍然是一样的,我的数组在访问它时是如何转换的?我正在访问的数组是纯 java,它是 Array 对象内的成员变量,所以没有我或 LibGDX 运行的任何其他代码。
【问题讨论】:
标签: java arrays generics intellij-idea libgdx