Cocos2d-JS加速度计与加速度事件
2015-07-14 16:17
477 查看
在很多移动设备的游戏使用到了加速度计,Cocos2d-JS引擎提供了访问加速度计传感器的能力。本节我们首先介绍一下加速度计传感器,然后再介绍如何在Cocos2d-JS中访问加速度计。
加速度计
加速度计是一种能够感应设备一个方向上线性加速度的传感器。广泛用于航空、航海、宇航及武器的制导与控制中。线加速度计的种类很多,在iOS等移动设备中目前采用的是三轴加速度计,可以感应设备上X、Y、Z轴方向上线性加速度的变化。如下图所示,iOS和Android等设备三轴加速度计的坐标系是右手坐标系,即:设备竖直向上,正面朝向用户,水平向右为X轴正方向,竖直向上为Y轴正方向,Z轴正方向是从设备指向用户方向。
iOS上三轴加速度计
提示 有人将加速度计称之为“重力加速度计”,这种观点有错误的。作用于三个轴上的加速度是指所有加速度的总和,包括了由重力产生的加速度和用户移动设备产生的加速度。在设备静止的情况下,这时候的加速度就只是重力加速度。
实例:运动的小球
下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计。该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置。
访问加速度计实例
下面我们再看看具体的程序代码,首先看一下app.js文件,它的主要代码如下:
[html] view
plaincopy
var HelloWorldLayer = cc.Layer.extend({
ctor:function () {
this._super();
cc.log("HelloWorld init");
var size = cc.director.getWinSize();
var bg = new cc.Sprite(res.Background_png);
bg.x = size.width/2;
bg.y = size.height/2;
this.addChild(bg, 0, 0);
var ball = new cc.Sprite(res.Ball_png);
ball.x = size.width/2;
ball.y = size.height/2;
this.addChild(ball, 10, SpriteTags.kBall_Tag);
return true;
},
onEnter: function () {
this._super();
cc.log("HelloWorld onEnter");
var ball = this.getChildByTag(SpriteTags.kBall_Tag);
cc.inputManager.setAccelerometerEnabled(true); ①
cc.eventManager.addListener({ ②
event: cc.EventListener.ACCELERATION, ③
callback: function(acc, event){ ④
var size = cc.director.getWinSize(); ⑤
var s = ball.getContentSize(); ⑥
var p0 = ball.getPosition();
var p1x = p0.x + acc.x * SPEED ; ⑦
if ((p1x - s.width/2) <0) { ⑧
p1x = s.width/2; ⑨
}
if ((p1x + s.width / 2) > size.width) { ⑩
p1x = size.width - s.width / 2; ⑪
}
var p1y = p0.y + acc.y * SPEED ;
if ((p1y - s.height/2) < 0) {
p1y = s.height/2;
}
if ((p1y + s.height/2) > size.height) {
p1y = size.height - s.height/2;
}
ball.runAction(cc.place(cc.p( p1x, p1y))); ⑫
}
}, ball);
},
onExit: function () {
this._super();
cc.log("HelloWorld onExit");
cc.eventManager.removeListeners(cc.EventListener.ACCELERATION); ⑬
}
});
上述代码①行开启加速计设备。第②行代码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()函数是退出层时候回调,我们在代码第⑬行注销所有加速度事件的监听。
源引:http://blog.csdn.net/tonny_guan/article/details/44851983
加速度计
加速度计是一种能够感应设备一个方向上线性加速度的传感器。广泛用于航空、航海、宇航及武器的制导与控制中。线加速度计的种类很多,在iOS等移动设备中目前采用的是三轴加速度计,可以感应设备上X、Y、Z轴方向上线性加速度的变化。如下图所示,iOS和Android等设备三轴加速度计的坐标系是右手坐标系,即:设备竖直向上,正面朝向用户,水平向右为X轴正方向,竖直向上为Y轴正方向,Z轴正方向是从设备指向用户方向。
iOS上三轴加速度计
提示 有人将加速度计称之为“重力加速度计”,这种观点有错误的。作用于三个轴上的加速度是指所有加速度的总和,包括了由重力产生的加速度和用户移动设备产生的加速度。在设备静止的情况下,这时候的加速度就只是重力加速度。
实例:运动的小球
下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计。该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置。
访问加速度计实例
下面我们再看看具体的程序代码,首先看一下app.js文件,它的主要代码如下:
[html] view
plaincopy
var HelloWorldLayer = cc.Layer.extend({
ctor:function () {
this._super();
cc.log("HelloWorld init");
var size = cc.director.getWinSize();
var bg = new cc.Sprite(res.Background_png);
bg.x = size.width/2;
bg.y = size.height/2;
this.addChild(bg, 0, 0);
var ball = new cc.Sprite(res.Ball_png);
ball.x = size.width/2;
ball.y = size.height/2;
this.addChild(ball, 10, SpriteTags.kBall_Tag);
return true;
},
onEnter: function () {
this._super();
cc.log("HelloWorld onEnter");
var ball = this.getChildByTag(SpriteTags.kBall_Tag);
cc.inputManager.setAccelerometerEnabled(true); ①
cc.eventManager.addListener({ ②
event: cc.EventListener.ACCELERATION, ③
callback: function(acc, event){ ④
var size = cc.director.getWinSize(); ⑤
var s = ball.getContentSize(); ⑥
var p0 = ball.getPosition();
var p1x = p0.x + acc.x * SPEED ; ⑦
if ((p1x - s.width/2) <0) { ⑧
p1x = s.width/2; ⑨
}
if ((p1x + s.width / 2) > size.width) { ⑩
p1x = size.width - s.width / 2; ⑪
}
var p1y = p0.y + acc.y * SPEED ;
if ((p1y - s.height/2) < 0) {
p1y = s.height/2;
}
if ((p1y + s.height/2) > size.height) {
p1y = size.height - s.height/2;
}
ball.runAction(cc.place(cc.p( p1x, p1y))); ⑫
}
}, ball);
},
onExit: function () {
this._super();
cc.log("HelloWorld onExit");
cc.eventManager.removeListeners(cc.EventListener.ACCELERATION); ⑬
}
});
上述代码①行开启加速计设备。第②行代码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()函数是退出层时候回调,我们在代码第⑬行注销所有加速度事件的监听。
源引:http://blog.csdn.net/tonny_guan/article/details/44851983
相关文章推荐
- 我的第一个Cocos2D-x 程序
- cocos2dx 单点触摸的简单使用
- Cocos2D-x 入门(1)
- 分析Cocos2d-x横版ACT手游源 1、登录
- Quick-Cocos2d-x 3.3绑定自定义类至Lua(四)使用绑定C++至Lua的自定义类
- Quick-Cocos2d-x 3.3绑定自定义类至Lua(三)动手绑定自定义类至Lua
- Quick-Cocos2d-x 3.3绑定自定义类至Lua(二)新建项目中配制环境
- Quick-Cocos2d-x 3.3绑定自定义类至Lua(一)环境搭建
- 【cocos2d-x 028】 AssetsManager热更失败 "there is not new version"
- cocos2dx在iOS上使用opencv遇到的问题
- 解决cocos2dx中直接输入中文乱码的问题
- cocos2dx 3.x 物理引擎接触检测掩码、碰撞掩码和类别掩码问题解析
- cocos2d-js v3.5 使用cocos studio V2.3.0.1创建的资源并添加鼠标消息
- Cocos2dx常用宏必须知道
- cocos2d-x 3.2 win7环境配置(一)
- 大海教你学手游2015CocosLua第一季_02场景跳转和用户触摸
- cocos2d-x-Tiled 地图坐标 转换
- cocos2d-x 创建项目过程 -----1
- 【cocos2d-x 报错异常集】中断!0xC0000005: 读取位置 0x000001E8 时发生访问冲突。
- cocos2d.x单点触摸事件