SKPhysicsBody类

继承自 NSObject
符合 NSCoding
NSCopying
NSObject(NSObject)
框架  /System/Library/Frameworks/SpriteKit.framework
可用性 可用于iOS 7.0或者更晚的版本
声明于 SKPhysicsBody.h
参考指南 Sprite Kit Progamming Guide

概览

重要提示:这是一个初步的API或者开发技术文档。虽然已经审阅了本文档的技术准确性,但是它不是最终的版本。本机密信息仅适用于苹果开发者计划的注册会员。苹果提供这些机密信息来帮助你采用这些技术和编程接口。此信息如果有变更,根据本文档实现的软件应使用操作系统软件和最终文档测试。新版本的文档可能会拥有新的API或者技术。

一个SKPhysicsBody实例被用于添加到节点上模拟一些物理特性。当场景开始处理新的一帧时,它在物理体上处理物理计算并附加到节点上。这些计算包括重力,摩擦以及与其他物理体的碰撞。你还可以自动向物理体施加力量。当场景完成这些计算后,物理体将更新节点的位置和方向。

要添加物理体,首先要创建并且配置SKPhysicsBody实例,然后将这个实例分配懂节点实例的physicsBody属性。一个物理体在你向它施加力量之前必须关联到节点实例。

本框架支持两种类型的物理体,基于体积的物理体和基于边界的物理体。当你创建一个物理体的时候,你调用的构造方法将会决定它的类型,大小和形状。一个基于边界的物理体是没有质量和体积的,也不受力的影响。基于边界的物理体被用于模拟单纯的形状。相反,基于体积的物理体是有质量和体积的。一个基于体积的物理体默认情况下是受重力,摩擦和碰撞的影响的,力也可以直接作用在这个物理体上。它的dynamic属性允许你覆盖它的行为。

当物理体在场景中模拟物理属性时,物理体定义了一些物理特性。对于基于体积的物理体,最重要的属性是质量属性。一个基于体积的物理体假定质量值均匀分布的。你可以直接设置物理体的质量属性,也可以设置它的密度属性来影响质量。框架中所有的值使用的都是国际单位制。只要你的游戏里面用的是一贯的值,实际的力和质量值并不重要。

当你设计一款使用物理特性的游戏的时候,你定义不同类别的物理体显示在场景中。你可以定义超过32个不同类别的物理体,物体可以尽可能多地被分配到这些你想要的类别里面。除了声明它自己的类别,一个物理体还可以声明它与哪一个物体类型交互。

对于基于体积的物体,你可以动态的控制物体是如何被力和碰撞所影响的。

其他相关的物理类

你可以通过SKPhysicsJoint类将两个物理体连接到一起。

一个场景的physicsWorld属性持有一个物理特性,这个特性可以影响整个场景。

操作

创建基于体积的物理体

+ bodyWithCircleOfRadius:

以节点的原点为中心,创建一个圆形的物理体。

+ (SKPhysicsBody *)bodyWithCircleOfRadius:(CGFloat)r

参数 r:圆的半径
返回值 一个新的基于体积的物理体
+ bodyWithRectangleOfSize:

以节点的原点为中心,创建一个矩形的物理体。

+ (SKPhysicsBody *)bodyWithRectangleOfSize(CGSize)s

参数 s:矩形的大小
返回值 一个新的基于体积的物理体
+ bodyWithPolygonFromPath:

创建一个多边形的物理体。

+ (SKPhysicsBody *)bodyWithPolygonFromPath(CGPathRef)path

参数 path:一个逆时针没有相交的凸多边形路径,指定点相对于节点原点
返回值 一个新的基于体积的物理体

创建一个基于形状的物理体。

+ bodyWithEdgeLoopFromRect:

+ (SKPhysicsBody *)bodyWithEdgeLoopFromRect(CGRect)rect

参数 rect:一个相对于原点的矩形
返回值 一个新的基于形状的物理体

论述

一个基于形状的物理体没有体积和质量,dynamic属性值默认为NO,基于形状的物理体智能与基于体积的物理体发生碰撞。

创建一个矩形边界。

+ bodyWithEdgeFromPoint:toPoint:

在两点之间创建一个边界。

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

参数 p1:形状相对于节点原点的起始点
p2:形状相对于节点原点的结束点
返回值 一个新的基于形状的物理体

