Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问gdx.utils.Array将启动ClassCastException_Java_Arrays_Generics_Intellij Idea_Libgdx - Fatal编程技术网

Java 访问gdx.utils.Array将启动ClassCastException

Java 访问gdx.utils.Array将启动ClassCastException,java,arrays,generics,intellij-idea,libgdx,Java,Arrays,Generics,Intellij Idea,Libgdx,我正在尝试从包含渲染方法中的所有游戏对象的数组中选择某些对象。因为它在我的render方法中,所以我试图通过只使用成员变量来避免垃圾收集器。我的目标是在我的tmpRenderArray游戏对象中加入可渲染的实例。然后我需要对这些对象进行排序并渲染它们 这是我的密码: private Array<GameObject> gameObjects = new Array<>(); private Array<Renderable> tmpRenderArray =

我正在尝试从包含渲染方法中的所有游戏对象的数组中选择某些对象。因为它在我的render方法中,所以我试图通过只使用成员变量来避免垃圾收集器。我的目标是在我的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大小,以确保有足够的空间。tmprenderary.setSizegameObjects.size;tmpRenderArray和gameObjects都是使用默认构造函数创建的普通数组对象com.badlogic.gdx.utils.Array。在这些阵列上未执行指定以外的任何其他操作。除了通过调用add方法创建游戏对象之外

由于我正在反向循环渲染,所以不可能渲染空对象。然而,我在指定的行上得到了一个类强制转换异常,我认为这太晚了。线程LWJGL应用程序java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为[Lme.winter.project2d.Renderable

如果我是对的,[L表示数组,但我没有强制转换数组。items是一个成员变量,因此访问它时不会执行任何操作。如何通过访问数组启动异常

编辑

由于TuneFi04修复了侧错误索引错误,但主要问题仍然存在。我还将考虑使用数组对象的清除和添加方法,但现在我想修复这个bug,或者至少理解它。我已经用下面的小修改更新了我的代码。我不认为这种渲染方法是最好的,或者是B。比Tenfour04给出的更好我只是想知道发生了什么

我使用调试器查看发生了什么:

我们可以看到,tmpRenderArray.items[i]当i=1时,返回一个可渲染的Car,但当我介入时,我被重定向到catch子句中的LwjglApplication::initialize,我得到了原始异常。问题仍然是,当访问数组时,我的数组是如何铸造的?我访问的数组是纯java,它是数组对象中的成员变量,因此不是我或正在运行的LibGDX的任何其他代码。

中指出,如果未使用显式指定类的数组构造函数,则无法访问项。这是因为Java在运行时剥离了泛型类型,因此数组不知道从项访问的对象的类型。LibGDX数组提供访问权限我想,如果你需要的话,你可以对代码进行高度优化

替换

tmpRenderArray.items[i].render();

它应该可以很好地工作,除了你的i的第一个元素的IndexOutOfBoundsException太高了,见下文

原始答案这些错误不是CCE的来源

你的错误在于你没有清除临时数组,并且你的i比它应该大一倍,这是由于上一个for循环中的i++造成的。这个对象不是空的,而是前一帧中的一些遗留对象。你需要在-1处开始i,并使用++i而不是i++。或者在第二个循环之前减少1

也就是说,您的一些代码有点复杂。您可以将其简化为:

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

batch.setProjectionMatrix(camera.combined);
batch.begin();

tmpRenderArray.clear();
for(Renderable object : gameObjects)
    tmpRenderArray.add(object);

tmpRenderArray.sort(Renderable.PRIORITY_COMPARATOR); //invert this comparator
//PRIORITY_COMPARATOR = (b, a) -> Float.compare(b.getPriority(), a.getPriority());

for(Renderable renderable : tmpRenderArray)
    renderable.render();

batch.end();

//...

我希望避免每次清除数组(将数组大小调整为0)和添加项目(也将数组大小调整为0),因为这会在我的笔记本电脑上造成巨大的fps下降。我认为索引位置错误非常愚蠢。我将在明天能够测试时接受你的答案。你知道我为什么得到ClassCastException ins吗虽然没有NullPointerException?我的gameObjects和tmpRenderArray中除了Renderables*或null元素之外什么都没有。*只有在我的测试用例中,以后才会有其他东西。如果你没有引入非Renderables,我会期望NPE,所以我不确定。这个数组有多大?很难想象在一个足够大的游戏中有一个这样的数组在笔记本电脑上使用它会有所不同。请注意,清除它时,LibGDX数组类只会将额外的元素置零——它实际上并没有释放底层Java数组。FPS下降是因为我没有清除它。您的解决方案可能对我来说是最好的,主要问题仍然没有答案。我真的很感谢,但我只会给出如果你能回答主要问题,请接受你的答案。更新了我的答案。@Winter
Gdx.gl.glClearColor(1f, 0.7f, 0.7f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

batch.setProjectionMatrix(camera.combined);
batch.begin();

tmpRenderArray.clear();
for(Renderable object : gameObjects)
    tmpRenderArray.add(object);

tmpRenderArray.sort(Renderable.PRIORITY_COMPARATOR); //invert this comparator
//PRIORITY_COMPARATOR = (b, a) -> Float.compare(b.getPriority(), a.getPriority());

for(Renderable renderable : tmpRenderArray)
    renderable.render();

batch.end();

//...