创建一个SKShapeNode数组

时间:2014-11-16 04:59:16

标签: ios swift sprite-kit

我是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!)
    }
}

感谢您提供任何帮助。

3 个答案:

答案 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)
    }