论述

一个基于形状的物理体没有体积和质量,dynamic属性值默认为NO,基于形状的物理体智能与基于体积的物理体发生碰撞。

+ bodyWithEdgeLoopFromPath:

根据路径创建一个边界回路。

+ (SKPhysicsBody *)bodyWithEdgeLoopFromPath:(CGPathRef)path

参数 path:一个相对于节点原点没有子相交的路径
返回值 一个新的基于形状的物理体

论述

一个基于形状的物理体没有体积和质量,dynamic属性值默认为NO,基于形状的物理体智能与基于体积的物理体发生碰撞。

+ bodyWithEdgeChainFromPath:

根据路径创建一个边界链。

+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path

参数 path:一个相对于节点原点没有子相交的路径
返回值 一个新的基于形状的物理体

论述

一个基于形状的物理体没有体积和质量,dynamic属性值默认为NO,基于形状的物理体智能与基于体积的物理体发生碰撞。

定义力如何影响物理体

affectedByGravity

一个布尔值,判断物理体是否受重力的影响。

@property(atomic, assign) BOOL affectedByGravity

论述

本属性定义了物理体在场景中所受到的引力。默认值为YES,本属性忽略基于形状的物理体,那个不受引力的影响。

allowsRotation

一个布尔值,判断物理体是否受一个旋转的力的影响。

@property(atomic) BOOL allowsRotation

论述

默认值为YES。本属性忽略基于形状的物理体,那个不受旋转力的影响。

dynamic

一个布尔值,判断物理体是否是运动的。

@property(atomic, getter=isDynamic) BOOL dynamic

论述

默认值为YES。如果该值为NO,物理体忽略施加在它身上的所有力。本属性忽略基于形状的物理体,那个永远是静止的。

定义物理体的属性

mass

物体的质量,以千克为单位。

@property(atomic) CGFloat mass

论述

实际单位是随意的,只要在游戏中保持一致就行。质量影响物体的动量以及如何受力的作用。

质量和密度是相互关联的。你只要更改其中一个值,另一个值会自动变化以保持与其一致。默认值基于物体的大小,以及物体的默认密度。

density

物体的密度,以千克每立方米为单位。

@property(atomic) CGFloat density

实际单位是随意的,只要在游戏中保持一致就行。

质量和密度是相互关联的。你只要更改其中一个值,另一个值会自动变化以保持与其一致。

默认值为1.0。

area

物体覆盖区域。只读。

@property(atomic, readonly) CGFloat area

论述

这个属性被用于关联密度属性,用来计算物体的质量。

friction

物体的表面粗糙度。

@property(atomic) CGFloat friction

论述

这个属性被用于施加一个与该物理体相关联的摩擦力。本属性的值必须在0.0到1.0之间。默认值为0.2。 

restitution

物体的反弹力。

@property(atomic) CGFloat restitution

论述

本属性被用于决定物体反弹时的动量。本属性的值必须在0.0到1.0之间。默认值为0.2。 

LinearDamping

物体的线性阻尼。

@property(atomic, assign) CGFloat LinearDamping

论述

本属性被用于模拟水流或者空气的阻力。本属性的值必须在0.0到1.0之间。默认值为0.1。如果该值为0.0,物理体将没有线性阻尼。

angularDamping

物体的角速度阻尼。

@property(atomic, assign) CGFloat angularDamping

论述

本属性被用于模拟水流或者空气的阻力。本属性的值必须在0.0到1.0之间。默认值为0.1。如果该值为0.0,物理体将没有角速度阻尼。

碰撞和反弹

categoryBitMask

一个16进制数,定义了物体的类别。

@property(atomic, assign) uint32_t categoryBitMask

论述

场景中每一个物理体都可以分配到超过32个不同的种类里面,每个对应位中的值。如果你在游戏中定义位码值。会同collisionBitMask属性和contactTestBitMask属性,你定义了这些在游戏用使用的相互作用。

本属性的默认值为0xFFFFFFFF。

collisionBitMask

一个16进制数,定义那种类别的物理体可以与之发生碰撞。

@property(atomic, assign) uint32_t collisionBitMask

论述

