[针对初学者]Cocos 瞎搞小技巧2
来源:互联网 发布:适配器模式 java 编辑:程序博客网 时间:2024/06/05 22:37
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_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了。
- [针对初学者]Cocos 瞎搞小技巧2
- [针对初学者]Cocos 瞎搞小技巧1
- [针对初学者]Cocos 如何提高编译速度
- 适合于初学者的一些小技巧
- python小技巧(初学者适用)
- [转]初学者JavaScript 小技巧总结
- 《送给初学者的五个调试小技巧》
- [Cocos2d-x][Cocos小技巧][1][触摸屏蔽]
- powerdesigner使用小技巧——针对Oracle数据库
- 编写HTML的一些小技巧(针对IE)
- 针对 google 图片搜索的小技巧,嘿嘿
- 小技巧,使用jquery针对已有table进行处理
- vim小技巧--针对换行符进行操作
- 瞎搞
- 瞎搞
- linux下C语言查询mysql数据库小问题(针对初学者)
- VB6.0初学者的十个编程小技巧
- VB6.0初学者的十个编程小技巧
- android R文件丢失解决方法
- 获取注册到系统的tomcat服务的运行参数信息
- java语言程序设计第十版(Introduce to java) 课后习题 chapter6-23
- 解决初次登录MySQL出现ERROR 1045 (28000):Access denied for user 'root'@'localhost'问题
- [Poj 1321] 棋盘问题 dfs
- [针对初学者]Cocos 瞎搞小技巧2
- Happy 2004(一元线性同余方程组)
- JVM(1)——JVM内存分区
- ARM的六大类指令集--- 加载/存储指令
- 2530: 小勇玩lol
- linux chmod命令
- 13. Roman to Integer
- fatal error LNK1201:写入程序数据库“***.pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
- [Poj 2488] A Knight's Journey