Sprite kit前瞻之创造“真实”的世界
注:本文是前瞻的最后一篇文章,我们的征程即将开启,当我初学
swift
开始,同样迷茫,同样前途未卜。回想起初的一个月,初识swift
的
正文:
前文提及节点树这一概念,俗语说“开枝散叶”,想象下,每一次“开枝”就有可能产生多个新的节点,把最初的那个“枝”(孤零零的一根不开叉的树枝)当做根节点,之后“开枝”过程就是在其上增加新的节点,而新的节点回过头来说必定有其父节点。这权当是对前文的补充。
尽管我们能够精确控制节点在场景的位置(position
),说的通俗一点就是“hey Scene,请帮我把那架小飞机放置到坐标点(100,100)的位置”。然后同样按照盖套路布置好敌机以及一些背景图案等等,飞机会发射子弹,这个实现方式可以是这样,设定好产生子弹的频率,比如0.3秒产生一颗,每一帧更新时需要修改子弹的y
坐标,这样就让子弹飞一会。但是,就算子弹触碰到了敌机,也是穿其而过,敌机就好似开了无敌神圣不可侵犯!另外为了让游戏看起来更真实,子弹刚发射时有加速度,像这种物理问题比比皆是,当然这种小游戏不需要考虑那么多,我只是想引出物理世界这一话题。
在真实的世界中,物体具有质量(mass),摩擦力,光滑度等属性,篮球从高处落下会反弹,最终静止在地面上。学过物理应该知道,我们可以使用公式和自定义actions
来模拟,但是,sprite kit
框架中已经集成了该系统(物理引擎?,貌似是用c++写的,不得不承认c++牛逼),你只需要创造一个physics bodies(SKPhysicsBody)
,将其附着到节点上合二为一放置于场景即可。如何定义一个物理体呢?可以从形状(shape
),大小(size
),质量(mass
)和其他一些物理特性来构建。至于场景如何定义全局特性来模拟一个真实的世界呢?答案是SKPhysicsWorld
对象,和SKPhysicsBody
一样,但是前者是和SKScene
对象配合。物理世界中,我们可以定义重力,速度等,非常牛逼!
当物理体(本质就是一些node
,但是被附上了PhysicsBody
属性)被放置于场景当中,场景作为掌管者,将对这些物体上附着的物理属性进行仿真。像摩擦力和重力这两个力,将会自动被应用(其他力比如额外申明才能被应用),假如你将一个有质量的篮球放置到一定高度,由于重力作用而会掉落到地面!当然我们可以自定义一块区域(field
称之为 SKFieldNode
,切记任何东西你都可以看做一个节点,不管是你的角色还是游戏背景图片!),这个区域中我们自定义一个物理世界,比如我想这个世界重力减半,没有摩擦力,水平来个推力等,假如你把一个物体放置其中,区域开启自动仿真,由于有力的作用产生一个加速度,再者也许有多个物体作用,产生了碰撞,牛逼的它自然也能模拟出来!仿真结束之后,各个节点(物体)位置以及角度将会被更新。
当然实际开发中,你并不想场景中的所有物体都相互作用,因此你可以通过明确设定作用关系来解决。
内容略多,以后讲到了再详细论述