我是Swift开发的新手,我正试图创建一个简单的赛车游戏。游戏中的道路有车道标记,从屏幕顶部到底部动画,然后循环回到顶部。我使用SKShapeNodes作为车道线标记。
我能够让一个车道标记工作,现在我只需要创建一个阵列(我认为?)的车道标记,这样我就可以拥有2列车道,足以让游戏产生错觉一条真正的道路。
我能够创建数组但是当我尝试向其添加SKShapeNode时出现运行时错误。我得到的错误是:
主题1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode=0x0)
fatal error: Cannot index empty buffer
以下是相关的源代码:
class PlayScene: SKScene {
let road = SKSpriteNode(imageNamed: "road8")
let car = SKSpriteNode(imageNamed: "car")
let laneLineNode = SKShapeNode()
var laneLineNodeArray = [[SKShapeNode]]()
var groundSpeed = 25
}
override func didMoveToView(view: SKView) {
//draw a lane line
var path = CGPathCreateMutable();
var laneLineWidth = self.size.width / 85
var laneLineHeight = self.size.height / 11
var laneLine = CGRect(x: ((self.frame.size.width / 5) * 2), y:
(self.frame.size.height + laneLineHeight),
width: laneLineWidth, height: laneLineHeight)
laneLineNode.lineWidth = 0
laneLineNode.path = CGPathCreateWithRect(laneLine, nil)
laneLineNode.fillColor = SKColor.yellowColor()
laneLineNode.zPosition = 2
//THIS IS THE LINE I GET THE ERROR ON
laneLineNodeArray[0][0] = laneLineNode
self.addChild(self.road)
self.addChild(self.laneLineNode)
self.addChild(self.car)
}
override func update(currentTime: CFTimeInterval) {
//move the lane lines
scrollLaneLines(self.scene!)
}
}
感谢您提供任何帮助。
答案 0 :(得分:1)
首先......您使用此代码过早关闭课程:
var groundSpeed = 25
} // <--
第二......在使用之前,您没有初始化阵列。在我的测试中,我因此得到了错误。
您应该使用此语法初始化数组或使用追加为@Arnab建议。
let laneLineNode = SKShapeNode()
var laneLineNodeArray = [[laneLineNode]]
答案 1 :(得分:0)
到目前为止,您已创建了一个空数组。使用&#34;追加&#34;在通过索引访问元素之前将数据添加到数组。
答案 2 :(得分:0)
谢谢!我能够在PlayScene课程中使用它:
var laneLineNodeArray:[[SKShapeNode]] = []
这是在func中的didMoveToView:
//draw a lane line
var path = CGPathCreateMutable();
var laneLineWidth = self.size.width / 85
var laneLineHeight = self.size.height / 11
var laneLine = CGRect(x: 0, y: (self.frame.size.height + laneLineHeight),
width: laneLineWidth, height: laneLineHeight)
var laneLineRowNumber: Int
var laneLineY: CGFloat
for r in 0...6 {
var laneLineRow:[LaneLine] = []
laneLineRowNumber = r
for c in 0...1 {
let laneLineNode = LaneLine()
laneLineNode.lineWidth = 0
laneLineNode.path = CGPathCreateWithRect(laneLine, nil)
laneLineNode.fillColor = SKColor.yellowColor()
laneLineNode.zPosition = 2
//lanelineY determines the Y placement of the lane.
laneLineY = self.frame.size.height - (CGFloat((laneLineHeight) * 2)
* CGFloat(r))
if c == 0 {
laneLineNode.position = CGPointMake(laneWidth * 2, laneLineY)
}
else if c == 1 {
laneLineNode.position = CGPointMake(laneWidth * 3, laneLineY)
}
self.addChild(laneLineNode)
laneLineRow.append(laneLineNode)
}
laneLineNodeArray.append(laneLineRow)
}