一个关于luasocket使用的很蠢的问题

今天遇到了一个问题,服务端给客户端发包,偶尔会出现客户端无法解析的情况。我们服务端采用的skynet,客户端使用的是luasocket,协议采用的sproto。

照例首先不怀疑库的问题,肯定是自己的原因,而且应该是比较蠢的问题。首先问题出现在某一个协议上,这个协议每次发出去,客户端都无法解析,然而从proto文件里无法看出任何差别,也尝试修改了其他几个协议来尝试,并没有发现使其必现的规律,折腾了半天。最后只好动用VS,单步调试,内存跟踪,最终发现一个问题,服务端发出的包内容和客户端收到后拿给sproto解析的包内容不一致!
继续阅读

细数cocos2d踩过的那些坑

cocos2d-x版本:3.2
cocostudio版本:1.6.0
开发语言:Lua,使用cocos本身导出的Lua的API

cocostudio相关:

1. 骨骼设置隐藏时,若该骨骼动作的第一帧是没有渲染贴图的,则设置会失效,查看源码如下:

void DisplayManager::setVisible(bool visible)
{    
	if(!_displayRenderNode)
		return;
	_visible = visible;
    _displayRenderNode->setVisible(visible);
}

_visible = visible;

提到第一句即可。

2. 子骨骼在动作里没有父骨骼的情况下会全部乱掉,并没有通过源码发现。

3. 换贴图的情况下,如果编辑器动作是通过不渲染贴图的方式来做,那么实际播放中如果有换装则会导致隐藏失效,并没有通过源码发现。

cocos2d-x的锚点与坐标

最近被cocos2d-x的坐标问题绕晕了头,这里整理下。

position: 每个node都有一个position,这个position是相对于它的父节点的坐标,所谓的世界坐标可以认为就是直接挂载在scene下的node的坐标。
AnchorPoint:每个node都会有自己的AnchorPoint,它的作用仅在于在设置position时,是将图片中的哪个点设置到那个位置。

需要注意的是
1 position是逻辑位置,而不是实际像素
2 这个坐标系与windows的坐标系的y轴是反的,cocos2d里(0,0)是在左下角,而不是左上角。
3 每个node的position都是相对父节点的(0,0)的位置,与父节点的锚点无关!我就是因为这个问题没搞清楚在这里绕晕了……

金山这几年--如何把游戏做失败(三)

本来前段时间约了几个朋友让他们分享些自己的心得,结果貌似各位都跟我一样也是重度拖延症患者……之前也有朋友跟我反映说我写的都是跟编程技术相关的,没什么兴趣,所以决定这篇写点其他的。

记得飞舟给我们的培训的第一堂课上就问了我们一个问题:你为什么要学习编程?每个人都有自己的初衷,有很多人是因为喜欢技术,而我则是为了可以自己做游戏。

能做出一款让大家喜欢玩并且玩得很开心的游戏是我的梦想。但是很可惜,至今为止我也没有参与过任何一款可以称之为成功的产品,但我却有幸目睹了一些失败产品的历程。成功不可以复制,但是失败可以避免,况且在成功学如此流行的今天,成功游戏的分析多入牛毛,所以这里还是分享些游戏失败的经验吧。

继续阅读

金山这几年--程序员的信仰(二)

“信仰是指对一个人(同样的对他的能力)、事物、神、宗教的教条或教导、没有经验证据的观点(例如拥有强烈的政治信仰)抱有信心和信任。” 维基百科如是说。

做为一名程序员,在金山的经历也使我拥有了一种编程信仰,我相信通过正确的方式方法可以写出优质没有bug的程序(是真的没有bug,而不是自己的声称)。只有你相信了它,你才有了这种可能去做到。

PS:至今还没有人从Tex的bug悬赏金中大幅获利给了我们这种教徒以极大的曙光。

继续阅读

金山这几年--program in project(一)

