Sprite Kit Learning Note

Sprite Kit Learning Note

手动的动作系统核心思想

定义标准速率值:Point per Second

计算位置偏移量:即当前位置与目标位置的向量差

正交化偏移向量:得到偏移量的方向单位向量

计算新速度矢量:使方向向量与速率相乘,得到速度矢量

在每帧更新位置:即用速度适量乘以标量没帧更新的时间差

碰撞检测的基本思想

AABB盒几盒边界检测:在update:检测目标结点之间的frame的矩形是否相交。

预处理:通过结点name枚举结点,必要时需要处理缩小结点的farme,以dx*dy

SKAction

Move Actions : 区分MoveTo:和MoveBy:及其可逆性

Sequence Actions : 序列动作,以及序列动作的可逆性

Group Actions : 并发执行多个动作,其时间由最长时间的动作决定

Wait for duration action : 等待动作,一般用作序列动作的缓冲

Run block and selector actions : 这样的Action可以运行一段Blocks

Repeat actions : 可以设定重复一个SKAction的动作,或者永远重复

Reversing actions : 这样的动作是可逆的

Shared actions : 通过持有一个动作的引用而非临时变量优化性能

Sound actions : 可以通过SKAction直接播放音乐

Texture Animation actions : 用图片组成动画动作

SKSpriteNode

name : 标记结点,用来枚举查找,通过//来查找结点的结点

xScale : 缩放值,可用scaleTo方法调整,而zRotation :用来旋转角度,可用来旋转结点

SKBlendMode:默认为alpha,可以渲染纹理的透明像素

关于Blocks

内存分配:Blocks的内存由帧分配,不能修改无__Block修饰的对象或者非对象

引用计数:self持有Blocks的引用,Blocks持有其参数和__Blocks修饰的引用

Scroll - 滚屏的思想

分层结构:可以分为场景层和背景层,场景层为可视范围,背景层为背景和其他结点

基本思想:在update:方法以_dt间隔让使背景层的适量速度乘以_dt移动距离

背景保持:检测背景的锚点在场景层的座标(左下角)与背景宽度的负数关系

Coordinate System

基本思想:每个节点的锚点是每个节点座标系的原点,其位置是在父节点座标系的座标

座标变换:也可以通过convertPoint:from(to)Node计算父节点在子节点座标系的座标

常用场景:滚屏分层结构下的边缘检测,需要将背景层的座标转换到场景层求绝对距离

基于继承的游戏架构思想

基本思想:通过抽象类解耦并实现属性和初始化方法等共用,减少代码量

游戏场景逻辑分层的思想

基本思想:各个SKNode层专注自己的事务,各司其职。

一些应用:如传统空战游戏,HUD层、Player层、Scene层,均为SKNode

一些技巧:用属性列表初始化精灵位置是个不错的选择

HUD一些设计思想

基本思想:字符串等代替Texture等纹理

一些应用:如用NSString代替生命值,通过截断字符扣血。

SKTexture

基本概念:用于渲染(render)结点的纹理,是一张或多张图片

一些细节:尽量避免临时多次初始化,应用GCD确保静态初始化一次

一些应用:用临时的SKView渲染后返回Texture

SKLabelNode

一些要点:水平和垂直对齐模式,设置位置,设置字体等等

SKTUtilities

一些细节:注意全局预编译提,供了的播放音乐随机数边缘控制,向量数学内联方法

SKEmitterNode

基本概念:粒子发射器,用来产生粒子效果,一般用编辑器编辑归档初始化

关键帧列:KeyFrameSequence及其插值方法,设置关键帧在粒子生命周期的百分位置

目标节点:TargetNode初始位置为发射器,但是产生位置就好像是制定结点发出的。

SKPhysicBody

基本概念:结点属性,以一个大致图形包围结点用来做碰撞检测和模拟物理效果

边缘检测:PhysicBody的Static属性EdgeLoopBodies的边缘属性,无质量碰撞等属性

受力分析:冲击力和持续作用力,分别产生动量不同,作用效果不同

碰撞检测:定义独一无二BitMask检测碰撞最多32个,通过做&运算来检测碰撞

碰撞代理:用beginContact实现游戏逻辑,用endContact做一些如离开警报之类的

SKPhysicContact

基本概念:代理方法中contact对象包含bodyA和B,用他们的BitMask做|运算

一般应用:用运算得到值与目标BistMask做&运算,然后分情况讨论

其他属性:contact对象还包含碰撞位置和碰撞冲力的大小

SKPhysicJoints

固定链接:Fixed Joints即将两个物理体固定,由物理世界添加

限制链接:Limit Joints即有限长不限短的绳子固定

弹性链接:Spring Joints即弹簧可自由伸长变短

转动链接:Pin Joints即固定一个支点物体绕点旋转

滑动链接:Sliding Joints即两物体定轴滑动

SKCropNode

基本概念:提供结点遮罩特效,addChild + setMask = 遮罩效果,任意节点 

SKVideoNode

基本概念:提供结点播放视频,通常继承,必须有AVPlayer属性加载视频,可以遮罩 

SKShapeNode

基本概念:自定义凸多边形,用UIUIBezierPath描边定义轮廓,可以设置物理体等

一些细节:贝塞尔绘制必须逆时针,不交叉的闭合凸多边形,不能作为maskNode

SKEffectNode

基本概念:通过设置CIFilter,实现渐变、旋转、调色等特效,对所有其子节点均有效

一些细节:inputTime描述了duration的经过的百分比,范围是0到1

工作原理:每帧通过Filter属性渲染特效,inputTime的变化可以实现渐变特效

其他属性:inputImage和targetImage,如其名分别代表输入和输出

SKTextureAtlas

基本概念:纹理地图集高校控制源文件,一一对应无需遍历Bundle

TiledMaps

基本概念:用于渲染(render)结点的纹理,是一张或多张图片

一些细节:避免临时多次初始化,用GCD静态初始用临时的SKView渲染后返回Texture

一些细节:原始加载行列颠倒,双层循环嵌套一行N列,列用Ly - ((n - 0.5) *h)

一些细节:像素游戏主义将结点纹理的filteringMode改为Nearest

一些细节:gridSize是网格的数目,layerSize是网格数目乘以网格大小

关于滚屏:滚动背景,则永远使得屏幕原点与点击目标做差,然后移动背景到原点

边界检测:用抽象的SKNode以EdgeLoop的物理体初始化,并以CGRect包围背景

黑边检测:锚点原点左下角,屏幕焦点必须在width / 2和layer.size.width - width之间

卷动速率:通过迭代背景位置差10%,可以使得摄像机滚动更流畅

座标转换:网格到座标,用真实座标除以瓦片大小,座标到网格,(col,L-row)

精灵移动:先从网格到座标,然后再制定移动路径,网格座标判断是否合法

设置障碍:通过对tile设置物理体和碰撞分类设置障碍 - 方式1

设置障碍:通过精灵检测tile的物理题是否为障碍的分类掩码 - 方式2

全局标识:GID,从1开始,0代表没有瓦片,可以用过proForGID获取瓦片属性字典

对象图层:可以获取到TileMap实例的TMXObjGroup,包含对象字典,但无精灵类

对象涂层:通过group的objNamed属性获取单个对象或数组对象是字典包含位置信息

游戏暂停:节点的paused属性可以用来短暂开闭及其子节点的SKAction

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章