0

私のプロジェクトでは、RocketMaker というクラスを使用して新しいノードを作成します。このクラス内には、applyRecurringForce()...という関数があります。

func applyRecurringForce() {
    var thrust: CGVector = CGVectorMake(100, 100)
    physicsBody!.applyForce(thrust)
}

私の問題は、メイン シーンからこの機能にアクセスできないことです。

override func update(currentTime: NSTimeInterval) {
    /* Called before each frame is rendered */
    for rocketNode in rocketShips.children {
        println("physicsBody: \(rocketNode.physicsBody.description)")
        rocketNode.physicsBody.applyRecurringForce()
    }
}

上記のコードから始めて、2 つのエラーが発生します。1 つは のエラー、もう 1printlnつは の呼び出しのエラーapplyRecurringForce()です。

アプローチ 1 : 強制的なアンラップはありません...
1) println エラーは、"オプションの型 'SKPhysiceBody' の値がアンラップされていません。'!' を使用するつもりでしたか? また '?'?" そして、アンラップを強制することを提案し
ます 2) 呼び出しは「引数なしで 'applyRecurringForce' を呼び出せません」を返します

アプローチ2:「!」を追加します 提案された解決策に従ってください...
1) println エラーは前のアプローチと同じです": "オプションの型 'SKPhysiceBody' の値はラップされていません。「!」を使用するつもりでしたか? または '?'?" であり、再びアンラップを強制することを提案する
2) 呼び出しは、以前と同じエラーを返します。

Approach3 : だから私は "physicsBody!!" を使って連鎖をたどります。オーバーライド関数の両方の行で。今回は、2 つのエラーのうちの 1 つが削除されました...
1) println エラーがなくなりました
2) 呼び出しは、「'SKPhysicsBody には 'applyRecurringForce' という名前のメンバーがありません」を返します

呼び出しをコメントアウトすると、

physicsNodeName: タイプ:presentedObject:[ 名前:'rocket1' 位置:{56, 294} 蓄積フレーム:{{16.849998474121094, 280.20001220703125}, {78.300003051757812, 27.5999755859375}}]

誰が何が起きているのか考えていますか?? この二重のアンラップは、私には非常に奇妙に見えます。

4

1 に答える 1

0

メソッドapplyRecurringForceは、クラスではなく、カスタム ノード クラス ( RocketMaker) で宣言されていますSKPhysicsBody。したがって、for ループの内部を次のように変更する必要があります。

println("physicsBody: \(rocketNode.physicsBody!.description)")
rocketNode.applyRecurringForce()

また、私は本当に何rocketShipsであるか分かりません。私はもともと配列でしたが、childrenプロパティにアクセスしていることを考えると、それはある種のSKNode. 通常、1 つのノードに複数形の名前を付けることは望ましくありません。

それがノードであると仮定するとrocketShips、その子をカスタム ノード クラスにキャストする必要があります。これは、デフォルトchildrenでは の配列であるAnyObjectためです (これが二重アンラップが表示される理由です)。完全な解決策については、以下を参照してください。childrenただし、配列全体をキャストしていることに注意してください。配列にノードと他のノードが混在している場合は、RocketMaster各子を個別にキャストする必要があります。

import SpriteKit
class GameScene: SKScene {
    var rocketShips: SKNode! //var rocketShips: [RocketMaster] = []
    override func update(currentTime: NSTimeInterval) {
        /* Called before each frame is rendered */
        for rocketNode in rocketShips.children as! [RocketMaster] {
            println("physicsBody: \(rocketNode.physicsBody!.description)")
            rocketNode.applyRecurringForce()
        }
    }
}

class RocketMaster: SKNode {
    func applyRecurringForce() {
        var thrust: CGVector = CGVectorMake(100, 100)
        physicsBody!.applyForce(thrust)
    }
}
于 2015-06-20T15:55:47.113 に答える