[針對初學者]Cocos 瞎搞小技巧2

1 獲取鍵盤按鍵

獲取鍵盤按鍵的方法有很多種,我就說下系統的實現獲取按鍵的方法。
第一步:重載onKeyPressed和onKeyReleased函數;
在添加的之前,我們必須讓當前類繼承cocos2d::Layer,因爲cocos2d::Layer是管理按鍵;如果我們去查看cocos2d::Layer的類成員,就會發現onKeyPressedonKeyReleased函數。下面舉個例子

class gameScene : public cocos2d::Layer
{
public:
    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static cocos2d::Scene* createScene();

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();
    virtual void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);
    virtual void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);
    virtual void Move(float dt);
    // implement the "static create()" method manually
    CREATE_FUNC(gameScene);

    cocos2d::Sprite * tank;
    cocos2d::EventKeyboard::KeyCode key;
    cocos2d::TMXLayer * spriteLayer;
};

裏面的class gameScene : public cocos2d::Layer就是繼承 cocos2d::Layer;類成員函數中有如下兩個函數;這就是對onKeyPressedonKeyReleased函數的重載。

    virtual void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);
    virtual void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);

下面我們需要添加這兩個函數的實現,功能:按鍵按下,記錄當前按鍵,按鍵釋放,講key設爲KEY_NONE

void gameScene::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event)
{
    key = keyCode;
}
void gameScene::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
{
    key = EventKeyboard::KeyCode::KEY_NONE;
}

第二步:激活按鍵監聽事件;

    auto listenerKeyboard = EventListenerKeyboard::create();
    listenerKeyboard->onKeyPressed = CC_CALLBACK_2(gameScene::onKeyPressed, this);
    listenerKeyboard->onKeyReleased = CC_CALLBACK_2(gameScene::onKeyReleased, this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerKeyboard, this);

上面兩步完成之後,就可以進行按鍵獲取操作了。

2 添加定時器schedule

schedule也叫進程,在操作系統中我們叫進程調度。定時器有很3種常用:schedule,scheduleUpdate,scheduleOnce,但是最實用的是schedule和scheduleOnce兩種。
(1)等待幾秒之後執行一次
啓用定時器:1.0f代表1s

this->scheduleOnce(schedule_selector(gameScene::Move), 1.0f);

關閉定時器:該定時器,執行完一次之後,自動關閉
調用函數:見下面(3)
(2)定時調用Update函數
啓動定時器

    this->scheduleUpdate();

關閉定時器

    this->unscheduleUpdate();

調用函數:定時器會自動查找名爲Update的函數進行調用

void gameScene::Update(float dt)
{

}

(3)定時調用想要調用的函數
啓動定時器:設置定時器週期爲0.1s,調用函數爲Move

    this->schedule(schedule_selector(gameScene::Move), 0.1f);

關閉定時器

    this->unschedule(schedule_selector(gameScene::Move));

調用函數:我這裏實現的功能是發現有某個按鍵按下,就移動tank這個精靈。

void gameScene::Move(float dt)
{
    switch (key){
    case EventKeyboard::KeyCode::KEY_W:
        tank->setPositionY(tank->getPositionY() + 8);
        break;
    case EventKeyboard::KeyCode::KEY_S:
        tank->setPositionY(tank->getPositionY() - 8);
        break;
    case EventKeyboard::KeyCode::KEY_A:
        tank->setPositionX(tank->getPositionX() - 8);
        break;
    case EventKeyboard::KeyCode::KEY_D:
        tank->setPositionX(tank->getPositionX() + 8);
        break;
    default:break;
    }
}

(4)關閉所有定時器

this->unscheduleAllSelectors();

當我們推出一個場景的時候,需要將所有定時器關掉,防止對其他場景產生影響。

3 log調試神器

很多時候我們需要知道某功能是否正常運行,我們就可以通過在該功能執行的地方加入打印信息,如果正常打印,那麼就說明該功能也是執行了。
如何加入打印功能呢?我們需要修改main.c爲如下

#define USE_WIN32_CONSOLE

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

#ifdef USE_WIN32_CONSOLE
    AllocConsole();
    freopen("CONIN$", "r", stdin);
    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
#endif

    AppDelegate app;

    int ret = Application::getInstance()->run();

#ifdef USE_WIN32_CONSOLE
    FreeConsole();
#endif

    return ret;
}

這樣,我們在想要打印的地方打印信息就可以了。

    log("Find Key Pressed!\n");

當我們在程序發佈的時候,這些調試信息就不需要了,我們就可以將

#define USE_WIN32_CONSOLE

註釋掉就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章