ios-cocos2d游戏开发基础-加速计-开发笔记(七)
这里将要介绍加速计的使用,如果你对此还不是很了解,可以看本站的一些相关文章进行初步的了解和学习,我想这样对你学习使用加速计会很有帮助。
首先需要说明的是:必须在接收加速计输入的层添加加速计方法。
在使用加速计之前必须开启重力感应计,方法为:- 01. self.isAccelerometerEnabled = YES; //设置layer是否支持重力计感应,打开重力感应支持,会得到 accelerometer:didAccelerate:得回调
- 复制代码
复制代码 开启此方法以后设备才会对重力进行检测,并调用accelerometer:didAccelerate:方法。
下面例举了例子:- 01.- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
-
- 02.{
-
- 03. CGPoint sPoint = _player.position; //获取精灵所在位置
-
- 04. sPoint.x += acceleration.x*10; //设置坐标变化速度
-
- 05. _player.position =sPoint; //对精灵的位置进行更新
-
- 06.}
- 复制代码
复制代码 PS:使用加速计在模拟器上是看不出效果的,需要使用真机测试。_player.position.x实际上调用的是位置的获取方法(getter method):[_player position]。这个方法会获取当前主角精灵的临时位置信息,上述一行代码实际 上是在尝试着改变这个临时CGPoint中成员变量x的值。不过这个临时的CGPoint 是要被丢弃的。在这种情况下,精灵位置的设置方法(setter method): [_player setPosition]根本不会被调用。你必须直接赋值给_player.position这 个属性,这里使用的值是一个新的CGPoint。在使用Objective-C的时候,你必 须习惯于这个规则,而唯一的办法是改变你从Java,C++或C#里带来的编程习惯。上面只是一个简单的说明,下面看下进一步的功能:
在进行这个例子前需要添加“预定信息”,关于“预定信息”的内容可以看上一篇文章的介绍。
首先在本类的初始化方法init里添加:
- 01.[self scheduleUpdate]; //预定信息
- 复制代码
复制代码 然后添加如下方法:- 01.- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
-
- 02.{
-
- 03.
- 04. float deceleration = 0.4f;//控制减速的速率(值越低=可以更快的改变方向)
-
- 05. float sensitivity = 6.0f;//加速计敏感度的值越大,主角精灵对加速计的输入就越敏感
-
- 06. float maxVelocity = 100; //最大速度值
-
- 07.
- 08. // 基于当前加速计的加速度调整速度
-
- 09. _playerVelocity.x = _playerVelocity.x*deceleration+acceleration.x*sensitivity;
-
- 10.
- 11. // 我们必须在两个方向上都限制主角精灵的最大速度值
-
- 12. if(_playerVelocity.x > maxVelocity){
-
- 13.
- 14. _playerVelocity.x = maxVelocity;
-
- 15.
- 16. }else if(_playerVelocity.x < -maxVelocity){
-
- 17.
- 18. _playerVelocity.x = -maxVelocity;
-
- 19.
- 20. }
-
- 21.}
-
- 22.
- 23.- (void)update:(ccTime)delta
-
- 24.{
-
- 25.
- 26. CGPoint pos = _player.position;
-
- 27. pos.x += _playerVelocity.x;
-
- 28. CGSize size = [[CCDirector sharedDirector] winSize];
-
- 29. float imageWidthHalved = [_player texture].contentSizeInPixels.width*0.5;
-
- 30. float leftBorderLimit = imageWidthHalved;
-
- 31. float rightBorderLimit = size.width - imageWidthHalved;
-
- 32.
- 33. // 如果主角精灵移动到了屏幕以外的话,它应该被停止
-
- 34. if(pos.x<leftBorderLimit){
-
- 35.
- 36. pos.x = leftBorderLimit;
-
- 37. _playerVelocity = CGPointZero;
-
- 38.
- 39. }else if(pos.x>rightBorderLimit){
-
- 40.
- 41. pos.x = rightBorderLimit;
-
- 42. _playerVelocity = CGPointZero;
-
- 43.
- 44.
- 45. }
-
- 46. _player.position = pos; //位置更新
-
- 47.
- 48.}
- 复制代码
复制代码 边界测试可以防止主角精灵离开屏幕。我们需要将精灵贴图的contentSize考虑 进来,因为精灵的位置在精灵贴图的中央,但是我们不想让贴图的任何一边移 动到屏幕外面。所以我们计算得到了imageWidthHalved值,并用它来检查当前 的精灵位置是不是落在左右边界里面。上述代码可能有些啰嗦,但是这样比以 前更容易理解。这就是所有与加速计处理逻辑相关的代码。
注:在计算imageWidthHalved时,我们将contentSize乘以0.5,而不是用它除以2。这是一个有意的选择,因为除法可以用乘法来代替以得到同样的计算结果。因为上述更新方法在每一帧都会被调用,所以所有代码必须在每一帧的时间里以最快的速度运行。因为iOS设备使用的ARM CPU不支持直接在硬件上做除法,乘法一般会快一些。虽然在我们的例子里效果并不明显,但是养成这个习惯对我们很有好处。
|