ios - Swift error: Cannot call value of non-function type "SKSpriteNode" -
i tried translate this github code in swift 1 swift 2. makes rope in this video.
my translated rope.swift finished looking this:
// // rope.swift // skswiftropedemo // // created jeremy higgins on 6/10/14. // copyright (c) 2014 digital buckeye. rights reserved. // import spritekit class rope : sknode { var ropetexture : string var node1 : sknode var node2 : sknode var parentscene : skscene init(parentscene scene : skscene, node node1 : sknode, node node2 : sknode, texture tex : string) { self.ropetexture = tex self.node1 = node1 self.node2 = node2 self.parentscene = scene super.init() self.name = "rope" self.createrope() } required init(coder adecoder: nscoder) { fatalerror("init(coder:) has not been implemented") } func createrope() { // calculate distance & angle let deltax = node2.position.x - node1.position.x let deltay = node2.position.y - (node1.position.y + (node1.frame.size.height / 2)) let total = deltax * deltax + deltay * deltay let distance = float(sqrtf(float(total))) let height = float(skspritenode(imagenamed: "rope").size.height - 1.0) let p = (distance / height) var points = int(p) points -= 1; let vx = cgfloat(deltax) / cgfloat(points) let vy = cgfloat(deltay) / cgfloat(points) let vector = cgpoint(x: vx, y: vy) var previousnode : skspritenode? let angle = atan2f(float(deltay), float(deltax)) in 0...points { var x = self.node1.position.x var y = self.node1.position.y + (self.node1.frame.size.height / 2) y += vector.y * cgfloat(i) x += vector.x * cgfloat(i) let ropepiece = skspritenode(imagenamed: self.ropetexture) ropepiece.name = "rope" ropepiece.position = cgpoint(x: x, y: y) ropepiece.zrotation = cgfloat(angle + 1.57) ropepiece.zposition = -1 ropepiece.physicsbody = skphysicsbody(rectangleofsize: ropepiece.size) ropepiece.physicsbody?.collisionbitmask = 2 ropepiece.physicsbody?.categorybitmask = 2 ropepiece.physicsbody?.contacttestbitmask = 2 self.parentscene.addchild(ropepiece) if let pnode = previousnode { let pin = skphysicsjointpin.jointwithbodya(pnode.physicsbody!, bodyb: ropepiece.physicsbody!, anchor: cgpoint(x: cgrectgetmidx(ropepiece.frame), y: cgrectgetmidy(ropepiece.frame))) self.parentscene.physicsworld.addjoint(pin) } else { if == 0 { let pin = skphysicsjointpin.jointwithbodya(self.node1.physicsbody!, bodyb: ropepiece.physicsbody!, anchor: cgpoint(x: cgrectgetmidx(self.node1.frame), y: cgrectgetmaxy(self.node1.frame))) self.parentscene.physicsworld.addjoint(pin) } } previousnode = ropepiece } if let pnode = previousnode { let pin = skphysicsjointpin.jointwithbodya(self.node2.physicsbody!, bodyb: pnode.physicsbody!, anchor: cgpoint(x: cgrectgetmidx(pnode.frame), y: cgrectgetmidy(pnode.frame))) self.parentscene.physicsworld.addjoint(pin) } } func destroyrope() { self.parentscene.enumeratechildnodeswithname("rope", usingblock: { node, stop in node.removefromparent() }) } } and gamescene.swift part became this:
// // gamescene.swift // hop hope // // created sergio on 5/2/16. // copyright (c) 2016. rights reserved. // import spritekit struct physicscategory { static let player : uint32 = 0x1 << 1 static let ground : uint32 = 0x1 << 2 static let rope : uint32 = 0x1 << 3 } class gamescene: skscene { var ground = skspritenode() var rope = skspritenode() var player = skspritenode() let szplayer = 60 var anchor = skspritenode() var aplayer = skspritenode() override func didmovetoview(view: skview) { // physics border around screen self.physicsbody = skphysicsbody(edgeloopfromrect: self.frame) // static body self.anchor = skspritenode(color: uicolor.redcolor(), size: cgsize(width: 50, height: 50)) self.anchor.position = cgpoint(x: self.frame.size.width / 2, y: self.frame.size.height - anchor.size.height) self.anchor.physicsbody = skphysicsbody(rectangleofsize: anchor.frame.size) self.anchor.physicsbody?.dynamic = false self.anchor.physicsbody?.collisionbitmask = 1 self.anchor.physicsbody?.categorybitmask = 1 self.anchor.physicsbody?.contacttestbitmask = 1 self.addchild(self.anchor) // dynamic body self.aplayer = skspritenode(color: uicolor.greencolor(), size: cgsize(width: 50, height: 50)) self.aplayer.position = cgpoint(x: aplayer.size.width * 2, y: self.frame.size.height / 2) self.aplayer.physicsbody = skphysicsbody(rectangleofsize: aplayer.frame.size) self.aplayer.physicsbody?.collisionbitmask = 1 self.aplayer.physicsbody?.categorybitmask = 1 self.aplayer.physicsbody?.contacttestbitmask = 1 self.addchild(self.aplayer) // create rope var rope = rope(parentscene: self, node: self.aplayer, node: self.anchor, texture: "rope") var label = sklabelnode(text: "tap on screen move block") label.fontcolor = uicolor.blackcolor() label.position = cgpoint(x: self.frame.size.width / 2, y: 200) self.addchild(label) ////////////////////////////////// rest of code the problem var rope = rope(parentscene: self, node: self.aplayer, node: self.anchor, texture: "rope") giving error cannot call value of non-function type "skspritenode"
and error giving, rest of code , files fine, , have no ideia how fix this. tried changing sknodes in rope.swift skspritenode, gave more errors.
you've declared variable called rope having class called rope:
var rope = skspritenode() so, when create rope later:
var rope = rope(parentscene: self, node: self.aplayer, node: self.anchor, texture: "rope") swift thinks trying use variable rope function pointer can't skspritenode.
note: should use names start lowercase letter variables , names start uppercase letter classes , structs. if had observed convention, wouldn't have had problem.
Comments
Post a Comment