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