今天解決了一個問題心情很爽 哈哈;
今天解決的就是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繼續壘碼了