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

下面我们再看看具体的程序代码,首先看一下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. Linux - CentOS 6.3 (x86_64)安装过程详细图解

    I:下载CentOS 6.3 楼主已经从CentOS官方公布下载列表当中整理出了2个在国内的下载地址,这样就不需要为访问墙外的龟速网络而费心了. 32位:下载地址1,下载地址2 64位:下载地址1,下 ...

  2. 无线路由器的“克隆MAC地址”是干什么作用的?

    本文章转载:http://blog.sina.com.cn/s/blog_4c900d100102uysb.html 1.问题: 无线路由器的“克隆MAC地址”是干什么作用的?怎样使用? 2.使用背景 ...

  3. xcode7.3 iTunes Store operation failed问题

    升级了7.3,真心的不好用啊,bug一堆,写个代码,引入的类根本找不到,必须要command+b 重新编译一遍,现在连提交appstore都有问题. 果断用了 Application Loader上传 ...

  4. 方法javaJVM学习笔记-内存处理

    本文是一篇关于方法java的帖子 大多数JVM将内存区域分离为Method Area(Non-Heap),Heap,Program Counter Register,Java Method Statc ...

  5. POJ 3522 Slim Span 最小差值生成树

    Slim Span Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3522 Description Gi ...

  6. [Jest] Test JavaScript with Jest

    Let's learn how to unit test your JavaScript with Jest, a JavaScript unit testing framework from Fac ...

  7. ABAP EXCEL 文件上传下载 用SMW0

    T-CODE: SMW0 在这里只介绍二进制数据,HTML模板的上传也一样. 另外也可以用CBO TABLE管理文件 可以看我另一个博文:CBO TABLE管理文件上传下载 选择 二进制 写包名: 进 ...

  8. Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 其他数据类型(二)

    1.方法 定义如下所示: def string_message(str='') if str.empty? "It's an empty string!" else "T ...

  9. SQL Server 2012 Express LocalDB

    微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio ...

  10. Getting started with Apache Camel--转载

    原文地址:http://www.javacodegeeks.com/2012/12/getting-started-with-apache-camel.html About Camel: Apache ...