我正在创建一个小型项目的游戏,并且我试图这样做,所以在5分之后,墙壁会产生更多,但在玩游戏时,它会在达到24点左右时崩溃。错误"致命错误:数组索引超出范围"
GameScene.swift
if pointsLabel.number % kNumberOfPointsPerLevel == 0 {
currentLevel++
wallGenerator.stopGenerating()
wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[currentLevel])
}
Constants.swift
let kNumberOfPointsPerLevel = 5
let kLevelGenerationTimes: [NSTimeInterval] = [1.0, 0.8, 0.6, 0.4, 0.3]
答案 0 :(得分:3)
您每次kLevelGenerationTimes[currentLevel]
都会currentLevel
调用pointsLabel.number % kNumberOfPointsPerLevel == 0
。
kLevelGenerationTimes
只有5个元素([1.0, 0.8, 0.6, 0.4, 0.3]
)和你提高等级的比率
Points: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Level : 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5
在25
点,currentLevel
变为5
,这是您的数组的无效索引。
答案 1 :(得分:2)
之所以会这样,是因为您的数组 5个单元格,索引从0到4 。
如果您尝试访问索引超出此范围的数组,则应用程序将崩溃。
示例:
let kLevelGenerationTimes: [NSTimeInterval] = [1.0, 0.8, 0.6, 0.4, 0.3]
kLevelGenerationTimes[0] // ok
kLevelGenerationTimes[1] // ok
kLevelGenerationTimes[2] // ok
kLevelGenerationTimes[3] // ok
kLevelGenerationTimes[4] // ok
kLevelGenerationTimes[5] // crash!!!
答案 2 :(得分:1)
看起来错误就在这里:
wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[currentLevel])
当currentLevel
等于或大于kLevelGenerationTimes
中的元素数时。
我不知道正确的解决方案是什么,取决于你的游戏逻辑 - 我会建议2个版本,第一次从该阵列的第一个元素重新启动一旦到达终点:
wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[currentLevel % kLevelGenerationTimes.count])
而第二种方法是始终使用数组的最后一个元素(随着玩家的进步,我将其视为一种日益增加的复杂性):
let index = currentLevel < kLevelGenerationTimes.count ? currentLevel : kLevelGenerationTimes.count - 1
wallGenerator.startGeneratingWallsEvery(kLevelGenerationTimes[index])