不知不觉在金山已经呆了近五年,这段时间里犯过很多错误,同时也学到了很多东西,既然已经离开,那也该为这段时间好好的做个回顾。今天就先来谈谈在编程技术这块吧。

首先声明,我谈到的技术相关的东西都是指在项目中的经验,那些纯粹的追求技术的人和在学术上追求的人,这些东西可能对你们来说毫无意义。 ^_^

继续阅读

2012年的经验总结

最近工作非常忙,忙到一直把这件事搁置脑后,先占座

==================分割线======================

这一年经历没有太多,感触不少。项目一直大修大改,需求变更比翻脸快,也让我学到不少东西。

一、要写出无bug的程序

程序无bug?也许很多人觉得是在开玩笑,或者吹牛B。如飞舟所说,如果首先你就坚信程序是一定会有bug的,那么你写出来的程序一定有bug。那么我们应该相信程序是可以写出无bug的,而我们要做的就是不断向这一目标靠近,最终接近零bug。

“为什么要这么做?我写出的程序跑的也很稳定嘛~~有bug马上改掉就好了嘛。”我以前就是这么样一个观点。但你这么做的后果是,你的程序永远得不到别人的信任,你也无法得到别人的信任。就如我曾经跟一个同事交流时说,如果两个操作系统(特意选了这种很重要的软件)摆在你面前,一个功能很强大,但是时不时就来个bug崩溃。另一个功能相对简单,但是运行很稳定,你会选择用哪个?再换到人,2个人,一个人写代码可能很快,但他的程序总是时不时就出个bug。另一个可能写代码比较慢,可能效率也不高,但是他写出的代码几乎很少出bug。问:如果你现在需要开发一个很重要的软件,你会选择谁?对现在的我来说,我都会毫不犹豫的选择后者,借用一句话说,稳定压倒一切。

如何做到程序无bug?遵循一些最基本的原则即可做到很好。

继续阅读

包含架构

包含架构,一切上层应用以底层为基础,即使失去上层应用,底层依然可以在各自领域工作的很好,然后一层层的叠加。如果以这种方式来做程序设计,就是每个函数只负责做自己的事情,然后每个小模块负责根据外界事件来决定是否调用这些函数。最终构成的系统应该是否会很奇妙。

不要迷信面向对象

还记得以前刚开始学编程那会,还不太理解面向对象,后来第一次弄明白面向对象的概念的时候,觉得这个棒极了,将所有问题都抽象成对象来解决,再后来再接触设计模式的时候,觉得简直精妙极了。但是今天我想说的是,不要太过于迷信面向对象,它也有局限性。

面向对象可以令很多问题分而治之,划分对象,对象之间通过接口沟通,对象内部解决自己的问题,降低问题的复杂度和代码的耦合度。这种模式这么好,它会有什么问题呢?以前我也从来没有想过这个问题。直到来到西山居,参与九天神话项目。这个项目与西山居以往项目一个很大不同在于lua的大规模运用,所以开发过程中基本会以lua为主。习惯了C++编程的人刚开始在用lua的时候会很习惯按C++的风格来编写lua的代码(当然我是以我为例,我相信很多人会跟我一样,因为旁边的人也是这样),但慢慢的,我开始考虑动态语言与静态语言的区别究竟在哪里?
继续阅读

培训小记

今天飞舟给我们的培训比较特别,分成四个小组分别组装四驱车,比谁装得快,比谁跑得快。本来以我习惯都会先看说明书的,但是我觉得自己以前玩过,为了彰显自己的牛逼,不看说明书就开始搞了,最后的结果是很悲剧,倒数第二个装好,跑的也倒数第二。

结论,什么时候都不要为了装逼而去做自己不确定的事,得不偿失,牛逼是自然而然的体现出来的而不是靠方法去展现出来的。为了牛逼而去装逼,结果就是自己变成了傻逼。写代码亦如是。

你的价值体现在你的团队能做什么事情,你所做的成果能不能获得他人的认可。