【问题标题】:Java - array of objects not storing values (scope?)Java - 不存储值的对象数组(范围?)
【发布时间】:2015-02-17 23:12:27
【问题描述】:

我正在尝试将一组对象渲染到游戏屏幕中。我环顾四周,发现其他人提出了一些类似的问题,但我似乎无法将他们得到的答案应用到我的程序中。

问题似乎出现在嵌套的 for 循环中。为了解决这个问题,我在 for 循环的第一行得到了 Java NullPointerExceptions。

package com.frfanizz.agility;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class GameScreen implements Screen {

AgilityGame game;
OrthographicCamera camera;

SpriteBatch batch;
Hero hero;
Spark[] sparkArray;
int totalSparks;

public GameScreen(AgilityGame game) {
    this.game = game;
    camera = new OrthographicCamera();
    camera.setToOrtho(true, 1920, 1080);

    batch = new SpriteBatch();

    hero = new Hero(60,540);

    //Variables to set spark array
    int screenX = 1400;
    int screenY = 1200;
    int numOfRow = 11;
    int numOfCol = 8;
    float spacingRow = screenY/(numOfRow + 1);
    float spacingCol = screenX/(numOfCol + 1);
    int totalSparks = numOfRow*numOfCol;
    //Spark array
    Spark[] sparkArray = new Spark[totalSparks];
    //setting bounds for sparks
    int index = 0;
    for (int i=0;i<numOfCol;i++) {
        for (int j=0; j<numOfRow;j++) {
            //sparkArray[index] = new Spark();
            sparkArray[index].bounds.x = (float) (60 + spacingCol + ((i)*spacingCol));
            sparkArray[index].bounds.y = (float) (spacingRow + ((j-0.5)*spacingRow));
            index++;
        }
    }

}

@Override
public void render(float delta) {

    Gdx.gl.glClearColor(1F, 1F, 1F, 1F);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
    camera.update();
    generalUpdate();

    batch.setProjectionMatrix(camera.combined);

    batch.begin();

        //Rendering code
        batch.draw(Assets.spriteBackground, 0, 0);
        batch.draw(hero.image,hero.bounds.x,hero.bounds.y);

        for (int i=0; i<totalSparks; i++) {
            batch.draw(sparkArray[i].image,sparkArray[i].bounds.x,sparkArray[i].bounds.y);
        }

    batch.end();

}

//Other gamescreen methods

}

Hero 和 Spark 类如下:

package com.frfanizz.agility;

import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.math.Rectangle;

public class Hero {

public Sprite image;
public Rectangle bounds;

public Hero(int spawnX, int spawnY) {
    image = Assets.spriteHero;
    image.flip(false, true);
    bounds = new Rectangle(spawnX - 16, spawnY - 16, 32, 32);
}
}

和:

package com.frfanizz.agility;

import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.math.Rectangle;

public class Spark {

public Sprite image;
public Rectangle bounds;

public Spark () {
    image = Assets.spriteSpark;
    image.flip(false, true);
    bounds = new Rectangle();
    bounds.height = 32;
    bounds.width = 32;
}
}

在 for 循环中,我打印了 sparkArray 的值,所以我认为我对值有问题,而不是来自我已阅读答案的其他问题的引用。 (以下是我(未成功)引用的问题: Java. Array of objects , Java NullPointerException with objects in array)

提前致谢!

【问题讨论】:

    标签: java arrays object libgdx


    【解决方案1】:

    取消注释该行

    //sparkArray[index] = new Spark();
    

    在您将 Spark 实例放入其中之前,您的 Spark 对象数组包含空值。

    考虑使用 Spark 的二维数组,如果它适合您正在做的事情。

    int numOfRow = 11;
    int numOfCol = 8;
    Spark[][] sparkArray = new Spark[numOfRow][numOfCol];
    //setting bounds for sparks
    for (int row=0; row<numOfRow; row++) {
        for (int col=0; col<numOfCol; col++) {
            sparkArray[row][col] = new Spark();
            sparkArray[row][col].bounds.x = 1.23; // example of usage
        }
    }
    

    【讨论】:

    • 当我取消注释该行时,我不再收到 NullPointerException,但精灵数组不会渲染到屏幕上。
    • 我在行中得到一个 ArrayIndexOutOfBoundsException:sparkArray[row][col] = new Spark();
    • 您可能已经反转了 for 循环中的行和列边界 (numOfRow/numOfCol)。我发布的代码不会产生 ArrayIndexOutOfBoundsException。
    • 我实际上发现了问题所在。 Java 是基于引用而不是值传递数组的所有定义。 (见link1link2)。我最终使用 .clone() 将数组中的值作为值而不是不再在 render() 方法范围内的变量的引用(来自 for 循环)传递。 hero 对象正在工作,因为我使用值来实例化该对象
    • 我不记得在我使用过的任何其他语言中,传递引用会导致问题,所以这可能是 Java 特有的。如果您知道任何更好的方法来设置数组以按值传递(或者我的整体代码应该如何构造),请告诉我,因为我计划再次使用循环在 sparkarray 中创建运动,并且必须通过单独的实际存储值的方法似乎效率低下。
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 2011-11-03
    • 2019-05-18
    • 2022-01-23
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多