下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计。该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置。

下面我们再看看具体的程序代码,首先看一下HelloWorldScene.h文件,它的代码如下:

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3. #include "cocos2d.h"
  4. #define kBall_Tag                 100                                                                                                          ①
  5. #define SPEED                      30.0                                                                                                        ②
  6. class HelloWorld : public cocos2d::Layer
  7. {
  8. public:
  9. static cocos2d::Scene* createScene();
  10. virtual bool init();
  11. virtual void onEnter();
  12. virtual void onExit();
  13. virtual voidonAcceleration(cocos2d::Acceleration* acc, cocos2d::Event *unused_event);         ③
  14. CREATE_FUNC(HelloWorld);
  15. };
  16. #endif // __HELLOWORLD_SCENE_H__

上述代码第①行定义宏kBall_Tag,它是小球精灵的标签Tag数值。第②行定义宏SPEED,它表示小球运动的速度。第③行代码声明了onAcceleration函数,。

HelloWorldScene.cpp文件,它的主要代码如下:

  1. bool HelloWorld::init()
  2. {
  3. if( !Layer::init() )
  4. {
  5. returnfalse;
  6. }
  7. SizevisibleSize = Director::getInstance()->getVisibleSize();
  8. Pointorigin = Director::getInstance()->getVisibleOrigin();
  9. //贴图的纹理图片宽高必须是2的n次幂,128x128
  10. autobg = Sprite::create("BackgroundTile.png",
  11. Rect(0,0, visibleSize.width, visibleSize.height));
  12. //贴图的纹理参数,水平重复平铺,垂直重复平铺
  13. Texture2D::TexParamstp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
  14. bg->getTexture()->setTexParameters(tp);
  15. bg->setPosition(origin+ Point(visibleSize.width/2, visibleSize.height/2));
  16. addChild(bg,0);
  17. autoball = Sprite::create("Ball.png");
  18. ball->setPosition(origin+Point(visibleSize.width/2,visibleSize.height/2));
  19. addChild(ball,10, kBall_Tag);
  20. returntrue;
  21. }
  22. void HelloWorld::onEnter()
  23. {
  24. Layer::onEnter();
  25. log("HelloWorldonEnter");
  26. setAccelerometerEnabled(true);                                                                                                      ①
  27. }
  28. void HelloWorld::onAcceleration(Acceleration*acc, Event *unused_event)
  29. {
  30. log("{x = %f, y = %f}", acc->x,acc->y);
  31. Size visibleSize = Director::getInstance()->getVisibleSize();
  32. Sprite* ball = (Sprite*)this->getChildByTag(kBall_Tag);                                                  ②
  33. Size s = ball->getContentSize();                                                                                                    ③
  34. Point p0 = ball->getPosition();                                                                                                      ④
  35. float p1x =  p0.x + acc->x *SPEED ;                                                                                  ⑤
  36. if ((p1x - s.width/2) <0) {                                                                                                       ⑥
  37. p1x = s.width/2;                                                                                                               ⑦
  38. }
  39. if ((p1x + s.width / 2) > visibleSize.width) {                                                                                   ⑧
  40. p1x = visibleSize.width - s.width / 2;                                                                             ⑨
  41. }
  42. float p1y =  p0.y + acc->y *SPEED ;
  43. p1y = p1y < 0 ? -p1y : p1y;
  44. if ((p1y - s.height/2) < 0) {
  45. p1y = s.height/2;
  46. }
  47. if ((p1y + s.height/2) > visibleSize.height) {
  48. p1y = visibleSize.height - s.height/2;
  49. }
  50. ball->runAction(Place::create(Point( p1x, p1y)));                                                                       ⑩
  51. }
  52. void HelloWorld::onExit()
  53. {
  54. Layer::onExit();
  55. log("HelloWorldonExit");
  56. }

上述代码①行开启加速计设备,这个代码是在HelloWorld::onEnter()函数中,意味着在进入层的时候就开启加速度计设备。

在第②行代码是通过标签属性获得小球精灵对象。第③行代码ball->getContentSize()获得小球尺寸大小。第④行代码ball->getPosition()是获得小球的位置。第⑤行代码是p0.x + acc->x * SPEED是获得小球的x轴方向移动的位置,但是需要考虑左右超出屏幕的情况,第⑥行代码是 (p1x - s.width/2) <0是判断超出左边屏幕,这种情况下我们需要通过第⑦行代码p1x = s.width/2重新设置它的x轴坐标。第⑧行代码(p1x+ s.width / 2) > visibleSize.width是判断超出右边屏幕,这种情况下我们需要通过第⑨行代码p1x = visibleSize.width - s.width / 2重新设置它的x轴坐标。类似的判断y轴也需要,代码就不再解释了。

