数组抛出异常

时间:2013-11-23 21:08:36

标签: arrays libgdx

我似乎无法理解这一点以及数组未被初始化的原因。

基本上我正在编写一个2d自上而下的太空飞船游戏,这艘船将完全可定制。该船为某些“模块”(即武器,电子系统)分配了几个插槽,这些插槽存储在一个阵列中,如下所示:

protected Array<Weapon> weaponMount;

创建船只时,没有任何模块阵列被初始化,因为有些船只可能有1个武器槽,而其他船只有4个。

所以当我编写新船时,就像这个例子:

public RookieShip(World world, Vector2 position) {

    this.width = 35;
    this.height = 15;

    // Setup ships model
    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(position);

    body = world.createBody(bodyDef);

    chassis.setAsBox(width / GameScreen.WORLD_TO_BOX_WIDTH, height / GameScreen.WORLD_TO_BOX_HEIGHT);
    fixtureDef.shape = chassis;
    fixtureDef.friction = 0.225f;
    fixtureDef.density = 0.85f;

    fixture = body.createFixture(fixtureDef);
    sprite = new Sprite(new Texture(Gdx.files.internal("img/TestShip.png")));
    body.setUserData(sprite);

    chassis.dispose();

    // Ship module properties
    setShipName("Rookie Ship"); 
    setCpu(50);
    setPower(25);
    setFuel(500);

    setWeaponMounts(2, world);
    setDefenseSlots(1);

    addModule(new BasicEngine(), this);
    addModule(new BasicBlaster(), this);

    // Add hp
    setHullHP(50);
    setArmorHP(125);
    setShieldHP(125);

}

@Override
public void addModule(Module module, Ship currentShip) {
    // TODO Auto-generated method stub
    super.addModule(module, currentShip);
}

@Override
public void setWeaponMounts(int weaponMounts, World world) {
    weaponMount = new Array<Weapon>(weaponMounts);
//      super.setWeaponMounts(weaponMounts, world);
}

@Override
public String displayInfo() {
    String info = "Everyones first ship, sturdy, reliable and only a little bit shit";

    return info;

}

当我设置武器坐骑的数量时,会调用以下方法:

    public void setWeaponMounts(int weaponMounts, World world) {
    weaponMount = new Array<Weapon>(weaponMounts);      
}

这基本上用一个大小(武器装备可用)初始化数组到任何参数。现在对我来说这看起来很好,但我设置了一个热键来输出数组的大小,报告为零。如果我尝试引用数组中的任何对象,它会抛出一个outofbounds异常。

addModule方法按如下方式添加到数组中:

    public void addModule(Module module, Ship currentShip) {
    currentShip.cpu -= module.getCpuUsage();
    currentShip.power -= module.getPowerUsage();
    if(module instanceof Engine){
        engine = (Engine) module;
    }else if(module instanceof Weapon){
        if(maxWeaponMounts == weaponMount.size){
            System.out.println("No more room for weapons!");
        }else{
        maxWeaponMounts += 1;
        weaponMount.add((Weapon)module);
        }
    }

}

我的编码不是很好,但是,比2个月前的情况要好......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,你应该避免instanceof。这不是一个非常重要的性能,但它总是指出你的一般架构的问题。实现两种不同的addModule方法。一个需要武器,一个需要一个引擎。

现在回到主题:

else if(module instanceof Weapon){
    if (maxWeaponMounts == weaponMount.size) {
        System.out.println("No more room for weapons!");
    } else{
       maxWeaponMounts += 1;
       weaponMount.add((Weapon)module);
    }
}

看起来您使用maxWeaponMounts作为计数器而不是限制。这就是为什么我认为它最初会为0.同样适用于Array.size。这不是限制,但size也会计算Array当前包含的元素数量。因此,您始终将(maxWeaponMounts == weaponMount.size)设为0 == 0,并且不会将武器添加到数组中。它将始终保持为空,并且尝试引用任何索引将以OutOfBoundsException结束。

您实际应该做的是使用maxWeaponMounts作为固定限制,而不是计数器。

public void setWeaponMounts(int weaponMounts, World world) {
    weaponMount = new Array<Weapon>(weaponMounts);
    maxWeaponMounts = weaponMounts;
}

else if(module instanceof Weapon){
    if (weaponMount.size >= maxWeaponMounts) {
        System.out.println("No more room for weapons!");
    } else{
       weaponMount.add((Weapon)module);
    }
}