iOS Sprite Kit最新特性Physics Field虚拟物理场Swift测试

发布于:2014-06-16 14:25阅读数:

在WWDC2014上,Sprite Kit又有了很多新的提升!其中一个很有意思的东西就是Physics Field!也就是物理场!这意味着我们在Sprite kit上编写虚拟物理场的游戏将变得非常简单!

转自songrotek的博客

 

在WWDC2014上,Sprite Kit又有了很多新的提升!其中一个很有意思的东西就是Physics Field!也就是物理场!这意味着我们在Sprite kit上编写虚拟物理场的游戏将变得非常简单!

 

这里我根据WWDC2014上What's new in Sprite kit的官方视频上的DEMO,用Swift语言自己做了一个Demo。

 

截图如下:

先放上GitHub链接:

https://github.com/songrotek/PhysicsFieldsWorld.git

 

我另外录制了效果视频大家可以先一睹为快:

http://v.youku.com/v_show/id_XNzI2MzUzNzYw.html

 

下面介绍一下Physics Field!

 

1. 总体情况

Sprite Kit的物理场Physics Field一共有十个:

 

  1. enum FieldType{ 
  2.  
  3.     case LinearGravityField  // 线性重力场 
  4.  
  5.     case RadialGravityField  // 放射重力场 
  6.  
  7.     case DragField  // 阻力场 
  8.  
  9.     case VortexField  // 涡流场 
  10.  
  11.     case VelocityField // 速度场 
  12.  
  13.     case NoiseField  // 噪声场 
  14.  
  15.     case TurbulenceField  //紊乱场 
  16.  
  17.     case SpringField // 弹簧场 
  18.  
  19.     case ElectricField // 电子场 
  20.  
  21.     case MagneticField // 磁场 
  22.  

 

2. 场的通用参数

那么所有类型的场都在SKFieldNode这个类中进行创建和设置!

 

无论是什么类型的场,都有一些通用的参数设置。如下:

  1. // 场的影响区域,超出区域的物体不受场影响,默认是无限 
  2.  
  3. var region: SKRegion!  
  4.  
  5. // 场强,默认是1 
  6.  
  7. var strength: CFloat  
  8.  
  9. // 场的衰减指数,用来计算某个距离的作用力大小,从最小半径开始计算。默认是0 
  10.  
  11. var falloff: CFloat 
  12.  
  13. // 场的最小影响半径,默认是一个非常小的数 
  14.  
  15. var minimumRadius: CFloat 
  16.  
  17. // 如果enabled,则场起作用默认是true(在Swift下貌似不太好使,估计beta问题 
  18.  
  19. var enabled: Bool 
  20.  
  21. // 场的排他性,如果是true,则其他场无法作用在本场region范围。如果有两个场的影响范围重合,则无法判断哪个场作用 
  22.  
  23. var exclusive: Bool     
  24.  
  25. // 场的作用物体类别,默认是all 
  26.  
  27. @see SKPhysicsBody.fieldBitMask 
  28.  
  29. @see SKEmitterNode.fieldBitMask 
  30.  
  31. var categoryBitMask: UInt32 

 

3.场的创建

举例创建弹簧场:

  1. let springField = SKFieldNode.springField() 
  2.  
  3. springField.strength = 0.05 
  4.  
  5. springField.falloff = -5 
  6.  
  7. springField.position = fieldCenter 
  8.  
  9. springField.name = "SpringField" 
  10.  
  11. addChild(springField) 

 

其他场一样的方式,就是参数的设置根据具体需要不一样

 

4.每种场!

4.1 线性场Linear Gravity Field

就是符合牛顿第二定律 F=ma。

 

用它可以制造各种方向的重力,当然用physics world的gravity也可以设置,但这个场可以设置范围。 

 

4.2 放射重力场 Radial Gravity Field

要模拟一下月球绕着地球转就得用这个,重力场在一个点上。 

 

4.3 阻力场 Drag Field

在这个场就像一个物体运动遇到摩擦要减速,摩擦力取决于物体的速度。 

 

4.4 涡流场 Vortex Field

这个场可以用来制作龙卷风的效果,场的力绕着中心转,如果strength为正就是逆时针,如果为负就是顺时针。 

 

4.5 噪声场 Noise Field 和 紊乱场 Turbulence Field

噪声场就是每个位置受力情况随机,有个smoothness参数来调整噪声力的平滑程度。紊乱场合噪声场很接近,但对物体的影响较小。 

 

4.6 弹簧场 Spring Field

可以使物体像连接到了场中心的弹簧,会在场中心来回移动。 

 

4.7 速度场

需要添加一个SKTexture纹理,由纹理确定每个场位置点的力方向。

可以实现的效果就是比如弄了一条河的速度场,那么一个物体放在河中就能沿着河流移动

 

4.8 电场Electric Field 和 磁场 Magnetic Field

就是洛伦茨力F=q(E * VB) ,其中qE是电场力,qVB是磁场力

为了实现电场和磁场的模拟,Sprite Kit的PhysicsBody中添加了Charge也就是带电量。

但目前就我个人实验,在Swift下并没能实现电磁场的模拟,等待Apple的完善吧。

 

5 小结

Physics Field是个很酷的特性,值得掌握使用,非常方便!

CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!

请搜索微信号“CocoaChina”关注我们!

搜索CocoaChina微信公众号:CocoaChina

顶部