標籤:cocos2d-x 手機遊戲 遊戲 移動 ios
下面我們通過一個執行個體介紹一下如果通過層加速度計事件實現訪問加速度計。該執行個體情境如所示,情境中有一個小球,當我們把行動裝置水平放置,螢幕向上,然後左右晃動行動裝置來改變小球的位置。
下面我們再看看具體的程式碼,首先看一下HelloWorldScene.h檔案,它的代碼如下:
#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #define kBall_Tag 100 ①#define SPEED 30.0 ② class HelloWorld : public cocos2d::Layer{public: static cocos2d::Scene* createScene(); virtual bool init(); virtual void onEnter(); virtual void onExit(); virtual voidonAcceleration(cocos2d::Acceleration* acc, cocos2d::Event *unused_event); ③ CREATE_FUNC(HelloWorld);}; #endif // __HELLOWORLD_SCENE_H__
上述代碼第①行定義宏kBall_Tag,它是小球精靈的標籤Tag數值。第②行定義宏SPEED,它表示小球運動的速度。第③行代碼聲明了onAcceleration函數,。
HelloWorldScene.cpp檔案,它的主要代碼如下:
bool HelloWorld::init(){ if( !Layer::init() ) { returnfalse; } SizevisibleSize = Director::getInstance()->getVisibleSize(); Pointorigin = Director::getInstance()->getVisibleOrigin(); //貼圖的紋理圖片寬高必須是2的n次冪,128x128 autobg = Sprite::create("BackgroundTile.png", Rect(0,0, visibleSize.width, visibleSize.height)); //貼圖的紋理參數,水平重複平鋪,垂直重複平鋪 Texture2D::TexParamstp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT}; bg->getTexture()->setTexParameters(tp); bg->setPosition(origin+ Point(visibleSize.width/2, visibleSize.height/2)); addChild(bg,0); autoball = Sprite::create("Ball.png"); ball->setPosition(origin+Point(visibleSize.width/2,visibleSize.height/2)); addChild(ball,10, kBall_Tag); returntrue;} void HelloWorld::onEnter(){ Layer::onEnter(); log("HelloWorldonEnter"); setAccelerometerEnabled(true); ①} void HelloWorld::onAcceleration(Acceleration*acc, Event *unused_event){ log("{x = %f, y = %f}", acc->x,acc->y); Size visibleSize = Director::getInstance()->getVisibleSize(); Sprite* ball = (Sprite*)this->getChildByTag(kBall_Tag); ② Size s = ball->getContentSize(); ③ Point p0 = ball->getPosition(); ④ float p1x = p0.x + acc->x *SPEED ; ⑤ if ((p1x - s.width/2) <0) { ⑥ p1x = s.width/2; ⑦ } if ((p1x + s.width / 2) > visibleSize.width) { ⑧ p1x = visibleSize.width - s.width / 2; ⑨ } float p1y = p0.y + acc->y *SPEED ; p1y = p1y < 0 ? -p1y : p1y; if ((p1y - s.height/2) < 0) { p1y = s.height/2; } if ((p1y + s.height/2) > visibleSize.height) { p1y = visibleSize.height - s.height/2; } ball->runAction(Place::create(Point( p1x, p1y))); ⑩} void HelloWorld::onExit(){ Layer::onExit(); log("HelloWorldonExit");}
上述代碼①行開啟加速計裝置,這個代碼是在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