簡體   English   中英

快速錯誤:無法調用非函數類型“ SKSpriteNode”的值

[英]Swift error: Cannot call value of non-function type “SKSpriteNode”

我試圖將Swift 1中的github代碼轉換為Swift2。這就像這段視頻中一樣

我翻譯的Rope.swift看起來像這樣:

//
//  Rope.swift
//  SKSwiftRopeDemo
//
//  Created by Jeremy Higgins on 6/10/14.
//  Copyright (c) 2014 Digital Buckeye. All 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))

        for i 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 i == 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()
        })
    }
}

而GameScene.swift部分變成這樣:

//
//  GameScene.swift
//  Hop Hope
//
//  Created by Sergio on 5/2/16.
//  Copyright (c) 2016. All 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 to move block")
        label.fontColor = UIColor.blackColor()
        label.position = CGPoint(x: self.frame.size.width / 2, y: 200)
        self.addChild(label)

        ////////////////////////////////// rest of the code

問題是var rope = Rope(parentScene: self, node: self.aplayer, node: self.anchor, texture: "Rope")給出錯誤無法調用非功能類型“ SKSpriteNode”的值 煩人的錯誤

這是唯一的錯誤,其余的代碼和文件都很好,我不知道如何解決此問題。 我已經嘗試過將SKNode的所有SKNode更改為SKSpriteNode ,但這只會帶來更多錯誤。

您已經聲明了一個名為Rope的變量以及一個名為Rope的類:

var Rope = SKSpriteNode()

因此,稍后創建繩索時:

var rope = Rope(parentScene: self, node: self.aplayer, node: self.anchor, texture: "Rope")

Swift認為您正在嘗試將變量Rope用作功能指針,而SKSpriteNode無法做到這SKSpriteNode

注意:您應使用與變量和名稱以類和結構大寫字母開頭小寫字母開頭的名稱。 如果您遵守了該約定,那么您就不會遇到這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM