SKPhysicsBody

プロパティ

物体が重力の影響を受けるかどうか

affectedByGravity

BOOL
初期値 YES(重力の影響を受ける)

ボリュームベースの物体(面積を持つ物体)に重力を適用するかどうかを決める。
エッジベースの物体(線だけの物体)は重力の影響を受けないので効果が無い。

コード例

sprite1.physicsBody.affectedByGravity = NO; // 重力で落下しない物体

物体を回転させるか

allowsRotation

BOOL
初期値 YES(回転する)

衝突によって物体が回転するかどうか。
エッジベースの物体は力の影響を受けないので効果が無い。

回転速度の減衰

angularDamping

CGFloat
初期値 0.1
範囲 0.0~1.0

このプロパティは流体や空気抵抗をシミュレートするのに使われます。0.0を設定すると、回転速度の減衰はおこりません。

物体の角速度

angularVelocity

CGFloat

ラジアン/秒で測定される(0.0,0.0,1.0)の軸を中心とした軸性ベクトルです。

物体によって覆われる面積(読み込みのみ)

area

CGFloat

このプロパティはdensity(密度)プロパティと共に、物体の質量を計算するために使われます。

物理体が属するカテゴリー

categoryBitMask

uint32_t
初期値 0xFFFFFFFF(全ビットがセットされている)

categoryBitMaskによってシーン上の全ての物理体には32の異なったカテゴリーが割り当てられ、各ビットをビットマスクとして使うことができます。
各ビットの意味はプログラマーが、ゲーム内容に従って決めます。
collisionBitMaskプロパティとcontactTestBitMaskプロパティといっしょに使うことで、どの物理体がどれとぶつかるか、いつこの衝突を検知するかを定義することができます。

コード例

self.sprite1.physicsBody.categoryBitMask = 0x1 << 0;

この物理体と衝突を行う相手となる物体のカテゴリー

collisionBitMask

uint32_t
初期値 0xFFFFFFFF(全ビットがセットされているので、カテゴリービットマスクがセットされているすべての物体と衝突)

2つの物理体が接触する時、衝突が起こる。この物体のcollision(衝突)マスクともう一方の物体のカテゴリーマスクとで論理積を計算します。
結果が0(ゼロ)でない場合に、この物体は衝突の影響を受けます。
それぞれの物体は、他の物体からの影響を受けるかを独自に選択します。
例えばこれを利用して、無視して良い速度変化しかしない衝突計算を避ける事もできます。

コード例

self.sprite1.physicsBody.collisionBitMask = 0x1 << 1 | 0x1 << 2;

衝突時の通知を行うカテゴリーを設定

contactTestBitMask

uint32_t
初期値 0x00000000(全ビットがクリア、このままではどの物体とも衝突が検知されない)

2つの物体が同じスペースを共有した時(接触した時)、お互いのcontact(衝突)マスクとカテゴリーマスクを論理積で計算します。
どちらかの結果が0(ゼロ)でない場合、SKPhysicsContactオブジェクトが作成され、physics worldのdelegateへ送られます。
パフォーマンスのために、必要な衝突だけ検知するようにビットマスクをセットしましょう。

・衝突の通知がされない(didBegenContactなどが呼ばれない)時のチェックポイント

1.SKPhysicsContactDelegateプロトコルを採用したか

例:@interface MyScene : SKScene <SKPhysicsContactDelegate>

2.シーンのphysicsWorldのcontactDelegateを設定したか

例:self.physicsWorld.contactDelegate = self;

3.contactTestBitMaskを設定したか

例:sprite1.physicsBody.contactTestBitMask = 0xFFFFFFFF; // この場合はすべての物体と衝突検知するが、本来は必要な衝突だけ検知したほうが良い

密度(Kg/m2)

density

CGFloat
初期値 1.0

ゲームを通して相対的な質量の矛盾がない限り、単位を変えても自由です。
massとdensityプロパティは相互に関連しています。一方のプロパティを変更すると、もう一方のプロパティの値は矛盾がないように自動的に再計算されます。

衝突時に動くかどうか

dynamic

BOOL
初期値 YES(動く)

NOを設定すると力や衝撃の影響が無視されます。(動かない固定物
このプロパティはエッジベースの物体では無視され、自動的に固定物になります。

コード例

sprite1.physicsBody.dynamic = NO; // 壁などの動かない物体にしたい時

物体表面の摩擦、ざらつき

friction

CGFloat
初期値 0.2
範囲 0.0から1.0

このプロパティは他の物体との衝突時に摩擦力を計算する時に使用されます。

物理体に接続したジョイント(読み込みのみ)

joints

NSArray* (SKPhysicsJointオブジェクトを格納した配列)

線速度の減衰

linearDamping

CGFloat
初期値 0.1
範囲 0.0から1.0

このプロパティは流体や空気抵抗をシミュレートするのに使われます。0.0を設定すると、線速度の減衰はおこりません。

質量(Kg)

mass

CGFloat

ゲームを通して相対的な質量の矛盾がない限り、単位を変えても自由です。
massとdensityプロパティは相互に関連しています。一方のプロパティを変更すると、もう一方のプロパティの値は矛盾がないように自動的に再計算されます。物体の質量は、力がどのくらい物体に適用されるかはもちろん、そのモーメントにも影響を与えます。

初期値は物理体のサイズと密度の初期値によって決まります。

物体が接続しているノード(読み込みのみ)

node

SKNode* 

SKNodeオブジェクトのphysicsBodyプロパティに物体を割り当てることによりノードと物体が関連付けられています。
もしも物体がノードに関連付けられていない場合はnilになります。

物理シミュレーションで休止状態かどうか

resting

BOOL

このプロパティは物体が休止状態にあると判断された時に物理シミュレーションによって自動的にYESに設定されます。
システム上の別の物体からみてこの物体は止まっている状態であることを意味します。
休止状態の物体は衝撃が与えられたり、別の物体と衝突したりするまで物理シミュレーションには参加しません。
このことで物理シミュレーションのパフォーマンスを向上させます。
全ての物体が休止状態ならシミュレーション全体が休止状態になり、物理世界で実行される計算数が減少します。

反発時のエネルギーの減衰

restitution

CGFloat
初期値 0.2
範囲 0.0から1.0

このプロパティは別の物体と反発する時にどのくらいエネルギーを減衰させるか決定するために使われます。

正確な衝突処理を行うか

usesPreciseCollisionDetection

BOOL
初期値 NO

2つの衝突する物体の正確な衝突検知の判定を行わない場合、1フレーム内で一方の物体が完全にもう一方の物体をすり抜ける時、衝突は検知されません。
もし双方の物体でこのプロパティがYESに設定されていたら、シミュレーションはより正確で負荷のかかる計算を使ってこの衝突を検知することができます。
物体を速く移動させるためにはYESの設定は最小限にすべきです。

速度(m/秒)

velocity

CGVector

ボリュームベースの物理体を作成

半径を指定して円形の物理体を作成

+ (SKPhysicsBody *)bodyWithCircleOfRadius:(CGFloat)r

r 円の半径

コード例

sprite1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite1.size.width / 2.0];

半径と中心を指定して円形の物理体を作成

+ (SKPhysicsBody *)bodyWithCircleOfRadius:(CGFloat)r center:(CGPoint)center

r 円の半径
center 円の中心

矩形の物理体を作成

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)s

s 矩形のサイズ

コード例

sprite1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite1.size];

矩形の物理体を中心を指定して作成

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)s center:(CGPoint)center

s 矩形のサイズ
center 中心の座標

ボリュームベースの物理体の集合から物理体を作成

+ (SKPhysicsBody *)bodyWithBodies:(NSArray *)bodies

bodies NSArray*(SKPhysicsBodyを格納した配列。オブジェクトはボリュームベースの物理体で、このメソッドによって作られた物体でないこと。) 

