0

SpriteKit で放射状の重力フィールドを使用しようとすると問題が発生します

同じ種類のオブジェクトは必要ありません (categoryBitMask で定義されているように、互いに引き付けられます)。

これが私がそれを行う方法です:

struct PhyscisCategory {
    static let None : UInt32 = 0
    static let All : UInt32 = UInt32.max
    static let Star : UInt32 = 0b1
    static let Planet : UInt32 = 0b10
}
<....>
 Planet1.physicsBody!.categoryBitMask = PhyscisCategory.Planet
 Planet1.physicsBody!.fieldBitMask = PhyscisCategory.Star

 Planet2.physicsBody!.categoryBitMask = PhyscisCategory.Planet
 Planet2.physicsBody!.fieldBitMask = PhyscisCategory.Star

何を試しても、惑星は常に相互に引き付けられます (fieldBitMask を 0 に設定した場合を除きますが、もちろん、Star にも引き付けられなくなります)。この2行のコードは、星の重力場だけが惑星に影響を与えることを期待しています...

ドキュメントから:

"fieldBitMask : 物理フィールドのどのカテゴリがこの物理体に力を加えることができるかを定義するマスク。物理体が SKFieldNode オブジェクトの領域内にある場合、そのフィールド ノードの categoryBitMask プロパティは、論理演算を実行することによって、この物理体の fieldBitMask プロパティと比較されます。 AND 演算。結果がゼロ以外の値の場合、フィールド ノードの効果が物理ボディに適用されます。」

私は何か間違っていますか?

4

1 に答える 1

1

あなたのマスクは調子が悪い。バイナリでは、次のようになります。

0000 0000 1011 0001 (stars)
0000 1011 0001 0000 (planets)

これら 2 つの論理ANDは、ゼロ以外の値を生成します。

0000 0000 0001 0000

そのSpriteKitため、あなたの惑星のフィールド ビットマスクを別の惑星のカテゴリ ビットマスクで評価すると、それらは互いに引き合います。代わりにこれらのマスクを試してください:

static let Star : uint32_t = 0x1 << 0
static let Planet : uint32_t = 0x1 << 1

(それが有効な迅速なコードであるかどうかはわかりませんが、アイデアは得られます)。常に左に 1 ビットシフトすることで、マスクを拡張できます。ANDこれらのマスクは、 -edの場合、常にゼロの値を生成します。

于 2015-10-08T15:00:14.050 に答える