farewell cocos2d

今天开始正式投入unity的阵营了,向cocos2d说再见。从3.0版本开始用到现在,感觉从3.2往后cocos2d就开始点错了天赋树,不在长处2D上发力,不在编辑器上下狠功夫,却非要花大力气去抢夺3D的用户,一声叹息。

PS:昨天用扑克牌做了一个游戏原型跟老婆玩了下,觉得可玩性还可以,不过很多地方还需要调整,第一次切实感受到游戏原型的力量,低成本,而且可以发现很多光靠脑子想想不出来的问题。

我的Sublime设置

写在这里,免得每次在一个新的地方又要重新网上找相关资料。

sublime text 3 package control install:

import urllib.request,os; pf = ‘Package Control.sublime-package’; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), ‘wb’).write(urllib.request.urlopen( ‘http://sublime.wbond.net/’ + pf.replace(‘ ‘,’%20’)).read())

继续阅读

腾讯很可能知道你每天都打开过哪些网页哦

近来无事在家写一些爬虫程序,但是抓包的时候却发现一个很诡异的包经常出现,就是下面这个。
qq1
点开一看,非常生气,原来是把我输入的网址给秘密的发送到 http://c.gj.qq.com/mailreport 这个URL去了,内容如下:
qq2
然后查看发送进程,居然是chrome!!!(见第一幅图)于是换了个猎豹浏览器试了下,并没有发送这个包,可以肯定是chrome除了问题!我的Chrome是官网下载的,应该是没问题的,于是很自然就想到肯定是偷偷给我的chrome装了什么插件,于是查看了下插件列表,只有这货是腾讯的:
qq3
于是尝试将它禁用,再试一次:
qq4
很好,这个包并没有再出现了。证据确凿,这个电脑管家真是细心周到,每天把我看过什么网页一五一十全部汇报上去了,感(qu)谢(ni)备(ma)至(de)!

谈谈如何设计超过你驾驭能力的游戏系统

点此阅读图文并茂版

其实标题是有一点误导性的,标题里说的驾驭严格来说是指你的大脑能够直接驾驭的意思。这里我将一个人能驾驭的东西分为两种,一种是直接驾驭,一种是间接驾驭,什么意思呢?举个例子。

一个人的家乡,他出生的地方,假设他应该是再熟悉不过了,那么我认为他的大脑是能够驾驭这个地方的地形的。在我的定义里,如果是能够直接驾驭的人,那么他就应该能够瞬间能掌握这个地方的所有细节。简单的测试就是他能够非常准确迅速的将这个地方的地图给画出来,在规划线路的时候,脑中有个很清晰的类似地图APP导航一样的线路出线。

但还有一种熟悉的方式就是虽然我不知道地图怎么画,但是把我扔到任何一个地方我都能知道附近的地形。同样,规划路线虽然没法做到上面那点。但凭着脑海中对这条路有几个分叉,每个分叉对应哪个地方,然后逐步的规划,再通过正推反推,最终形成一条路线(这只是我对大脑思路的一个逻辑模拟,实际上它可能也就是一瞬间就完成了)。这就是我想说的间接驾驭。

说完了定义性的东西,那么其实今天想记录的就是如何通过一些手段去设计出我们能够间接驾驭但是没法直接驾驭的复杂系统。在这里要说的是两种方法:分层设计和闭包设计。

这两个概念,有人可能会说这东西是学程序才要学的,这也许是一个误解,这些东西并不是专属于编程的,而是逻辑思维训练后的产物,(其中闭包是数学推理中的,所以才说数学是很锻炼逻辑思维的)所以它们会影响你的逻辑设计。

首先分层就是把你要做的事情按照层级来划分,通过一层层的递进从而最终实现目的。简单举个例子,以用基本电子元器件(二极管,电阻什么的)制造计算机来举例子吧。如果直接让一个人用这些东西来做计算机,估计会疯掉的吧。但是如果换个思路,首先用基本电子元器件做成一些更高级的元件,比如与门,非门。再用这些高级元件去构成更复杂一点儿的,比如加减器,计数器等,接下来在用这些做成能够简单四则运算的CPU,存储器,那么计算机的雏形就已经出来了,接下来要做的就是把这些元件的性能做得越来越强大(引入集成电路)。看似无法完成的任务就通过这么一步步最终居然就实现了,这就是分层设计的威力。简单来说就是从下往上,每一层的结果变成了上一层的基石,通过将整体的复杂逐步拆分到每一层分解它的复杂度从而让我们能够对每一层直接驾驭,最终实现间接驾驭。

万物相通,其实游戏设计一样,通过游戏规则的分层设计,也许就能够设计出很多原本我们无法驾驭的游戏玩法。

第二个要说是闭包(不是一些计算机语言中的闭包,而是离散数学里定义的),具体定义可以自己去查阅。通俗点理解大概就是有一个元素的集合,它包含了一定规则,而在这个集合里的任意的元素都可以依照这些规则进行演算,且无论如何演算它的结果仍然被包含在这个集合中。比如有理数的集合和四则运算规则组成的闭包,任意的有理数之间都可以进行四则运算,且运算出的结果仍然是个有理数。

因为最近对这个感悟比较深,就稍微多说点。应用到游戏里,比如我们设计一个进化游戏,游戏由病毒,高级病毒,超级病毒3种生物组成,战斗力分别为1,2,3,我们的目的就是要培养出具有足够高的战斗力的病毒军队。其中有一些规则:每人初始只有一个病毒,病毒可以进化,中途无法通过其他途径获得任何病毒。这里如果进化规则设计成病毒->高级病毒->超级病毒,那么这不是一个闭包,因为其中的进化规则导致超级病毒并不能应用进化规则。带来的后果也显而易见,每个玩家最终结果只能拥有一个超级病毒,游戏的天花板立马就显现了。如果要提高天花板怎么办,可能有以下三种办法:
1 加入更高级的生物,但是终归最终玩家还是能够走到终点。
2 引入新的规则,每个生物进化到最终版本可以提升战斗力数值。
3 修改原有的进化规则,补充超级病毒的进化规则,即超级病毒可以进化为4个病毒,这样就形成了一个闭包。(数值保持3到4)

这里2和3都可以彻底解决天花板问题,如果只是单纯比拼战斗综合确实也并没有太大区别。但如果这游戏还具有战斗系统,且是实时战斗,一个生物与多个生物能产生的结果就会不一样,那么3带来的复杂度的提升就超过了2(当然,进化规则可能要相应修改,比如超级病毒只能进化为3个甚至2个病毒,因为毕竟个数也是一种潜在战斗力)

同样是设计一个游戏系统,为了解决一些问题或是创造更多变的玩法,方法的不同也许会导致最终结果呈指数级不同。所以我也是推荐一些游戏策划不妨多了解了解理性的逻辑知识,不要让自己永远停留在感性的阶段,仅仅依靠直觉(天才本能,然而大部分人并不具有)和经验(其实就是去借鉴自己过去做过的游戏或者其他同类型游戏)去做设计。

Shader修改颜色出现不透明框

原本想做个shader,用来完成对图片色相,饱和度,亮度的调整,结果根据转换算法描述写完之后发现一个很严重的问题,就是原本图片是透明的地方在调整了亮度之后出现了不透明的色块(仅增大会出现)。后来将shader简化,仅将图片做红偏色。原图如下:
无标题2

结果做完shader变成下面这样:

gl_FragColor = vec4(r + 0.3, g, b, a);

无标题

经过一番尝试,后来发现改成这样均正常

gl_FragColor = vec4(r * 1.3, g, b, a);
gl_FragColor = vec4(r  + r * 0.3, g, b, a);

无标题1

总结,大抵是shader里面不能直接用加减单位来修改RGB值,只能用乘除法来做,大概猜测是因为色彩的单位并不是我们以为的[0, 1]吧,具体原因以后再具体分析吧。

一个关于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. 换贴图的情况下,如果编辑器动作是通过不渲染贴图的方式来做,那么实际播放中如果有换装则会导致隐藏失效,并没有通过源码发现。

将cocos2dx里的lua升级至5.3

由于项(ge)目(ren)需(xing)要(qu),决定将项目的代码升级到最新的5.3.0版,源码点这下载

由于cocos2d-x是个跨平台项目,所以要分别对windows,android,ios三个环境均要做一定修改。而由于cocos2d-x默认是使用luajit的,而最新的luajit并不支持Lua5.3,所以作为代价就是放弃jit带来的效率提升,然而这个对我们的项目其实并没有什么影响(游戏玩法决定不需要太注重效率)
继续阅读