首页 > 代码库 > SpriteKit 初探
SpriteKit 初探
1. SpriteKit概述
SpriteKit是苹果提供的一个原生2D游戏框架,它支持纹理精灵、粒子特效、物理引擎等游戏开发元素。
SpriteKit优缺点:
SpriteKit的坐标系:
2. SpriteKit框架中常用类介绍
1.)SKView
? SKView是用于展现SKScene节点的视图
? 可以使用presentScene:和presentScene:transition:方法展现场景
? 注意:不允许编写SKView的子类
2.) SKScene
? 场景是内容的根节点,用于在一个SKView上显示SpriteKit内容
? 场景是无限大的,其中的内容,通过视口(viewport)呈现给用户
? 实例化场景时,size参数用于定义展现场景视口(viewport)的大小
? 要显示场景的其他位置的内容,将视口移动到相应位置即可,可以创建一个SKNode负责视口的变化
3.)SKNode
? SKNode是SpriteKit场景图形节点。这些分支节点与几何叶节点一起构成SpriteKit场景图树的有向无环图(DAG)
? 除根节点外,所有的节点都具有唯一的父节点,叶节点没有子节点,同时包含一些满足DAG条件的可共享数据
? 所谓有向无环图是指:任意一条边有方向,且不存在环路的图
? 基本属性:
? frame/position:边框/位置
? zPosition/zRotation:Z轴方向位置/旋转角度
? xScale/yScale:X/Y轴方向缩放比例
? speed:速度
? alpha:透明度
? paused:控制动画暂停
? hidden:控制是否隐藏
? userInteractionEnabled:是否允许用户交互
? parent:父节点
? children:子节点数组
? name:名称(在一个场景树中应该保持唯一)
? scene:当前所在场景
? physicsBody:物理刚体,节点的物理属性描述,例如:形状、密度等
? userData:针对当前节点的用户数据字典,默认为nil
? 子类
? SKSpriteNode:精灵节点,是一个2D纹理节点,在指定矩形区域内快速显示图像
? KLabelNode:使用指定的字体显示文本标签
? SKShapeNode:使用指定的路径绘制或填充形状
? SKVideoNode:视频节点,提供视频播放支持
? SKEmitterNode:粒子发射器节点,提供粒子效果支持
? SKCropNode:裁剪组件,使用遮罩裁剪其内部的子节点
? SKEffectNode:使用帧缓冲效果渲染节点结果,用于生成某一时刻的屏幕快照
4.)SKAction
? SKAction是一个动作,通过SKScene场景中的节点执行(runAction),将动作绑定到节点,可以改变节点的结构和内容,也可以改变场景
? 常用的Action
? removeFromParent:将一个node从其父节点上移除,当不再需要使用某个节点时,使用方法可以从scene上移除
? sequence(系列):按顺序依次执行多个action
? group(组):同时并发执行多个action
? repeatAction(重复):按指定次数重复action、sequence、group
? repeatActionForever(重复):无限循环action、sequence、group
3. SpriteKit的渲染过程
4. SpriteKit的物理引擎
? 物理世界(physics world)是用来进行物理仿真的空间,默认被创建在scene之上
? 在Sprite Kit中,可以为每个sprite设置一个物理刚体(physicsbody)以实现碰撞检测。物理刚体可以不必与sprite自身的形状(即显示图像)一致,通常物理刚体并不需要精确到每个点,而这已经足以适用于大多数游戏了
? 设置参与碰撞检测物体的类别掩码(categoryBitMask),用于区分不同的物理对象。当检测到两种sprite的物理刚体发生碰撞时,通过category可以区分出精灵的类型,并根据类别做出不同的处理
? 设置代理,检测物体碰撞。当检测到碰撞时,根据碰撞对象的类别,做后续处理,例如播放声音或者动画,代理类为SKPhysicsContactDelegate。
5. 额外的奖励:
5.1 如何利用Xcode产生一个纹理集合 ?
基本步骤:
1. 把图片素材放在一个文件夹中
2. 把该文件夹取名为name.atlas
3. 选中文件 -> 把文件加入到项目中
4. 在编辑区域,选中你的项目并点击Build Settings5. 在搜索区域输入Sprite,并按下return
6. 设置“Enable TextureAtlas Generation” 为YES
5.2 如何使用纹理动画 ?
//1. 实例化纹理集 SKTextureAtlas *altas = [SKTextureAtlas atlasNamed:@"image"]; _textureArray = [NSMutableArray array]; for (int i=1; i<=5; i++) { SKTexture *texture = nil; //2.加载所有纹理集中的纹理到数组 texture = [altas textureNamed:[NSString stringWithFormat:@"%d.png", i]]; [_textureArray addObject:texture]; } //3.实例化纹理精灵 SKSpriteNode *text = [SKSpriteNode spriteNodeWithTexture:_textureArray[0]]; text.position = CGPointMake(100, 100); [self addChild:text]; _text = text; //4. 动画化纹理精灵 SKAction *action = [SKAction animateWithTextures:_textureArray timePerFrame:0.2f]; [_text runAction:[SKAction repeatActionForever:action]];
SpriteKit 初探