美文网首页iOS学习开发iOS开发技术分享
SpriteKit当中的SKPhysicsBody类

SpriteKit当中的SKPhysicsBody类

作者: 弹吉他的少年 | 来源:发表于2018-11-07 10:21 被阅读56次
    SpriteKit SKPhysicsBody类
    继承自 NSObject
    符合 NSCoding,NSCopying,NSObject(NSObject)
    框架 /System/Library/Frameworks/SpriteKit.framework
    声明于 SKPhysicsBody.h
    参考指南 Sprite Kit Progamming Guide

    概览

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

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

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

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

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

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

    其他相关的物理类

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

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

    操作

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

    + (SKPhysicsBody *)bodyWithCircleOfRadius:(CGFloat)r
    
    参数 解释
    r 圆的半径

    返回值

    • 一个新的基于体积的物理体

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

    + (SKPhysicsBody *)bodyWithRectangleOfSize(CGSize)s
    
    参数 解释
    s 矩形的大小

    返回值

    • 一个新的基于体积的物理体

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

    + (SKPhysicsBody *)bodyWithPolygonFromPath(CGPathRef)path
    
    参数 解释
    path 一个逆时针没有相交的凸多边形路径,指定点相对于节点原点

    返回值

    • 一个新的基于体积的物理体

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

    + (SKPhysicsBody *)bodyWithEdgeLoopFromRect(CGRect)rect
    
    参数 解释
    rect 一个相对于原点的矩形

    返回值

    • 一个新的基于形状的物理体

    论述

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

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

    + (SKPhysicsBody *)bodyWithEdgeFromPoint(CGPoint)p1 toPoint:(CGPoint)p2
    
    参数 解释
    p1 形状相对于节点原点的起始点
    p2 形状相对于节点原点的结束点

    返回值

    • 一个新的基于形状的物理体

    论述

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

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

    + (SKPhysicsBody *)bodyWithEdgeLoopFromPath:(CGPathRef)path
    
    参数 解释
    path 一个相对于节点原点没有子相交的路径

    返回值

    • 一个新的基于形状的物理体

    论述

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

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

    + (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path
    
    参数 解释
    path 一个相对于节点原点没有子相交的路径

    返回值

    • 一个新的基于形状的物理体

    论述

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

    属性

    属性名 结果 论述
    affectedByGravity 一个布尔值,判断物理体是否受重力的影响 本属性定义了物理体在场景中所受到的引力。默认值为YES,本属性忽略基于形状的物理体,那个不受引力的影响。
    allowsRotation 一个布尔值,判断物理体是否受一个旋转的力的影响 默认值为YES。本属性忽略基于形状的物理体,那个不受旋转力的影响。
    dynamic 一个布尔值,判断物理体是否是运动的 默认值为YES。如果该值为NO,物理体忽略施加在它身上的所有力。本属性忽略基于形状的物理体,那个永远是静止的
    mass 物体的质量,以千克为单位 实际单位是随意的,只要在游戏中保持一致就行。质量影响物体的动量以及如何受力的作用。质量和密度是相互关联的。你只要更改其中一个值,另一个值会自动变化以保持与其一致。默认值基于物体的大小
    density 物体的密度,以千克每立方米为单位 实际单位是随意的,只要在游戏中保持一致就行质量和密度是相互关联的。你只要更改其中一个值,另一个值会自动变化以保持与其一致。默认值为1.0。
    area 物体覆盖区域。只读 这个属性被用于关联密度属性,用来计算物体的质量。
    friction 物体的表面粗糙度 这个属性被用于施加一个与该物理体相关联的摩擦力。本属性的值必须在0.0到1.0之间。默认值为0.2。
    restitution 物体的反弹力 本属性被用于决定物体反弹时的动量。本属性的值必须在0.0到1.0之间。默认值为0.2。
    LinearDamping 物体的线性阻尼 本属性被用于模拟水流或者空气的阻力。本属性的值必须在0.0到1.0之间。默认值为0.1。如果该值为0.0,物理体将没有线性阻尼。
    angularDamping 物体的角速度阻尼 本属性被用于模拟水流或者空气的阻力。本属性的值必须在0.0到1.0之间。默认值为0.1。如果该值为0.0,物理体将没有角速度阻尼。
    categoryBitMask 一个16进制数,定义了物体的类别 场景中每一个物理体都可以分配到超过32个不同的种类里面,每个对应位中的值。如果你在游戏中定义位码值。会同collisionBitMask属性和contactTestBitMask属性,你定义了这些在游戏用使用的相互作用。本属性的默认值为0xFFFFFFFF。
    collisionBitMask 一个16进制数,定义那种类别的物理体可以与之发生碰撞 当两个物理相关联的时候,就可能发生一个碰撞。这个物体的位相对于其他物体的类别做一个逻辑上的加法操作。如果结果是一个非零的值,则该物体受到碰撞的影响。每个物体独立的选择是否受其他物体的影响,你可以用这点来避免碰撞计算,以免对物体的速度矢量产生一些微小的改变,本属性的默认值为0xFFFFFFFF。
    usesPreciseCollisionDetection 一个布尔值,表示是否使用更精确的碰撞算法 默认值为NO。如果碰撞中的两个物体不进行精确的碰撞计算,在完全通过另一个独立矩形时,将没有碰撞被检测到。如果每个物体的该属性的值为YES,将会进行一个更精确以及更昂贵的碰撞计算。当物体又小又快的时候,本属性的值应该被设置为YES。
    contactTestBitMask 一个16进制数,定义了联系的物理体的类别 当两个物体共享一个相同的形状的时候,每一个物体的种类位相对于其他相关联的物体做一个逻辑上的加法运算。如果任一个对照返回一个非零的结果,一个SKPhysicsContact对象将被创建并传递到物理世界的委托。为了获得最佳的性能,只在你感兴趣的位上设置相应地值,默认值为0x00000000。

    方法

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

    - (NSArray *)allContacteBodies
    

    返回值

    • 与这个物理体相关联的物理体数组

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

    - (void)applyForce:(CGFloat)froce
    
    参数 解释
    force 一个力的矢量

    论述

    测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。
    这个方法以一个没有角度的力加速度物体。这种加速以一帧为一个单位。

    给物体添加一个扭矩。

    - (void)applyTorque:(CGFloat)torque
    
    参数 解释
    torque 扭曲量,牛顿每米

    论述

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

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

    - (void)applyForce:(CGFloat)force atPoint:(CGPoint)point
    
    参数 解释
    force 一个力的矢量
    point 受力点

    论述

    测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。
    因为这个力是施加到指定点的,它可能会同时产生线性加速度和角加速度。这种加速以一帧为一个单位。

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

    - (void)applyImpulse:(CGFloat)impulse
    
    参数 解释
    impulse 一个力的矢量

    论述

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

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

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

    - (void)applyAngularImpulse:(CGFloat)impulse
    
    参数 解释
    impulse 一个力的矢量

    返回值

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

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

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

    - (void)applyImpulse:(CGFloat)impulse atPoint:(CGPoint)point
    
    参数 解释
    impulse 一个力的矢量

    返回值

    • 受力点

    论述

    测量单位为牛顿,实际上单位是随意的,只要你在游戏中和物体的质量保持一致。
    因为这个力是施加到指定点的,它可能会同时产生线性加速度和角加速度。
    查看物理体的位置和速度。

    属性

    属性名 结果 论述
    velocity 物理体的速度矢量 -
    angularVelocity 物理体的角速度 角速度是一个围绕着一个轴矢量(0.0,0.0,1.0)的速度,单位是弧度每秒。
    resting 一个布尔值,判断物理体是否静止 当物体静止时,这个值被自动设为YES。这表示该物体相对于参考系中其他物体是静止的。一个静止的物体是不参与到物理模拟中的,直到给它施加已给力,或者受到一个碰撞。这将提供游戏的性能。如果所有物体都是静止的,整个模拟就是静止的,将减少很多计算量。
    node 物理体所关联的节点。只读 你通过节点的PhysicsBody属性为物理体关联一个节点。如果物理体没有关联到节点,本属性值为nil。
    joints 物理体相连的物理体。只读 本属性持有一个数组,该数组保存了本物理体所关联的其他所有的物理体。

    相关文章

      网友评论

        本文标题:SpriteKit当中的SKPhysicsBody类

        本文链接:https://www.haomeiwen.com/subject/vaymxqtx.html