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();
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();
当我们推出一个场景的时候,需要将所有定时器关掉,防止对其他场景产生影响。
@H_640_301@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$",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了。