程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Cocos2d-x 系列七之用戶交互

Cocos2d-x 系列七之用戶交互

編輯:C++入門知識

如同android中的用戶交互,cocos2d-x通常也需要對一些用戶點擊、觸摸事件進行監聽;

一、 簡單觸摸事件

    auto listener = EventListenerTouchAllAtOnce::create();
    listener->onTouchesBegan = [](const std::vector<Touch*>&, Event*) {
        log("onTouchesBegan");
    };
    listener->onTouchesMoved = [](const std::vector<Touch*>& ts, Event* e) {
        log(" touch count is %ld" +ts.size());
    };
    Director::getInstance()->getEventDispatcher()
            ->addEventListenerWithSceneGraphPriority(listener, this);

觸摸事件使用的監聽接口是EventListenerTouchAllAtOnce,他有如下幾個觸摸事件回調函數;

public:
    std::function<void(const std::vector<Touch*>&, Event*)> onTouchesBegan;
    std::function<void(const std::vector<Touch*>&, Event*)> onTouchesMoved;
    std::function<void(const std::vector<Touch*>&, Event*)> onTouchesEnded;
    std::function<void(const std::vector<Touch*>&, Event*)> onTouchesCancelled;

4個函數不再說明具體對應功能,函數名已經表示得很清楚;

二、觸摸事件傳遞

有時候需要對角摸事件一個一個的進行捕獲,此時就需要用到EventListenerTouchOneByOne,它也有幾個回調函數;

public:
    std::function<bool(Touch*, Event*)> onTouchBegan;
    std::function<void(Touch*, Event*)> onTouchMoved;
    std::function<void(Touch*, Event*)> onTouchEnded;
    std::function<void(Touch*, Event*)> onTouchCancelled;

注:onTouchBean返回值為bool類型

    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = [](Touch *t, Event * e) {
        log("onTouchBegan");
        return true;
    };
    listener->onTouchMoved = [](Touch* t, Event * e) {
        log("onTouchMoved");
    };
    Director::getInstance()->getEventDispatcher()
            ->addEventListenerWithSceneGraphPriority(listener, this);

注意onTouchBegan事件,如果後面要繼續獲取其它觸摸事件,需要讓返回值為true;返回值true表示事件還要繼續向後傳遞;
實際上,cocos2d-x為了程序運行的效率,如果返回值為false,表示事件不再向後傳遞,將不再捕獲onTouchMoved等事件;返回true的時候,才表示事件還要向後傳遞;

三、加速傳感器

    Device::setAccelerometerEnabled(true); // @1
    auto listener = EventListenerAcceleration::create([](Acceleration* a, Event*) {
        log("x:%g,y:%g,z:%g", a->x, a->y, a->z);
    });
    Director::getInstance()->getEventDispatcher()
            ->addEventListenerWithSceneGraphPriority(listener, this);

上面是一個簡單的使用加速傳感器的例子,需要注意的是 @1 要設置啟用加速傳感器

四、按鍵事件

在Iphone手機上,不用處理按鍵事件,主要使用在android手機上,如同android sdk中的按鍵事件一樣,cocos2d-x也會返回一個按鍵對應的code;

    auto listener = EventListenerKeyboard::create();
    listener->onKeyReleased = [](EventKeyboard::KeyCode code, Event * e) {
        log(" keycode is %d", code);
        switch (code) {
            case EventKeyboard::KeyCode::KEY_BACKSPACE:
                Director::getInstance()->end(); // @1:cocos2d中,默認按返回鍵是不會退出應用程序的,需要添加處理才能退出應用程序 
                break;
            default:
                break;
        }
    };
    Director::getInstance()->getEventDispatcher()
            ->addEventListenerWithSceneGraphPriority(listener, this);

注:@1

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved