我似乎无法理解这一点以及数组未被初始化的原因。
基本上我正在编写一个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个月前的情况要好......
有什么想法吗?
答案 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);
}
}