[针对初学者]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了。

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