实习周记II

来源:互联网 发布:java 同步锁 并发 编辑:程序博客网 时间:2024/04/28 09:35

2014年12月15日  深圳

九点了,开始SOHO~ 听上去高端大气的工作方式,其实本质上是没有办公地点而已。

有了几天的工作经验,写起代码也流畅了很多。只是自己E文不大好,外加老大的代码写的匆忙没有注释,还需要自己Google翻译下函数名,理解下大致的使用思路。

今天写了个A*寻路模拟,在晚上提交代码时发现个BUG,就是在A*场景关闭后,应用程序依然会响应A*场景的触摸事件。最开始还以为老大的扩展库有问题,找了很久。最后发现问题出在cocos2d-x的触摸机制上,算是一个小坑

出现问题的代码如下:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);this->registerWithTouchDispatcher();

上面的代码意思是将本类中的触摸函数注册到导演类中,并开始监听。

延伸点说,CCDirector是一个单例,就好像一个程序员的管家,程序员需要监听触摸事件时,就需要告知CCDirector,CCDirector会将需要回调的函数指针保存在自身的变量中。

而真正实现触摸响应的并不是CCDirector本身,而是OpenGl-ES。当用户触摸设备时,OpenGl-ES会得到触摸信号,OpenGl则会通知CCDirector,然后CCDirector才会调用相应的函数指针。在这个过程中各个平台的代码实现方式不太相同,因为自己也不太了解,也就不过多说了。

有点说多了,上面的代码之所以会出现问题是因为我覆盖了CCLayer的析构函数。注意,CCLayer的析构函数中有这样一段代码:

unregisterScriptTouchHandler();unregisterScriptKeypadHandler();unregisterScriptAccelerateHandler();

上述代码的第一行是解除当前类中的触摸响应。

因为覆盖了CCLayer,我的类中并未正确调用父类的析构函数,导致CCDirector并不知道何时改停止触摸监听,而是继续响应事件、继续调用已经销毁的函数指针,导致程序出错。

最后我在析构函数中加入了:

CCLayer::~CCLayer();
BUG解决了,对cocos2d-x的触摸机制有了新的认识。

另外,手动向CCDirector注册触摸事件是不明智的选择,除非你想指定响应优先级。

官方的案例中是这样做的:

this->setTouchMode(ccTouchesMode::kCCTouchesOneByOne);this->setTouchEnabled(true);
相信大部分人使用的是第一种方式,这应该是cocos的历史遗留问题吧?至少我当时在自学cocos2d-x时看到的都是使用第一种方式来手动注册触摸事件。


2014年12月16日  深圳

今天老大的合伙人回来了,带了包越南咖啡,一起吃了顿晚饭。广东在外面吃饭好麻烦的说有木有,还要洗钵啊!

吃饭时才知道,招我入公司的老大是CTO,今天回来的是CEO。公司刚刚开始创业,我是第三个来的。

就不叫CTO了,搞得太行政不太喜欢,还是称呼CTO为志哥吧。志哥吃饭时介绍说,他自己在游戏行业工作了整整九年,第一份工作是做J2ME的,这次是他第二次创业。之所以招我过来是因为我喜欢独立游戏,技术也还说的过去,因为年轻所以应该会有些游戏创意。真希望自己九年后对游戏依然有志哥那样的热情。

志哥说国内的游戏圈很小,需要时刻注意这点。这应该是对我做出些提醒吧。


2014年12月19日  深圳

这几天也没什么东西需要写出来,还是那些东西,已经完成的差不多了。志哥明天给我放假,让我好好的玩几天。

非要说学到了什么的话,那就是宏虽然是好东西,但不能用多,在调试时非常不好找BUG。还好,自己比较幸运,自己加的宏没什么问题,以后要注意了。

对了,下周就可以到办公室了,今天晚上看了办公地点,在民宅了= =

0 0
原创粉丝点击