[针对初学者]Cocos 瞎搞小技巧2
1 获取键盘按键获取键盘按键的方法有很多种,我就说下系统的实现获取按键的方法。 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 添加定时器scheduleschedule也叫进程,在操作系统中我们叫进程调度。定时器有很3种常用:schedule,scheduleUpdate,scheduleOnce,但是最实用的是schedule和scheduleOnce两种。 this->scheduleOnce(schedule_selector(gameScene::Move),1.0f);
关闭定时器:该定时器,执行完一次之后,自动关闭 this->scheduleUpdate();
关闭定时器: this->unscheduleUpdate();
调用函数:定时器会自动查找名为Update的函数进行调用 void gameScene::Update(float dt)
{
}
(3)定时调用想要调用的函数 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调试神器很多时候我们需要知道某功能是否正常运行,我们就可以通过在该功能执行的地方加入打印信息,如果正常打印,那么就说明该功能也是执行了。 #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了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – OpenGL – GLM和GLSL,它们有何不同?
- 我怎样才能ENABLE_VIRTUAL_TERMINAL_PROCESSING?
- c – 这个按位表达式如何帮助找到两个整数之间的
- xml – XSLT重命名合格的根元素,保留其他名称空间
- NOR型flash与NAND型flash的区别
- 上下游依赖 这种er关系 在mysql 等关系型数据库中
- React Native -- The Life-Cycle of a Composite
- ajax 调用接口 C# 调用接口 PostHttpResponse 类
- c – shared_ptr构造函数参数是否应按值传递
- 循环使用正则导致进程挂起和CPU使用率达到100%居