当两个物理相关联的时候,就可能发生一个碰撞。这个物体的位相对于其他物体的类别做一个逻辑上的加法操作。如果结果是一个非零的值,则该物体受到碰撞的影响。每个物体独立的选择是否受其他物体的影响,你可以用这点来避免碰撞计算,以免对物体的速度矢量产生一些微小的改变。

本属性的默认值为0xFFFFFFFF。

usesPreciseCollisionDetection

一个布尔值,表示是否使用更精确的碰撞算法。

@property(atomic) BOOL usesPreciseCollisionDetection

论述

默认值为NO。如果碰撞中的两个物体不进行精确的碰撞计算,在完全通过另一个独立矩形时,将没有碰撞被检测到。如果每个物体的该属性的值为YES,将会进行一个更精确以及更昂贵的碰撞计算。当物体又小又快的时候,本属性的值应该被设置为YES。

contactTestBitMask

一个16进制数,定义了联系的物理体的类别。

@property(atomic, assign) uint32_t contactTestBitMask

论述

当两个物体共享一个相同的形状的时候,每一个物体的种类位相对于其他相关联的物体做一个逻辑上的加法运算。如果任一个对照返回一个非零的结果,一个SKPhysicsContact对象将被创建并传递到物理世界的委托。为了获得最佳的性能,只在你感兴趣的位上设置相应地值。

默认值为0x00000000。

- allContactedBodies

与物理体联系的其他所有物理体。

- (NSArray *)allContacteBodies

参数  
返回值 与这个物理体相关联的物理体数组

物理体受力

- applyForce:

施加一个均匀作用于物理体的拉力。

- (void)applyForce:(CGFloat)froce

参数 force:一个力的矢量
返回值  

论述

测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。

这个方法以一个没有角度的力加速度物体。这种加速以一帧为一个单位。

- applyTorque

给物体添加一个扭矩。

- (void)applyTorque:(CGFloat)torque

参数 torque:扭曲量,牛顿每米
返回值  

论述

本方法产生一个角加速度,不引起任何线性加速度。这种加速以一帧为一个单位。

- applyForce:atPoint:

施加一个作用于指定点的拉力。

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

参数 force:一个力的矢量
point:受力点
返回值  

论述

测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。

因为这个力是施加到指定点的,它可能会同时产生线性加速度和角加速度。这种加速以一帧为一个单位。

- applyImpulse:

施加一个均匀作用于物理体的推力。

- (void)applyImpulse:(CGFloat)impulse

参数 impulse:一个力的矢量
返回值  

论述

测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。

这个方法以一个没有角度的力加速度物体。

- applyAngularImpulse:

向物理体施加一个角推力。

- (void)applyAngularImpulse:(CGFloat)impulse

参数 impulse:一个力的矢量
返回值  

测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。

本方法产生一个角加速度,不引起任何线性加速度。

- applyImpulse:atPoint

施加一个作用于指定点的推力。

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

参数 impulse:一个力的矢量
返回值 受力点

论述

测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。

因为这个力是施加到指定点的,它可能会同时产生线性加速度和角加速度。

查看物理体的位置和速度。

velocity

物理体的速度矢量。

@property(atomic) CGPoint velocity

angularVelocity

物理体的角速度。

@property(atomic) CGFloat angularVelocity

论述

角速度是一个围绕着一个轴矢量(0.0,0.0,1.0)的速度,单位是弧度每秒。

resting

一个布尔值,判断物理体是否静止。

@property(atomic, getter=isResting) BOOL resting

当物体静止时,这个值被自动设为YES。这表示该物体相对于参考系中其他物体是静止的。一个静止的物体是不参与到物理模拟中的,直到给它施加已给力,或者受到一个碰撞。这将提供游戏的性能。如果所有物体都是静止的,整个模拟就是静止的,将减少很多计算量。

渲染物理体节点

node

物理体所关联的节点。只读。

@property(atomic, readonly, weak) SKNode *node

论述

你通过节点的PhysicsBody属性为物理体关联一个节点。如果物理体没有关联到节点,本属性值为nil。

决定与那个物理体相连。

joints

物理体相连的物理体。只读。

@property(atomic, readonly) NSArray *joints

论述

本属性持有一个数组,该数组保存了本物理体所关联的其他所有的物理体。

原文地址:https://www.cnblogs.com/pingyunlong/p/3238742.html