[针对初学者]Cocos 瞎搞小技巧2

来源:互联网 发布:适配器模式 java 编辑:程序博客网 时间:2024/06/05 22:37

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_CONSOLEint 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了。

0 0