重新获得小球的坐标位置后,通过第⑩行代码ball->runAction(Place::create(Point( p1x, p1y)))是执行一个动作使小球移动到新的位置。

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:257760386、327403678

Cocos2d-x加速度计实例:运动的小球的更多相关文章

  1. JavaScript实例:运动的小球

    本篇博文通过制作一个小球运动动画的实例,来学习在HTML5的画布上实现动画制作的方法,同时理解面向对象程序设计的基本思想. 1.绘制小球 先在HTML页面中设置一个画布. <canvas id= ...

  2. 自定义View,随着手指运动的小球

    这个实例是自定的view的初步介绍,要设计的是一个随着手指运动的小球.原理是随时获取手指的坐标,然后在这个坐标上面实时改变自定义view的坐标.这个view仅仅是画了一个圆形而已. 自定义的view ...

  3. Cocos2d入门--3--小球运动

    本章直接上源代码.内容不难,主要就是 HelloWorldScene.h文件: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H_ ...

  4. JavaScript动画实例:动感小球

    已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ)     (0≤θ≤2π) 将0~2π区间等分48段,即设定间隔dig的值为π/24.θ初始值从0开始,按曲线方程求得坐标值(x,y), ...

  5. canvas制作运动的小球

    <!DOCTYPE html> <head> <title>canvas</title> <style> .canvas{ border: ...

  6. Windows Store App JavaScript 开发:小球运动示例

    通过前面内容的学习,相信读者已经对开发基于JavaScript的Windows应用商店应用有了一定的了解,本小节通过一个小球运动的示例来介绍如何新建一个JavaScript的Windows应用商店项目 ...

  7. Win10系列:JavaScript小球运动示例

    通过前面内容的学习,相信读者已经对开发基于JavaScript的Windows应用商店应用有了一定的了解,本小节通过一个小球运动的示例来介绍如何新建一个JavaScript的Windows应用商店项目 ...

  8. JavaScript动画实例:炸开的小球

    1.炸开的小球 定义一个小球对象类Ball,它有6个属性:圆心坐标(x,y).小球半径radius.填充颜色color.圆心坐标水平方向的变化量speedX.圆心坐标垂直方向的变化量speedY. B ...

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

    在很多移动设备的游戏使用到了加速度计,Cocos2d-JS引擎提供了访问加速度计传感器的能力.本节我们首先介绍一下加速度计传感器,然后再介绍如何在Cocos2d-JS中访问加速度计.加速度计加速度计是 ...

随机推荐

  1. IOS6 字体高亮显示

    ios6之前在一个字符串中如果也让某个字体高亮或者特殊显示(如: 关注[ ]),需要用单独一个的标签进行显示,或者利用CoreText进行字体绘绘制,非常麻烦: 现在IOS6 中TextView,la ...

  2. SRV记录说明

      SRV记录是DNS服务器的数据库中支持的一种资源记录的类型,它记录了哪台计算机提供了哪个服务这么一个简单的信息 SRV 记录:一般是为Microsoft的活动目录设置时的应用.DNS可以独立于活动 ...

  3. uistepper on ios versions prior to 5.0

    xcode5 打开运行就出现这个错误 uistepper on ios versions prior to 5.0 直接在General -->Deployment Info -->Dep ...

  4. Asp.net MVC @Html.DisplayNameFor中文乱码解决办法

    这是utf8的问题,vs2015默设要用utf8编码,以前的gb2312皆会产生乱码 这问题还是会继续发生,因为常会复制旧程序档进新方案.它会出现很奇怪的错误,而不是这么明显的乱码,你怎么抓bug都抓 ...

  5. C# Tcp协议收发数据

    运行这个程序前需要先关闭Windows防火墙,Win7系统关闭防火墙的方法是在控制面板的“控制面板\系统和安全\Windows 防火墙\自定义设置”路径中,将“家庭或工作(专用)网络位置设置”和“公用 ...

  6. Metadata Lock原理2

    同事说开发机更改一个表结构,加字段,但是一直挂在那里,没反应.一开始以为表测试数据量很大,因为mysql增加表字段会重写表,后来看了下数据量很小,就另外查看过程.原因分析和处理如下:  一.环境  m ...

  7. MySQL Router 测试使用 转

    MySQL Router 测试使用 . 特性 MySQL Router 并没有包括一些特别新的特性, 总体上看中规中矩, 不过 first-available 和插件两个特性挺有意思, 后续会进行讲解 ...

  8. Oralce_语法

    Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...

  9. ethtool 在 Linux 中的实现框架和应用

    转载:http://www.ibm.com/developerworks/cn/linux/1304_wangjy_ethtools/index.html?ca=dat- 王 俊元, 软件工程师, I ...

  10. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...