Cocos2d-x加速度計執行個體:運動的小球

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.