继承自 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类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. iFIERO - (一) 宇宙大战 SPACE BATTLE — 场景SCENE、SpriteKit精灵、PARTICLE粒子及背景音乐

    开始游戏教程前,首先介绍一下SpriteKit是什么?SpriteKit提供了一个图形渲染和动画的基础结构,你可以使用它让任意类型的纹理图片或者精灵动起来.SpriteKit使用渲染循环,利用图形硬件 ...

  3. SPRITEKIT游戏框架之关于PHYSICS物理引擎属性

    Spritekit提供了一个默认的物理模拟系统,用来模拟真实物理世界,可以使得编程者将注意力从力学碰撞和重力模拟的计算中解放出来,通过简单地代码来实现物理碰撞的模拟,而将注意力集中在更需要花费精力的地 ...

  4. iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计

    本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...

  5. SKPhysicsJoint类

    继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用 ...

  6. SKNode类

    继承自 UIResponder:NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架  /System/Library/Frameworks/Sprit ...

  7. iOS -- SpriteKit框架之SKPhysicsBody的移动和连接

      SKPhysicsBody的受力移动 SKPhysicsBody对象不同于SKSpriteNode对象.SKSpriteNode对象可以通过添加动作来进行移动,SKPhysicsBody对象却没有 ...

  8. iOS -- SKPhysicsJointSpring类

    SKPhysicsJointSpring类 继承自 NSObject 符合 NSCoding(SKPhysicsJoint)NSObject(NSObject) 框架  /System/Library ...

  9. iOS -- SKPhysicsWorld类

    SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit. ...

随机推荐

  1. java 手动清理缓存的方法

    有时候会感觉代码如何也查不出问题,可是缓存就是清好几遍了 这个时候就试试手动清理缓存 到你的编译路径下面 E:\java-workspace\wem\work\org\apache\jsp 手动删除你 ...

  2. Swift - 22 - 循环结构

    //: Playground - noun: a place where people can play import UIKit // for-in for i in -99...99 { i * ...

  3. 开始Swift之旅 - HelloWorld

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  4. 32.Spring-对象依赖.md

    [toc] 1.对象依赖的分类 Spring中,给对象属性赋值的方法: 构造函数 Set方法 p命名空间 自动装配 注解 1.1构造函数 构造方法通过配置文件中constructor-arg标签实现, ...

  5. 解决tomcat占用8080端口问题

    在dos下,输入  netstat   -ano|findstr  8080 //说明:查看占用8080端口的进程 显示占用端口的进程 askkill  /pid  44464  /f  //说明,运 ...

  6. C++封装常用对象和对头文件探索

    在C++实际开发中,难免会使用到一些你极为常用的算法(比如笔者经常使用的多线程技术),实现这些算法的类或是全局函数或是命名空间等等经常都要被使用多次,你会有哪些办法来使用呢?笔者有4个办法. 第一个方 ...

  7. python3 解析apk图标

    有两处值小点,一是如何解压缩,另一个是如何写文件,第二点上我找的是phthon2的代码,一直写文件的时候报不是字符串的问题,将打开方式加上"b“的模式搞定 print文件出来直接删除了,原因 ...

  8. hdu1405 第六周J题(质因数分解)

    J - 数论,质因数分解 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Desc ...

  9. raspberry pi 3 截图及查看

    RASPBIAN JESSIE WITH PIXEL Image with PIXEL desktop based on Debian Jessie Version:November 2016 Rel ...

  10. X-SCAN扫描器插件(MYSQL弱口令以及Mongodb未授权)

    因为在很多时候的内网扫描里面没有授权的WIN的好用的,稍微小点的弱口令扫描器(生成报告,多种服务),编译成了插件,再自己弄了个MONGODB的扫描插件用着. X-SCAN加载以后: MONGODB.p ...