`

Cocos2d-JS加速度计与加速度事件

阅读更多

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





 iOS上三轴加速度计



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

访问加速度计实例



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

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. var HelloWorldLayer = cc.Layer.extend({  
  2.    
  3.     ctor:function () {  
  4.         this._super();  
  5.         cc.log("HelloWorld init");  
  6.         var size = cc.director.getWinSize();  
  7.           
  8.         var 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.         var 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.             var 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.                     var size = cc.director.getWinSize();                                ⑤  
  32.                     var s = ball.getContentSize();                                  ⑥  
  33.                     var p0 = ball.getPosition();  
  34.   
  35.   
  36.                     var p1x =  p0.x + acc.x * SPEED ;                               ⑦  
  37.                     if ((p1x - s.width/2) <0) {                                      ⑧  
  38.                         p1x = s.width/2;                                            ⑨  
  39.                     }  
  40.                     if ((p1x + s.width / 2) > size.width) {                              ⑩  
  41.                         p1x = size.width - s.width / 2;                                     ⑪  
  42.                     }  
  43.   
  44.   
  45.                     var p1y =  p0.y + acc.y * SPEED ;   
  46.                     if ((p1y - s.height/2) < 0) {  
  47.                         p1y = s.height/2;  
  48.                     }  
  49.                     if ((p1y + s.height/2) > 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()函数是退出层时候回调,我们在代码第⑬行注销所有加速度事件的监听。

 

更多内容请关注最新Cocos图书《Cocos2d-x实战:JS卷——Cocos2d-JS开发

本书交流讨论网站:http://www.cocoagame.net

欢迎加入Cocos2d-x技术讨论群:257760386

更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com

 

 

 

 

 

《Cocos2d-x实战 JS卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11659698.html

欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息

分享到:
评论

相关推荐

    cocos2d-js物理引擎Demo

    开发者可以通过调整刚体的质量、惯性和摩擦系数等属性,影响刚体下落的行为,如速度、加速度以及与地面接触后的滑动情况。 4. **碰撞检测与处理**:在物理引擎中,碰撞是动态行为的重要部分。Chipmunk通过碰撞回调...

    《Box2dDemo》(Cocos2d-js)

    Cocos2d-js集成了C++和JavaScript的特性,允许开发者用JavaScript编写游戏,同时利用C++的性能优势。在这个案例中,Cocos2d-js提供了图形渲染、事件处理和动画控制等功能,使得开发者能够轻松构建游戏场景。 Box2d...

    Cocos2d-x 游戏资源(图片、XML、TXT等)打包加密 之 解密读取

    在游戏开发领域,资源管理是至关重要的,尤其是在移动端游戏如使用Cocos2d-x框架时。Cocos2d-x是一个跨平台的2D游戏引擎,支持多种操作系统,包括iOS、Android以及Windows等。为了保护游戏资源不被轻易篡改或盗用,...

    cocos2d-x 3.x游戏开发实战光盘

    1. **性能优化**:cocos2d-x 3.x对渲染引擎进行了大量优化,提升了游戏运行速度和帧率,同时降低了内存消耗,使游戏运行更加流畅。 2. **新API设计**:采用更加现代化的C++11标准,提供了更简洁、面向对象的API,让...

    Cocos2D-X开发学习笔记-加速度传感器事件的使用示例

    本篇笔记将聚焦于Cocos2D-X中的加速度传感器事件的使用,这对于开发涉及物理运动或者需要响应设备动态变化的游戏至关重要。 在移动设备上,加速度传感器能够检测到设备在三个轴(X、Y、Z)上的线性加速度,这对于...

    cocos2d-x 加密

    在游戏开发领域,Cocos2d-x是一款广泛使用的2D游戏引擎,支持多平台开发,如iOS、Android、Windows等。对于游戏中的敏感数据,如用户信息、游戏成就、购买记录等,通常需要进行加密处理以确保数据的安全性。本文将...

    cocos2d-x抽屉

    例如,`MoveBy`动作可以将节点移动到指定的位置,`EaseIn`和`EaseOut`可以改变动作的速度曲线,使得动画具有加速度或减速度效果,而`Sequence`和`Spawn`动作则可以组合多个动作一起执行。 在这个"TouchMenu"中,...

    Cocos2d-x 萝莉快跑

    在iOS平台的开发中,Cocos2d-x提供了与Objective-C和Swift的接口,使得游戏能无缝集成到Apple的生态系统中,利用iOS设备的特性,如多点触控、陀螺仪和加速度计。同时,Cocos2d-x的内存管理和性能优化工具也有助于...

    精选_基于Cocos2d-x实现的RunOrDie小游戏_源码打包

    Cocos2d-x是一款开源的游戏开发框架,它采用C++作为主要编程语言,同时支持Lua和JavaScript等脚本语言,使得开发者能够快速构建高性能的2D游戏。本文将深入探讨如何使用Cocos2d-x来实现"RunOrDie"这一款小游戏,旨在...

    Cocos2d-xtestCpp Accelerometer(重力感应)demo

    `AcceleratorEvent`是与加速度相关的事件类型,包含x、y、z轴的加速度值。 3. **testCpp项目**: `testCpp`是Cocos2d-x官方提供的一个示例项目,包含了许多基础功能的演示,帮助开发者了解和学习Cocos2d-x的用法。...

    cocos2d-x游戏-转盘抽奖

    在cocos2d-x中,可以通过`cc.ActionInterval`类的子类如`cc.Speed`和`ccEase`系列动作来实现加速度变化的效果。例如,可以先用`cc.EaseIn`加速,然后切换到`cc.EaseOut`进行减速。 2. **降速停止**:当转盘达到一定...

    cocos2d-x API 2.12

    《cocos2d-x API 2.12详解与对比》 cocos2d-x是一款开源的游戏开发框架,广泛应用于2D游戏、演示程序和各种图形界面应用的开发。其API是开发者进行游戏编程的核心工具,随着版本的迭代,功能与性能也在不断优化。在...

    cocos2d-x 自学文档

    在cocos2d-x中,我们可以利用Ease系列的方法来实现物体的加速度或减速度效果。Ease动作不改变整个动作的总时长,它们只是改变了速度的曲线。Ease动作分为三类:In actions(加速开始)、Out actions(减速结束)和In...

    cocos2d-x实现单摆运动状态的展示

    在小角度摆动的情况下,单摆遵循简谐振动规律,其周期与摆长和重力加速度有关,不受初始摆角大小的影响。 3. **单摆周期求解**:根据物理学理论,单摆的周期T可以通过以下公式计算:T = 2π√(L/g),其中L是摆长,g...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    5. **同步物理世界与Cocos2d-x**:由于Box2D和Cocos2d-x的坐标系统可能不同,我们需要将Box2D的位置和旋转信息转换为Cocos2d-x的坐标,以便更新Cocos2d-x的精灵位置。 6. **处理碰撞**:当实体接触到地面或其他对象...

    cocos2d-x-3.5.zip

    《cocos2d-x 3.5:经典游戏开发框架的深度解析》 cocos2d-x 是一个广泛使用的开源游戏开发框架,以其强大的2D图形渲染能力、丰富的功能库和跨平台支持而受到开发者们的青睐。本次我们将深入探讨3.5版本,一个在游戏...

    cocos2d-x-3.17.2.zip

    3. **脚本语言支持**:cocos2d-x支持多种编程语言,包括C++、Lua和JavaScript。3.17.2版本可能继续强化了这些语言的支持,例如提供更好的语法糖和API,使得开发者能更方便地编写游戏逻辑。 4. **物理引擎集成**:...

    cocos2dx资源加密与压缩

    本文将详细讲解在Cocos2d-x环境中如何实现资源的加密与压缩,主要关注"zip的读取解压"和"xxtea对资源的加密"这两个关键知识点。 一、zip的读取解压 在Cocos2d-x中,为了节省存储空间和提高加载速度,开发者通常会...

    Cocos2D-X2.2.3学习笔记15(回调动作/动画/加速度)

    在Cocos2D-X2.2.3这个版本中,我们常常会遇到游戏开发中的核心概念,如回调动作、动画以及设备的加速度感应。这些是构建动态且交互性强的游戏的关键元素。以下是对这些概念的详细阐述: 1. **回调动作(Callback ...

    box2d融合Accelerometer加速度计

    这需要对Cocos2d-x的事件处理机制有一定的了解,尤其是如何监听和处理加速度事件。首先,你需要注册一个加速度监听器,这可以通过`CCEAccelerometer::setAccelerometerEnabled(true)`启用,然后定义一个回调函数来...

Global site tag (gtag.js) - Google Analytics