首页 > 代码库 > cocos2d-x V3.0 调用重力加速器 Acceleration
cocos2d-x V3.0 调用重力加速器 Acceleration
今天解决了一个问题心情很爽 哈哈;
今天解决的就是cocos2d-x 3.0 调用重力加速器的问题,网上搜了很多的资料 发现都是不行的,不能解决问题,不知道是不是我使用的是3.0 的版本问题,但是网上有些教程说的也是3.0 的版本啊,难道beta版和正式版也有那么大差别么?坑爹啊,
就说这个重写的方法吧:网上搜索的到好多都是重写父类的 didAccelerate(CCAcceleration* pAccelerationValue);方法,但是我用的3.0 根本就没有了这个方法,搜索的3.0 还是有说这个,蛋疼;
最后在看官方的testCpp例子的时候发现了现在调用重力加速器的方法;例子的位置:X:\你的cocos2d-x\tests\cpp-tests\Classes\AccelerometerTest
其中要重写的方法为:onAcceleration(Acceleration* acc, Event* event); TMD差别好大有么有啊;
cocos2d-x每个版本都有变化有么有啊,坑爹……
不过坑爹归坑爹,引擎还是不错的,只能说咱学的不好吧;
OK 废话太多了,开始说正事;
既然找到了正确的方法,那就好解决了,首先是在.h头文件中定义好方法
接着就是在cpp文件中去实现这个方法就OK了
可以看到其中有我注释掉的一部分代码,这是本来官方示例文件中的根据“屏幕坐标系”以及“OpenGL坐标系”互相转换的方法,将例子中精灵的坐标互相转换,然后进行设置精灵坐标
其实后来根据输出log测试,我发现cocos2d-x的默认的getPosition()获取的坐标是和OpenGL的坐标是一直的,所以最后我就注释掉了例子中的转化方式,直接根据坐标点来设置精灵位置,这样是和经过转化的一样的效果的;
下边我画了几张图来简单的说明一下OpenGL坐标系,屏幕UI坐标系(只是我自己认为,如果有不对的地方,望朋友们指正)
首先这个立方的 是我绘制的OpenGL的重力加速器的三维空间坐标系,旁边的蓝色表示一个手机平放时与坐标系的对应情况;根据图中箭头的方向,x、y、z三个坐标轴的值都是趋向于-1的;
下面这两个是平面的UI坐标系和GL坐标系
UI坐标系的坐标原点是在左上角,Y轴向下延伸,其中精灵A位置为(10,10)
GL坐标系的原点是在左下角,Y轴向上延伸,精灵B(相当于UI坐标戏中的精灵A)位置为(10, 1280)(屏幕分辨率为720*1280时)
这就是在官方Test例子中UI坐标系和GL坐标系为什么要进行转换
cocos2d-x中的默认坐标系是和OpenGL的坐标系是相同的,所以我直接根据getPosition()方式获取了精灵的位置,这样就少去了复杂的转换,不过既然官方进行转换可能有他们的意图吧,现在也不用深究了;
本博客内容与个人原创博客同步更新:Melove 我爱
OK继续垒码了
今天解决的就是cocos2d-x 3.0 调用重力加速器的问题,网上搜了很多的资料 发现都是不行的,不能解决问题,不知道是不是我使用的是3.0 的版本问题,但是网上有些教程说的也是3.0 的版本啊,难道beta版和正式版也有那么大差别么?坑爹啊,
就说这个重写的方法吧:网上搜索的到好多都是重写父类的 didAccelerate(CCAcceleration* pAccelerationValue);方法,但是我用的3.0 根本就没有了这个方法,搜索的3.0 还是有说这个,蛋疼;
最后在看官方的testCpp例子的时候发现了现在调用重力加速器的方法;例子的位置:X:\你的cocos2d-x\tests\cpp-tests\Classes\AccelerometerTest
其中要重写的方法为:onAcceleration(Acceleration* acc, Event* event); TMD差别好大有么有啊;
cocos2d-x每个版本都有变化有么有啊,坑爹……
不过坑爹归坑爹,引擎还是不错的,只能说咱学的不好吧;
OK 废话太多了,开始说正事;
既然找到了正确的方法,那就好解决了,首先是在.h头文件中定义好方法
#include "cocos2d.h" class GameScene : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); //重写的父类的方法,用来处理重力加速器方法 void onAcceleration(cocos2d::Acceleration* acc, cocos2d::Event* event); CREATE_FUNC(GameScene); };
接着就是在cpp文件中去实现这个方法就OK了
//重写重力加速器方法 void GameScene::onAcceleration(Acceleration* acc, Event* event){ auto director = Director::getInstance(); if(img == NULL){ return; } auto imgSize = img->getContentSize(); auto imgPosition = img->getPosition(); auto imgX = img->getPositionX(); auto imgY = img->getPositionY(); imgX += acc->x * gravityValue; //imgY += acc->y * gravityValue; //auto imgTemp = director->convertToUI(imgPosition); //imgTemp.x += acc->x * gravityValue; //imgTemp.y -= acc->y * gravityValue; //auto imgNext = director->convertToGL(imgTemp); FIX_POS(imgX, (origin.x + imgSize.width/2), (origin.x + visibleSize.width - imgSize.width/2)); FIX_POS(imgY, (origin.y + + imgSize.height/2), (origin.y + visibleSize.height - imgSize.height/2)); img->setPosition(Point(imgX, imgY)); log("onAcceleration: acc->x: %f, acc->y: %f, acc->z: %f, imgX: %f, imgY: %f", acc->x, acc->y, acc->z, imgX, imgY); }
可以看到其中有我注释掉的一部分代码,这是本来官方示例文件中的根据“屏幕坐标系”以及“OpenGL坐标系”互相转换的方法,将例子中精灵的坐标互相转换,然后进行设置精灵坐标
其实后来根据输出log测试,我发现cocos2d-x的默认的getPosition()获取的坐标是和OpenGL的坐标是一直的,所以最后我就注释掉了例子中的转化方式,直接根据坐标点来设置精灵位置,这样是和经过转化的一样的效果的;
下边我画了几张图来简单的说明一下OpenGL坐标系,屏幕UI坐标系(只是我自己认为,如果有不对的地方,望朋友们指正)
首先这个立方的 是我绘制的OpenGL的重力加速器的三维空间坐标系,旁边的蓝色表示一个手机平放时与坐标系的对应情况;根据图中箭头的方向,x、y、z三个坐标轴的值都是趋向于-1的;
下面这两个是平面的UI坐标系和GL坐标系
UI坐标系的坐标原点是在左上角,Y轴向下延伸,其中精灵A位置为(10,10)
GL坐标系的原点是在左下角,Y轴向上延伸,精灵B(相当于UI坐标戏中的精灵A)位置为(10, 1280)(屏幕分辨率为720*1280时)
这就是在官方Test例子中UI坐标系和GL坐标系为什么要进行转换
cocos2d-x中的默认坐标系是和OpenGL的坐标系是相同的,所以我直接根据getPosition()方式获取了精灵的位置,这样就少去了复杂的转换,不过既然官方进行转换可能有他们的意图吧,现在也不用深究了;
本博客内容与个人原创博客同步更新:Melove 我爱
OK继续垒码了
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。