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
论述
本属性持有一个数组,该数组保存了本物理体所关联的其他所有的物理体。
SKPhysicsBody类的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- iFIERO - (一) 宇宙大战 SPACE BATTLE — 场景SCENE、SpriteKit精灵、PARTICLE粒子及背景音乐
开始游戏教程前,首先介绍一下SpriteKit是什么?SpriteKit提供了一个图形渲染和动画的基础结构,你可以使用它让任意类型的纹理图片或者精灵动起来.SpriteKit使用渲染循环,利用图形硬件 ...
- SPRITEKIT游戏框架之关于PHYSICS物理引擎属性
Spritekit提供了一个默认的物理模拟系统,用来模拟真实物理世界,可以使得编程者将注意力从力学碰撞和重力模拟的计算中解放出来,通过简单地代码来实现物理碰撞的模拟,而将注意力集中在更需要花费精力的地 ...
- iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计
本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...
- SKPhysicsJoint类
继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架 /System/Library/Frameworks/SpriteKit.framework 可用性 可用 ...
- SKNode类
继承自 UIResponder:NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架 /System/Library/Frameworks/Sprit ...
- iOS -- SpriteKit框架之SKPhysicsBody的移动和连接
SKPhysicsBody的受力移动 SKPhysicsBody对象不同于SKSpriteNode对象.SKSpriteNode对象可以通过添加动作来进行移动,SKPhysicsBody对象却没有 ...
- iOS -- SKPhysicsJointSpring类
SKPhysicsJointSpring类 继承自 NSObject 符合 NSCoding(SKPhysicsJoint)NSObject(NSObject) 框架 /System/Library ...
- iOS -- SKPhysicsWorld类
SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架 /System/Library/Frameworks/SpriteKit. ...
随机推荐
- Python 时间函数
时间的运用 #coding=utf-8 #!user/bin/python import time import calendar ticks = time.asctime(time.localtim ...
- My.Ioc 代码示例——利用 ObjectBuilderRequested 事件实现延迟注册
在使用 Ioc 框架时,一般我们建议集中在一个称为 Composition Root(其含义请参见下面的小注)的位置来注册 (Register) 和解析 (Resolve) 服务.这种做法的目的在于限 ...
- MemCachedClient数据写入的三个方法
set方法 1 将数据保存到cache服务器,如果保存成功则返回true 2 如果cache服务器存在同样的key,则替换之 3 set有5个重载方法,key和value是必须的参数,还有过期时间,h ...
- 使用Eclipse创建Hibernate工程
创建一个java project项目,加入hibernate的jar包和数据库驱动包,并引入到项目.
- QT实现单个EXE文件
有时候发布用Qt写的软件是件令人烦恼的事情,明明发布的只是一个简单功能的小软件,非得再附上一堆超大的动态链接库,实在让人觉得汗颜 . 在可执行文件单文件化方面,有多种方法.常用的是编译并使用静态 Qt ...
- Cloudera Manager(CentOS)安装介绍
相信通过这篇文章大家都对Cloudera Manager及CDH安装有一个整体的认识 目 录 1 准备工 作.................................... ...
- yii2源码学习笔记
assets 前端资源文件夹,用于管理css js等前端资源文件等 commands 包含命令行命令,文件为控制器文件 config 应用的配置文件 controllers 控制器文件 mai ...
- Aptana Studio 快捷键
窗口 Ctrl+ Shift +L 调出快捷键提示 Ctrl+ W 关闭当前标签窗口 Ctrl+ Shift + W 关闭当前标签窗口 Ctrl+ F6 (或者是Aptana的Ctrl+Tab )下一 ...
- python:open/文件操作
open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式 如:' ...
- 10个Java面试题及答案
1. 什么是JVM? 为什么称Java为跨平台的编程语言? Java虚拟机(Java Virtual Machine)是可以执行Java字节码的虚拟机,每个Java源文件将被编译成字节码文件,然后在J ...