在很多移动设备的游戏使用到了加速度计,Cocos2d-JS引擎提供了访问加速度计传感器的能力。本节我们首先介绍一下加速度计传感器,然后再介绍如何在Cocos2d-JS中访问加速度计。
加速度计
加速度计是一种能够感应设备一个方向上线性加速度的传感器。广泛用于航空、航海、宇航及武器的制导与控制中。线加速度计的种类很多,在iOS等移动设备中目前采用的是三轴加速度计,可以感应设备上X、Y、Z轴方向上线性加速度的变化。如下图所示,iOS和Android等设备三轴加速度计的坐标系是右手坐标系,即:设备竖直向上,正面朝向用户,水平向右为X轴正方向,竖直向上为Y轴正方向,Z轴正方向是从设备指向用户方向。



android 计算手势加速度_2d

 iOS上三轴加速度计


提示 有人将加速度计称之为“重力加速度计”,这种观点有错误的。作用于三个轴上的加速度是指所有加速度的总和,包括了由重力产生的加速度和用户移动设备产生的加速度。在设备静止的情况下,这时候的加速度就只是重力加速度。
实例:运动的小球
下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计。该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置。

android 计算手势加速度_2d_02

访问加速度计实例


下面我们再看看具体的程序代码,首先看一下app.js文件,它的主要代码如下: 

[html] view plaincopy

 

1. var HelloWorldLayer = cc.Layer.extend({  
2.    
3.     ctor:function () {  
4.         this._super();  
5.         cc.log("HelloWorld init");  
6. size = cc.director.getWinSize();  
7.           
8. bg = new cc.Sprite(res.Background_png);  
9. bg.x = size.width/2;  
10. bg.y = size.height/2;  
11.         this.addChild(bg, 0, 0);  
12.       
13. ball = new cc.Sprite(res.Ball_png);  
14. ball.x = size.width/2;  
15. ball.y = size.height/2;  
16.         this.addChild(ball, 10, SpriteTags.kBall_Tag);  
17.           
18.         return true;  
19.     },  
20.     onEnter: function () {  
21.             this._super();  
22.             cc.log("HelloWorld onEnter");  
23. ball = this.getChildByTag(SpriteTags.kBall_Tag);  
24.   
25.   
26.             cc.inputManager.setAccelerometerEnabled(true);                          ①  
27.           
28.             cc.eventManager.addListener({                                       ②  
29.                 event: cc.EventListener.ACCELERATION,                               ③  
30.                 callback: function(acc, event){                                     ④  
31. size = cc.director.getWinSize();                                ⑤  
32. s = ball.getContentSize();                                  ⑥  
33. p0 = ball.getPosition();  
34.   
35.   
36. p1x =  p0.x + acc.x * SPEED ;                               ⑦  
37. <0) {                                      ⑧  
38. p1x = s.width/2;                                            ⑨  
39.                     }  
40. > size.width) {                              ⑩  
41. p1x = size.width - s.width / 2;                                     ⑪  
42.                     }  
43.   
44.   
45. p1y =  p0.y + acc.y * SPEED ;   
46. < 0) {  
47. p1y = s.height/2;  
48.                     }  
49. > size.height) {  
50. p1y = size.height - s.height/2;  
51.                     }  
52.                     ball.runAction(cc.place(cc.p( p1x, p1y)));                      ⑫  
53.                 }  
54.             }, ball);  
55.     },  
56.     onExit: function () {  
57.             this._super();  
58.             cc.log("HelloWorld onExit");  
59.             cc.eventManager.removeListeners(cc.EventListener.ACCELERATION);         ⑬  
60.     }  
61. });

上述代码①行开启加速计设备。第②行代码cc.eventManager.addListener是通过快捷方式注册事件监听器对象。第③行代码是设置加速度事件cc.EventListener.ACCELERATION。第④行代码是设置加速度事件回调函数。第⑤行代码是获得屏幕的大小。第⑥行代码是获得小球的大小。
第⑦行代码是var p1x =  p0.x + acc.x * SPEED是获得小球的x轴方向移动的位置,但是需要考虑左右超出屏幕的情况,第⑧行代码是 (p1x - s.width/2) <0是判断超出左边屏幕,这种情况下我们需要通过第⑨行代码p1x = s.width/2重新设置它的x轴坐标。第⑩行代码(p1x + s.width / 2) > size.width是判断超出右边屏幕,这种情况下我们需要通过第⑪行代码p1x = size.width - s.width / 2重新设置它的x轴坐标。类似的判断y轴也需要,代码就不再解释了。
回调函数中的参数acc,它是cc.Acceleration类的实例,cc.Acceleration是加速度计信息的封装类,它有4个属性:
x。属性是获得x轴方向上的加速度。单位为g,1g = 9.81 m s−2。
y。属性是获得y轴方向上的加速度。
z。属性是获得z轴方向上的加速度。
timestamp。时间戳属性,用来表示事件发生的相对时间。 
重新获得小球的坐标位置后,通过第⑫行代码ball.runAction(cc.place(cc.p( p1x, p1y)))是执行一个动作使小球移动到新的位置。

上述onExit()函数是退出层时候回调,我们在代码第⑬行注销所有加速度事件的监听。