Cocos2d-JS加速度计与加速度事件
在很多移动设备的游戏使用到了加速度计,Cocos2d-JS引擎提供了访问加速度计传感器的能力。本节我们首先介绍一下加速度计传感器,然后再介绍如何在Cocos2d-JS中访问加速度计。
加速度计
加速度计是一种能够感应设备一个方向上线性加速度的传感器。广泛用于航空、航海、宇航及武器的制导与控制中。线加速度计的种类很多,在iOS等移动设备中目前采用的是三轴加速度计,可以感应设备上X、Y、Z轴方向上线性加速度的变化。如下图所示,iOS和Android等设备三轴加速度计的坐标系是右手坐标系,即:设备竖直向上,正面朝向用户,水平向右为X轴正方向,竖直向上为Y轴正方向,Z轴正方向是从设备指向用户方向。
提示 有人将加速度计称之为“重力加速度计”,这种观点有错误的。作用于三个轴上的加速度是指所有加速度的总和,包括了由重力产生的加速度和用户移动设备产生的加速度。在设备静止的情况下,这时候的加速度就只是重力加速度。
实例:运动的小球
下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计。该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置。
下面我们再看看具体的程序代码,首先看一下app.js文件,它的主要代码如下:
- 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://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
《Cocos2d-x实战 JS卷》现已上线,各大商店均已开售:
京东:http://item.jd.com/11659698.html
欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息
Cocos2d-JS加速度计与加速度事件的更多相关文章
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...
- js之DOM和事件
DOM 查找 直接查找 var obj = document.getElementById('i1') 间接查找 文件内容操作: innerText 仅文本 innerHTML 全内容 value i ...
- js中获取键盘事件【转】
<script type="text/javascript" language=JavaScript charset="UTF-8"> 2 docu ...
- js onkeypress与onkeydown 事件区别详细说明
keypress只适用于有字符输入的按键 而keyup/keydown包含了Ctrl, Shift之类的情况 Firefox在处理onKeyDown/onKeyPress事件时存在漏洞,恶意网页可能利 ...
- js获取select改变事件
js获取select改变事件onchage前的值 和 onclick事件 <select id="wupin_id" name="wupin_id" on ...
- JS里的onclick事件
可以通过以下代码了解JS里的onclick事件: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&quo ...
- js 触发select onchange事件
select 或text的onchange事件需要手动(通过键盘输入)改变select或text的值才能触发,本文为大家介绍下使用js触发select onchange事件select 或text的o ...
- 原 JS监听回车事件
原 JS监听回车事件 发表于2年前(2014-06-04 10:16) 阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦 ...
随机推荐
- Codeforces Gym 100015B Ball Painting 找规律
Ball Painting 题目连接: http://codeforces.com/gym/100015/attachments Description There are 2N white ball ...
- Qt Quick实现的涂鸦程序
之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...
- 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List<类名>的比较
1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...
- asp.net解决:当前上下文中不存在名称“Session”
第一种方法:将使用session的类页面继承 System.Web.UI.Page类,方法:public class AddUser : System.Web.UI.Page 第二种方法:在page里 ...
- ssl/https双向验证的配置
1.SSL认证 不需要特别配置,相关证书库生成看https认证中的相关部分 2.HTTPS认证 一.基本概念 1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源 2.双向认证,如果客户端 ...
- MyBatis中主要类的生命周期和应用范围
转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420026 MyBatis中常用的类就要数SqlSessionFactoryBuilder.SqlSe ...
- Java再学习——线程之创建
Java创建线程有两种方法,一种是继承Thread,另一种实现Runnable或Callable接口. 一,继承Thread public class APP { public static void ...
- HTML5图片拖拽预览原理及实现
一.前言 这两天恰好有一位同事问我怎样做一个图片预览功能.作为现代人的我们首先想到的当然是HTML5啦,其实HTML5做图片预览已经是一个老生常谈的问题了.我在这里就简单说说其中相关的一些东西,当然会 ...
- 解决Intellij IDEA 通过archetype创建Maven项目缓慢的问题
1.由于默认情况下,根据archetype创建maven项目会从网络下载catalog文件,导致创建maven项目缓慢 Searching for remote catalog: http://rep ...
- Linux分区有损坏修复
如果Linux分区有损坏情况,启动有问题,不能正常进入文本或图形界面.那么一般会出现提示,需要输入Root密码登录后采用fsck -t ext3 -r /usr/local 修复 , /usr/loc ...