このメソッドによって生成される物理体の形状は、その子の面積の集合をカバーする範囲の新しい物理体を作成するのに使われます。
これらの面積は隣接している必要はありません。
もし2つのパーツ間に空間がある場合、別の物体はこのパーツ間の間をすり抜けることができます。
しかし、この物理体は1つの連結した物体として扱われ、力や衝撃はすべてのピースに影響を与え、互いに連結して破壊できないフレームとして振る舞います。
子のプロパティ(例えば質量や摩擦)は無視されます。子の物体の形状だけが使われます。

パスからポリゴンの物理体を作成

+ (SKPhysicsBody *)bodyWithPolygonFromPath:(CGPathRef)path

path 反時計回りに巻かれ、交差していない凸状ポリゴンのパス 

エッジベースの物理体を作成

パスからループした境界線を作成

+ (SKPhysicsBody *)bodyWithEdgeLoopFromPath:(CGPathRef)path

path Core Graphicパス。座標点はノードの基準点からの相対位置。パスは交差していないこと。 

パスが閉じていない場合、終点と始点をつなぎます。

エッジは容積や質量を持ちません。常にdynamicプロパティはNOとして扱われます。
エッジはボリュームベースの物体とだけ衝突します。

2点間をつなぐ境界線を作成

+ (SKPhysicsBody *)bodyWithEdgeFromPoint:(CGPoint)p1 toPoint:(CGPoint)p2

p1 エッジの始点
p2 エッジの終点

エッジは容積や質量を持ちません。常にdynamicプロパティはNOとして扱われます。
エッジはボリュームベースの物体とだけ衝突します。

矩形のループした境界線を作成

+ (SKPhysicsBody *)bodyWithEdgeLoopFromRect:(CGRect)rect

rect 矩形

エッジは容積や質量を持ちません。常にdynamicプロパティはNOとして扱われます。
エッジはボリュームベースの物体とだけ衝突します。

パスから開いた境界線を作成(エッジの連結した鎖)

+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path

path Core Graphicパス。座標点はノードの基準点からの相対位置。パスは交差していないこと。

エッジは容積や質量を持ちません。常にdynamicプロパティはNOとして扱われます。
エッジはボリュームベースの物体とだけ衝突します。

衝突した物体を得る

衝突した物理体を全て得る

- (NSArray *)allContactedBodies

物体に力や衝撃を加える

物体の重心に力を加える (1ステップだけ影響するので、最初に瞬発的な力を与えたい時)

- (void)applyForce:(CGVector)force

force それぞれの方向にどのくらいの力を加えるかを表したベクトル。N(ニュートン)

このメソッドは物体の回転速度に影響せずに物体の速度を加速します。速度の加速は1ステップ(1フレーム)にだけ適用されます。

特定の1点に力を加える

- (void)applyForce:(CGVector)force atPoint:(CGPoint)point

force それぞれの方向にどのくらいの力を加えるかを表したベクトル。N(ニュートン)
point シーン座標系において、物体に加わえる力の座標 

線速度と角速度の両方に影響を与えます。速度の加速は1ステップ(1フレーム)にだけ適用されます。

トルクを加える

- (void)applyTorque:(CGFloat)torque

torque トルク(N/m )

このメソッドは線速度を変えずに回転速度を発生させます。速度の加速は1ステップ(1フレーム)にだけ適用されます。

衝撃を加える

- (void)applyImpulse:(CGVector)impulse

impulse それぞれの方向にどのくらいのモーメントを加えるかを表したベクトル。N/秒

このメソッドは物体の角速度を変えずに線速度に影響します。

特定の1点に衝撃を加える

- (void)applyImpulse:(CGVector)impulse atPoint:(CGPoint)point

impulse それぞれの方向にどのくらいのモーメントを加えるかを表したベクトル。N/秒
point シーン座標系において、物体に加わえる衝撃の座標

線速度と角速度の両方に影響を与えます。

オブジェクトに角モーメントを与える衝撃を加える

- (void)applyAngularImpulse:(CGFloat)impulse

impoulse  衝撃の大きさ。N/秒

このメソッドは物体の線速度を変えずに角速度に影響を与えます。