SKNode类
继承自 | UIResponder:NSObject |
符合 | NSCoding NSCopying NSObject(NSObject) |
框架 | /System/Library/Frameworks/SpriteKit.framework |
可用性 | 可用于iOS 7.0或者更晚的版本 |
声明于 | SKNode.h |
参考指南 | Sprite Kit Progamming Guide |
概览
重要提示:这是一个初步的API或者开发技术文档。虽然已经审阅了本文档的技术准确性,但是它不是最终的版本。本机密信息仅适用于苹果开发者计划的注册会员。苹果提供这些机密信息来帮助你采用这些技术和编程接口。此信息如果有变更,根据本文档实现的软件应使用操作系统软件和最终文档测试。新版本的文档可能会拥有新的API或者技术。 |
一个节点类是大部分游戏内容的基本建筑块。所有的视觉元素都是通过节点类的子类来绘制的。
节点类提供了一下这些子类。
SKSpriteNode | 一个绘制纹理精灵的节点 |
SKVideoNode | 一个播放视频类容的节点 |
SKLabelNode | 一个绘制文本类容的节点 |
SKShapeNode | 一个绘制形状的节点,该形状基于一个CGPath |
SKEmitterNode | 一个创建和渲染粒子的节点 |
SKCropNode | 一个通过遮罩绘制部分子节点的节点 |
SKEffectNode | 一个通过核心图像过滤器过滤的节点 |
节点特性
节点是分层组织到节点树的,就好比视图和子视图。大多数情况下,一个节点树将场景节点定义为根节点,其他内容为子节点。场景节点运行一个动画循环来处理节点上的动作,模拟物理特性,然后渲染并显示节点树的内容。
节点树中的所有节点为其子节点提供一个坐标系。一个子节点添加到节点树后,通过设置它的position属性和zPosition属性来确定其相对于父节点的位置。通过xScale属性,yScale属性和zRotation属性可以缩放和旋转节点坐标系。当节点坐标系被缩放或者旋转的时候,变化将作用于节点本身以及其子节点。
节点类本身不能被绘制,但是,许多节点类的子类绘制视觉内容,所以节点类了解一些视觉概念:
1.frame属性提供节点视觉内容的边界矩形,可以被scale属性和rotation属性修改。当节点类绘制内容是,frame属性是非空的。每个节点子类描述的内容大小的方式是不同的。在一些子类里面,节点内容的大小是明确表示的,比如SKSpriteNode类。在其他子类里面,节点内容的大小可以通过其他对象的大小隐蔽的计算出来。例如,一个标签对象通过消息文本和字体特征来决定其内容的大小。 |
2.一个积累边框,通过调用calculateAccumulatedFrame方法检索,找出一个最大的矩形,该矩形包含节点和其所有子节点的边框。 |
3.其他属性,比如alpha属性和hidden属性,会影响节点如何绘制。 |
所有节点可以直接响应用户交互在屏幕上显示。你也可以转换坐标系,执行点击测试,来确定触摸的点在哪个节点上。你也可以点击它们的交叉区域来判断它们是不是在物理上重叠。
节点树上的任何节点可以运行动作,这是用来制作动画的一个节点属性,添加或删除节点,播放声音或者其他自定义操作。动作是动画系统的心脏。
节点可以支持物理体,这是一个模拟对象物理属性的属性。当节点有一个物理体的时候,节点为物理体自动模拟计算一个位置,然后移动或者旋转节点去适应这个位置。
子类注意事项
当你继承SKNode或者它的其他子类,如果你在类中添加一个需要存档的特性,你必须在你的类中实现NSCoding协议。详细内容参见Archives and Serializations Programming Gudie。
与views不同,你不能创建节点类的子类来执行自定义绘制。
操作
创建一个新的节点。
+ node |
创建一个新的节点。
+ (id)node
参数 | |
返回值 | 一个新的初始化好的节点实例 |
论述
一个节点实例不能直接绘制或者执行一些其他的操作,所以通常的用法是实例化一个节点类的子类。但是你可以创建一个节点类实例去和节点树中另一个节点类实例相关联。
检查节点的位置。
frame |
节点在父坐标系中的矩形,无视其子节点。
@property(atomic, readonly) CGRect frame
论述
这个矩形是包含节点内容的矩形中的最小的一个,考虑到xScale属性,yScale属性和zRotation属性。不是所有的节点都能包含其自身内容。
- calculateAccumulatedFrame |
在父坐标系中计算一个矩形,该矩形包含节点和其子节点的内容。
- (CGRect)calculateAccumulatedFrame
论述
这个矩形充分考虑了节点树中每个节点的xScale属性,yScale属性和zRotation属性。
position |
节点在父坐标系中的位置。
@property(atomic) CGPoint position
论述
默认值为(0.0,0.0)。
zPosition |
节点在父坐标系中的可视深度。
@property(atomic) CGPoint zPosition
默认值为0.0。父节点坐标系中的z轴越远离视图,z值较大的节点越远。当节点绘制自身内容时,它首先绘制自身,然后按z值从大到小依次绘制子节点。如果两个子节点z值相同,在子节点数组中靠前的子节点将先被绘制。点击测试以相反的顺序处理。
设置节点的缩放和旋转。
- setScale: |
设置节点的xScale和yScale。
- (void)setScale:(CGFloat)scale
参数 | scale:节点的xScale和yScale的新值 |
返回值 |
xScale |
一个缩放因子,与节点和其子类的宽相乘。
@property(atomic) CGFloat xScale
论述
该属性缩放节点及其子类的宽度。该属性影响节点frame属性的计算,点击测试区域,绘制以及模拟特征。默认值为1.0。
yScale |
一个缩放因子,与节点和其子类的高相乘。
@property(atomic) CGFloat yScale
论述
该属性缩放节点及其子类的宽度。该属性影响节点frame属性的计算,点击测试区域,绘制以及模拟特征。默认值为1.0。
zRotation |
关于Z轴的旋转,以弧度为单位。
@property(atomic) CGFloat zRotation
论述
默认值为0.0,表示没有旋转。正值表示逆时针旋转。当坐标系旋转时,会影响节点本身及其子类。旋转会影响节点的frame属性,点击测试,绘制以及其他的模拟特征。
检查节点可视性。
alpha |
节点内容的alpha值。
@property(atomic) CGFloat alpha
论述
默认值为1.0。节点类不能直接绘制,但是它的大多数子类可以。当一个节点类,或者它的任何一个子类被绘制的时候,每个像素的alpha值与节点的alpha属性相乘,然后将范围限制在0.0到1.0范围内。修改的alpha值被用于将像素值混合到父缓冲区。子类渲染内容,定义属性,关联alpha值的混合选项将像素值混合输出到父缓冲区。
hidden |
一个布尔值,决定节点和其子节点是否绘制。
@property(atomic, getter=isHidden) BOOL hidden
论述
当隐藏节点时,节点及其子节点将不会被绘制,但是他们仍然是存在并且起作用的。例如,节点的动作仍然在执行,节点仍然可以和其他节点相交。默认值为0.0。
决定一个节点是否支持用户交互。
userInteractionEnabled |
一个布尔值,决定节点是否接受点击事件。
@property(getter=isUserInteractionEnabled) BOOL userInteractionEnabled
论述
默认值为NO。
使用节点树
- addChild: |
在尾端添加一个子节点。
- (void)addChild:(SKNode *)node
参数 | node:需要添加的节点 |
返回值 |
- insertChild:atIndex: |
在指定位置插入一个子节点。
- (void)insertChild:(SKNode *)node atIndex:(NSInteger)index
参数 | node:需要添加的节点 index:插入节点的位置 |
返回值 |
- removeFromParent |
将本节点从其父节点中删除。
- (void)removeFromParent
- removeAllChildren |
删除本节点的所有子节点。
- (void)removeAllChileren
- removeChildrenInArray: |
将本节点在数组中的子节点删除。
- (void)removeChildrenInArray:(NSArray *)nodes
参数 | nodes:需要删除的节点数组 |
返回值 |
children |
节点的所有子节点。
@property(atomic, readonly) NSArray *children
论述
当前节点的所有子节点。
parent |
节点的父节点。
@property(atomic, readonly) SKNode *parent
论述
如果当前节点不在节点树中,该值为nil。
scene |
含有该节点的场景节点。
@property(atomic, readonly) SKScene *scene
论述
如果当前节点没有加到场景中,该属性值为nil。
节点命名
name |
节点的命名。
@property(atomic, copy) NSString *name
论述
给节点分配一个供后面参考的名字。当选择节点名字时,你需要决定是每个节点单独有一个名字,还是一些节点共享一个名字。如果你为节点分配一个单独的名字,你可以通过调用childNodeWithName:方法找到它。如果一个名字被多个节点公用,这个名字通常意味者在游戏中这些节点是相似的。这时候,你可以通过调用enumerateChildNodesWithName:usingBlock:方法遍历这些节点。
- childNodeWithName: |
通过一个指定的名字查找字节点。
- (SKNode *)childNodeWithName:(NSString *)name
参数 | name:需要添加的节点 |
返回值 | 如果找到指定节点则返回该节点,否则返回nil |
论述
如果超过一个节点共享同一个名字,数组中最早的节点将被返回。
- enumrateChildNodesWithName:usingBlock: |
对查找出来的共享一个名字的子节点进行处理。
- (void)enumrateChildNodesWithName:(NSString *)name usingBlock:(void(^)(SKNode *node, BOOL *stop))block
参数 | name:需要添加的节点 block:需要执行的符合name参数的代码块,它有一下参数 node:一个符合name参数的节点 stop:一个布尔值指针,可以将这个值设为YES来终止枚举 |
返回值 |
论述
这个方法枚举子数组,找到符合名字参数的节点。每个节点找出来后,都将执行一遍代码块。
运行动作。
- runAction: |
添加一个节点执行的动作列表。
- (void)runAction:(SKAction *)action
参数 | action:需要执行的动作 |
返回值 |
论述
新的动作在场景动画的下一次循环的时候将被处理。
- runAction:completion: |
添加一个节点执行的动作列表。动作完成时执行你的代码块。
- (void)runAction:(SKAction *)action completion:(void (^)())block
参数 | action:需要执行的动作 block:动作完成后需要执行的代码块 |
返回值 |
- runAction:withKey: |
添加一个节点执行的可识别的动作列表。
- (void)runAction:(SKAction *)action withKey:(NSString *)key
参数 | action:需要执行的动作 key:一个用于指定动作的key |
返回值 |
论述
这个方法与runAction:相同,但是这个动作是存起来的,所以它可以在后面被检索出来。如果一个使用相同key的动作正在运行,它将在新动作添加之前被删除。
- actionForKey: |
返回一个与指定key相关联的动作。
- (SKAction *)actionForKey:(NSString *)key
参数 | key:动作关联的key |
返回值 | 一个与key关联的动作,若没有,则返回nil |
- hasActions |
判断节点是否有正在执行的动作。
- (BOOL)hasActions
参数 | |
返回值 | 如果有正在执行的动作则返回YES,否则返回NO |
- removeAllActions |
结束并移除节点的所有动作。
- (void)removeAllActions
论述
当一个动作从节点中删除时,动作剩余的所有动画将被跳过。然而,以前的更改不会恢复。当动作删除时,该动作对场景的最终改变将发生也是可能的,如果是这样,这个动作是动作类中记录的指定动作。
- removeActionForKey |
移除一个与指定key相关联的动作。
- (void)removeActionForKey:(NSString *)key
参数 | key:关联动作的key |
返回值 |
论述
如果找到与key相符合的节点,则删除这个节点。
speed |
修改节点与其子类执行动作的速度。
@property(atomic) CGFloat speed
论述
默认值为1.0,意味着动作以正常速度执行。如果你设置一个不同的速度,节点及其子节点的所有动作的执行速度将会变快或者变慢。例如,如果你将速度值设为2.0,动作将以两倍速度执行。
paused |
一个布尔值,判断是否暂停节点与其子节点的动作。
@property(atomic, getter=isPaused) BOOL paused
论述
如果该值为YES,当场景执行动作时,节点及其子节点将跳过动作执行。
为节点添加物理特性。
physicsBody |
为节点关联一个物理体。
@property(atomic, retain) SKPhysicsBody *physicsBody
论述
默认值为nil,表示节点完全不加入物理特性。如果提供一个物理体,当场景进行物理模拟时,物理体更新节点的位置和旋转。
转换节点的坐标系统。
- convertPoint:fromNode |
将节点树中另一个节点的坐标系的一个点转换为本节点的坐标系。
- (CGPoint)convertPoint:(CGPoint)point fromNode:(SKNode *)node
参数 | point:其他坐标系上的一个点 node:同一个节点树上的另一个节点 |
返回值 | 转换到本节点坐标系的同一个点 |
- convertPoint:toNode |
将本节点坐标系中的一个点转换为节点树中另一个节点的坐标系。
- (CGPoint)convertPoint:(CGPoint)point toNode:(SKNode *)node
参数 | point:本节点坐标系上的一个点 node:同一个节点树上的另一个节点 |
返回值 | 转换到其他节点坐标系的同一个点 |
决定一个点是否位于节点。
- containsPoint |
判断节点矩形是否包含这个点。
- (BOOL)containsPoint:(CGPoint)p
参数 | p:节点坐标系中的一个点 |
返回值 | 如果矩形中有这个点则返回YES,否则返回NO。 |
- nodeAtPoint: |
返回位于此点的最深的子节点。
- (SKNode)nodeAtPoint:(CGPoint)p
参数 | p:节点坐标系中的一个点 |
返回值 | 如果多个子节点包含这个点,树中最深的点将被返回。如果多个点在同一层,z位置最小的节点将被返回。 |
论述
如果一个点通过calculateAccumulatedFrame方法在矩形区域内,那么认为这个点在这个节点内。
- nodesAtPoint |
返回位于此点的所有子节点。
- (NSArray *)nodesAtPoint:(CGPoint)p
参数 | p:节点坐标系中的一个点 |
返回值 | 包含此点的所有节点的数组 |
论述
如果一个点通过calculateAccumulatedFrame方法在矩形区域内,那么认为这个点在这个节点内。
判断节点相交。
- intersectsNode: |
判断一个节点是否与一个指定节点相交。
- (BOOL)intersectsNode:(SKNode *)node
参数 | node:同一个节点树中的另一个节点 |
返回值 | 如果两个节点相交则返回YES,否则返回NO |
论述
如果两个节点的frame相交,则认为两个节点相交。这个方法中,两个节点各自所有的子节点将被忽略。
存储自定义节点。
userData |
一个包含任何数据的字典。
@property(atomic, retain) NSDictionary *userData
论述
你可以是用这个属性在节点中存储自己的数据。例如,你可以存储一个与游戏逻辑有关的指定的数据在每个节点中。这在替代你使用自建的子类存储数据时非常有用。数据将在节点被存储的时候存储。
常量
节点混合模式。
typedef NS_ENUM(NSInteger,
SKBlendMode){
SKBlendModeAlpha = 0,
SKBlendModeAdd = 1,
SKBlendModeSubtract = 2,
SKBlendModeMultiply = 3,
SKBlendModeMultiplyX2 = 4,
SKBlendModeScreen = 5,
SKBlendModeReplace = 6,
}
SKBlendModeAlpha | 源颜色乘以alpha值 |
SKBlendModeAdd | 源颜色和目标颜色相加 |
SKBlendModeSubtract | 目标颜色减去源颜色 |
SKBlendModeMultiply | 源颜色乘以目标颜色 |
SKBlendModeMultiplyX2 | 源颜色乘以目标颜色乘以2 |
SKBlendModeScreen | 源颜色乘以目标颜色乘以倒源色 |
SKBlendModeReplace | 源颜色替换目标颜色 |