致命错误索引超出范围 swift 3 SpriteKit
Fatal Error index out of range swift 3 SpriteKit
我正在尝试制作一款双人射击游戏。我正在尝试销毁您已经使用过的子弹。在更新中我使用代码
var bulletsChecked = 0
for b in bullets {
if b.pos.y > self.frame.height || b.pos.y < -self.frame.height {
bullets.remove(at: bulletsChecked)
print("destroy old bullets")
}
我在更新结束时也有bulletsChecked += 1。这段代码工作正常,除非玩家一和玩家二同时射击。然后我在 "bullets.remove(at: bulletsChecked)" 上收到 "Fatal Error index out of range" 错误,有什么想法吗?
您可以通过倒序遍历数组来避免索引问题。
for b in bullets.reversed() {
...
}
[编辑]您还可以使用过滤器从数组中删除项目符号。
例如:
bullets = bullets.filter
{
bullet in
return bullet.pos.y > self.frame.height
|| bullet.pos.y < -self.frame.height
}
请注意,我不清楚您的项目符号删除测试是如何产生所需结果的,但我假设它会按照您的意愿进行操作,并且不会尝试删除不应该删除的项目符号被删除。
//====== BULLETT 和玩家 2 发生碰撞
if canHitP2 {
if b.pos.y >= self.frame.height - P2.size.height && (b.pos.x >= P2.position.x - P2.size.width / 2 && b.pos.x <= P2.position.x + P2.size.width / 2){
print("Player 2 hit")
bullets.remove(at: bulletsChecked)
P1Scored()
P2.removeFromParent()
P2CanShoot = false
canHitP2 = false
DispatchQueue.main.asyncAfter(deadline: Delay) {
self.P2Spawn()
self.addChild(self.P2)
P2CanShoot = true
canHitP2 = true
}
}
}
//====== COLLISION BETWEEN BULLETT AND PLAYER 1
if canHitP1 {
if b.pos.y <= -self.frame.height + P1.size.height && (b.pos.x >= P1.position.x - P1.size.width / 2 && b.pos.x <= P1.position.x + P1.size.width / 2) {
print("Player 1 hit")
bullets.remove(at: bulletsChecked)
P2Scored()
P1.removeFromParent()
P1CanShoot = false
canHitP1 = false
DispatchQueue.main.asyncAfter(deadline: Delay) {
self.P1Spawn()
self.addChild(self.P1)
P1CanShoot = true
canHitP1 = true
}
}
}
我正在尝试制作一款双人射击游戏。我正在尝试销毁您已经使用过的子弹。在更新中我使用代码
var bulletsChecked = 0
for b in bullets {
if b.pos.y > self.frame.height || b.pos.y < -self.frame.height {
bullets.remove(at: bulletsChecked)
print("destroy old bullets")
}
我在更新结束时也有bulletsChecked += 1。这段代码工作正常,除非玩家一和玩家二同时射击。然后我在 "bullets.remove(at: bulletsChecked)" 上收到 "Fatal Error index out of range" 错误,有什么想法吗?
您可以通过倒序遍历数组来避免索引问题。
for b in bullets.reversed() {
...
}
[编辑]您还可以使用过滤器从数组中删除项目符号。
例如:
bullets = bullets.filter
{
bullet in
return bullet.pos.y > self.frame.height
|| bullet.pos.y < -self.frame.height
}
请注意,我不清楚您的项目符号删除测试是如何产生所需结果的,但我假设它会按照您的意愿进行操作,并且不会尝试删除不应该删除的项目符号被删除。
//====== BULLETT 和玩家 2 发生碰撞
if canHitP2 {
if b.pos.y >= self.frame.height - P2.size.height && (b.pos.x >= P2.position.x - P2.size.width / 2 && b.pos.x <= P2.position.x + P2.size.width / 2){
print("Player 2 hit")
bullets.remove(at: bulletsChecked)
P1Scored()
P2.removeFromParent()
P2CanShoot = false
canHitP2 = false
DispatchQueue.main.asyncAfter(deadline: Delay) {
self.P2Spawn()
self.addChild(self.P2)
P2CanShoot = true
canHitP2 = true
}
}
}
//====== COLLISION BETWEEN BULLETT AND PLAYER 1
if canHitP1 {
if b.pos.y <= -self.frame.height + P1.size.height && (b.pos.x >= P1.position.x - P1.size.width / 2 && b.pos.x <= P1.position.x + P1.size.width / 2) {
print("Player 1 hit")
bullets.remove(at: bulletsChecked)
P2Scored()
P1.removeFromParent()
P1CanShoot = false
canHitP1 = false
DispatchQueue.main.asyncAfter(deadline: Delay) {
self.P1Spawn()
self.addChild(self.P1)
P1CanShoot = true
canHitP1 = true
}
}
}