设为首页 加入收藏

TOP

iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计(一)
2019-09-03 02:41:13 】 浏览:49
Tags:iFIERO 宇宙 大战 Space Battle SpriteKit 无限 循环 背景 Endless 物理 碰撞 CoreMotion 加速

本节主要讲解如何创建无限循环Endless的星空背景(如下图)、玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌机(加速计须用真机测试)。

 
Space Battle

此《宇宙大战 Space Battle》教程共分为三系列,

(一)宇宙大战 Space Battle -- 初始建立工程及场景Scene、导入各个SpriteNode精灵、Particle粒子节点及建立背景音乐

(二)宇宙大战 Space Battle -- 宇宙大战 Space Battle -- 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计(你正在此处进行学习)

(三)宇宙大战 Space Battle -- 各个场景SCENE之间的切换、利用UserDefaults统计分数

我们先了解一下何为iOS加速计和陀螺仪

iOS系统提供了加速计和陀螺仪支持,如果iOS设备提供了这些硬件支持,iOS即可通过CoreMotion框架提供的加速计来获取设备当前的加速度数据、陀螺仪数据、所处的磁场以及设备的方位等信息;

对于iOS应用开发者来说,开发传感器应用十分简单,CoreMotion框架的核心API是CMMotionManager,开发者只要创建一个CMMotionManager对象,接下来即可采用定时器周期性地从CMMotionManager对象获取加速度数据、陀螺仪数据等。

一、iOS支持的加速计和陀螺仪

加速计可以测出设备的加速度和重力,内置的陀螺仪还可以获取设备的转动,这些数据都通过CMMotionManager对象来获取。而且采用完全类似的方式来获取设备的加速度数据、陀螺仪数据、磁场数据等。

1、iOS加速计和陀螺仪的理论基础

iOS加速计是一个三轴加速计,这意味着它可以检测三维空间中的运动和重力,因此加速计不仅可以获取用户握持手机的方向(向上还是向下),而且可以感知手机正面向下还是向上。

加速计可以测量设备在特定方向的加速度(使用重力g作为单位),当加速度返回值为1.0时,表明设备在特定方向上感知到1g。

iOS设备的加速计所使用的三轴坐标系统如下:

 
iOS设备的加速计所使用的三轴坐标系统

从上图上可以看出:iOS设备的加速计的三轴坐标系统的X、Y、Z轴定义如下:

  • 沿着手机屏幕顶部向上是Y轴正方向,向下是Y轴负方向;

  • 当手机顶部朝上时,沿着手机屏幕向右是X轴正方向,向左是X轴负方向;

  • 正对手机时,垂直屏幕向外是Z轴正方向,垂直屏幕向里是Z轴负方向;

当手机静止不动时,地球引力将会给予手机1g的加速度。典型的,当用户垂直握持手机切顶部向上时,手机即可检测到大约-1g的加速度:如果用户以45度角握持手机,则1g的加速度将会平均分配到X、Y两个轴上。如果检测到加速度的值远大于1g,即可判断该设备突然发成了运动,比如设备被摇动、坠落等,此时加速度即可在一个或多个轴上检测到较大值。

除了加速度数据之外,iOS还可以获取陀螺仪数据,陀螺仪数据则可表示设备围绕各坐标轴的转动。例如,把手机平放在桌面上,手机在各方向的加速度基本不会改变,此时手机将会检测到Z轴方向有大约-1g的加速度。如果此时对手机进行旋转,手机的加速度依然不会有明显的改变,但手机陀螺仪将会返回绕Z轴发生转动。如果用户垂直握持手机,并绕垂直轴转动,此时手机检测到的加速度值依然不会发生改变,但手机陀螺仪将会检测到绕Y轴发生的转动。

简单来说,陀螺仪数据用于检测设备绕X、Y、Z轴转动时的速度,转动越快,陀螺仪返回的数据越大。iOS还可以获取周围磁场在X、Y、Z轴的强度,磁场强度一微特斯拉为单位。

总结出来,iOS的CMMotionManager大致可获取3种数据:

  • 加速度数据:该数据通过CMAccelerometerData对象来表示。该对象只有一个CMAcceleration结构体类型的acceleration属性,该结构体属性值包含x、y、z三个字段,分别代表设备在X、Y、Z轴方向检测到的加速度值;

  • 陀螺仪数据:该数据通过CMGyroData对象来表示。该对象只有一个CMRotationRate结构体类型的rotationRate属性,该结构体属性值包含x、y、z三个字段,分别代表设备围绕X、Y、Z轴转动的速度;

  • 磁场数据:该数据通过CMMagnetometerData对象来表示。该对象只有一个CMMagneticField结构体类型的magneticField属性,该结构体属性值包含x、y、z三个字段,分别代表设备在X、Y、Z轴方向检测到的磁场强度,以微特斯拉为单位。

除此之外,CMAccelerometerData、CMGyroData、CMMagnetometerData有一个公共的弗雷:CMLogItem,该弗雷定义了timestamp属性,这意味着不管是加速度数据、陀螺仪数据、磁场数据,都可通过timestamp属性来访问程序得到的该数据的时间。

2、iOS应用程序获取加速度数据(本游戏只用到加速计)

 
玩家飞船倾斜设备来调用加速计躲闪外星敌机

为了移动玩家飞船,在这儿你将会用到iPhone的加速计。很遗憾,在similator模拟器上不能用加速计,所以你得在真机上做测试。

你通过倾斜设备来调用加速计。这就是我们在第一节课时,限制设备让它只能是Portait状态的原因(去掉勾选Upside Down)。如果你在倾斜的时候屏幕自动旋转了那还玩毛。

由于有Core Motion的存在,使用加速器变得非常简单,在update()方法,游戏帧数每次刷新的时候都被调用。

首先,添加下面的代码到GameScene.swift里:

import CoreMotion

接着,添加下面的属性:

let motionManager = CMMotionManager() // 加速度计管理器
var xAcceleration:CGFloat = 0 // 存放x左右移动的加速度变量
var yAcceleration:CGFloat = 0

你需要这些属性来追踪加速计的数据。你仅仅只需要追踪x和y轴的信息,z轴在这个游戏里用不到。

接着,添加下面的方法:

//MARK: -- 开启加速度计
func startMonitoringAcceleration(){
if motionManager.isAccelerometerAvailable {
updateAccleration() /// 获取加速度计 } }

//MARK: -- 停止Acceleration
func stopMonitoringAcceleration(){
if motionManager.isAccelerometerAvailable && motionManager.isAccelerometerActive {
motionManager.stopAccelerometerUpdates()
}
}

上述方法,让加速计在可以用的情况下开启和停止。

接着我们在didMove(to view: SKView)添加下面添加代码

startMonit
iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计(一) https://www.cppentry.com/bencandy.php?fid=89&id=246445

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇swift为什么不是do while? 下一篇Swift 在UIWindow 上添加并移除 v..