TreeSetsが作業中のゲームからユニットを削除する際に問題が発生しました。タワーディフェンスゲームを作っていますが、パスは設定された長さのさまざまなブロックに分割されています。ブロックは、その中のユニットとパス上の次のブロックを認識しています。ユニットがブロックの境界を離れると、ブロックはそのユニットをリストから削除し、次のブロックに追加します。
私はTreeSetを使用して、ブロック内のユニットの順序を追跡しています。これにより、パスに沿って最も遠いユニットを特定できます。ユニットには、パスに沿ってどれだけ離れているかを追跡する位置フィールドがあり、位置が高いほど遠くになります。
一部のブロックで、TreeSetからユニットを削除しようとすると、removeがfalseを返すことに気付きました。いくつかのブレークポイントを使用しましたが、ユニットが実際にTreeSetにあることがわかります。したがって、問題は攻撃ユニットのcompareToメソッドにあると思います。
これがcompareToの私のコードです:
public int compareTo(Object other) {
if (other != null && AttackingUnit.class.isAssignableFrom(other.getClass())) {
AttackingUnit o = (AttackingUnit) other;
int amount = position - o.position;
if (amount != 0) {
return amount;
} else if (amount == 0 && this == o) {
return 0;
}
}
return 1;
}
私が問題に気付いているブロックの1つは、ユニットが上部に入り、途中で角を曲がって右側から出るブロックです。ブロックには2つのArrayListがあります。1つは上から下に移動するユニット用(enPath)で、もう1つは左から右に移動するユニット用(exPath)です。これが私が問題を抱えているコードです:
for (int i = 0; i < exPath.size(); i++) {
AttackingUnit unit = exPath.get(i);
unit.stepX();
if (unit.getX() > rightX) {
nextBlock.addUnit(unit);
units.remove(unit);
exPath.remove(unit);
i--;
}
}
ユニットはexPathとユニット(TreeSet)にありますが、units.remove(unit)はfalseを返します。これを修正するためにAttackingUnitのcompareToを変更する方法に関するアイデアはありますか?