文章标签 ‘前端’
2010六月24

闭包

曾几何时碰到过某考题

var dom;

for (var i = 0; i < 6; i++){

  dom = document.getElementById("rect"+i);

  dom.addEventListener("click", function(){ alert(i)});

}

好吧,很显然无论click哪个dom都会输出6. 问题也很简洁怎么解决这问题. 当时没往闭包那想.

dom.addEventListener("click",(function(){

function ff (f) {

var ffv = f;

function av () {

alert(ffv);

}

return av

}

return ff(i);

})());

胡乱写了一下,其实就是这么回事. 说来说去不过就是个作用域的问题. 今天身体不舒服,  随便写一下. 应该还能再简单些.

2010六月2

关于类型强转换

 这是一个非常基础的问题. 在平时工作中就算是再小的项目里面也会涉及到类型转换. 方法大致也就是类似

  ClassName( instance );  instance as ClassName;

就类型转换而言没什么区别,在我看来也就是报错或是返回null的区别而已.

有的时候用得习惯了,动不动就会吧Int(),Object()这样的玩意拿来转. 别的还好, Array的时候请一定要注意. 这些个东西其实是全局函数,文档上写得很清楚的.

就如同事发我的代码

var a:Object;

a = [1,2];

Array(a).length;

(a as Array).length;

结果显然是输出1,2. 原因就是Array(a); 这个不是说类型转换, 是新建了一个Array. 所以

Array(a)[0].length 这个时候就是2.

各中道理文档上很详细的说. 别出现这种bug, 会让人很郁闷的.

2009十二月27

webgame的一二三事

 封闭真的彻底结束了,想起来不知不觉就会有好心情( 你看这折磨的 ). 把生活和工作几乎耦合,说实话其实也带来不了多少效率. 来做游戏有这么一段时间了,最开始的天书,这算是比较成功的一款webgame了.可惜对项目本身涉足不深. 帝国才是一直都有在开发的游戏,航海是被中途借调过去的. 经历了这些个项目, 有些想法,说不上什么心得,就是记录,总结一下.

首先,态度和心态很重要. 我说的不是什么盈利,不是什么推广,不是什么一定要得到多大的收入.仅仅是对于开发人员. 最初我觉得,做游戏赚钱不赚钱基本上和技术无关,有没人来玩,游戏吸引不吸引人都是策划他们的事情.哈哈诚然,技术人员大多数时候都是拿到需求,讨论需求,然后设计,最终进入开发阶段. "我只要完成功能就好好了,其他爱谁管谁管"大体就是这样吧. 我们可以换个角度思考这个问题. 作为一个技术人员, 我们实际上是提供了一个平台. 由于这个平台,策划们的idea和美术的创意才能结合到一起,才能正常,顺利的运行并且展现给玩家. 虽然工作性质没有改变,但至少这是一个积极的心态,能使眼界更宽,考虑问题更加周全.

接着是信息构建和层级. 一个游戏的主界面的空间是有限的. 不可能把所有的东西都放在主界面上. 这样无非就是让页面显得混乱,拥挤,让玩家迷惑,不知从何下手.在功能区(类似网站的导航条),应当保证功能的独立性,就帝国而言,以前功能区有个label叫做"工具"的按钮(图已经找不到了) , 它又和 联盟 , 英雄 , 军队这样的按钮放在一起.我第一次看到的时候就想,这玩意到底是干什么的.结果点开了之后弹出一框, 里面又是一排按钮,进入其他功能区,这就相当让人费解了. 

说信息构建就不得不说到层级,如果客户端使用的是flash,我个人觉得这个层级比较容易控制.能把信息分类,合理的控制在某一层里.比如弹出,窗口,面板或是场景切换,优秀的兼容性也是现在大多数webgame采用flash的重要原因之一. 无论是在天书还好是航海,层级都是最先要设计的.把信息都分开来,放在不同的层级里,开发or管理都是方便的. 特别是有战斗切换的,这个尤其重要. 相对传统网页客户端,我觉得控制起来要困难一些. 那时候经验不足. 没有做信息分类,限制层级也显得力不从心. 在帝国这个项目里出现过茫茫然多的 二级窗口把弹出窗口覆盖的情况 . 一个窗口出现了, 技术策划都不清楚这个到底应该是在哪个区域,大家你看看我,我看看你..哎.

再就是组件,框架这样的东西. 对于帝国来说选用的是jquery这个框架. 说来惭愧,当时对javascript不甚了解.糊里糊涂就用这个了,也没来得及比较. 回过头来看, 选用成熟的框架是可行之举. 可以大大提高开发效率, 风险在于如果出现框架之内的问题就难以入手,修改费劲. 其实碰到这样的问题的机率比较小,一般问题都有多个方法来解决.绕绕也就过去了. 自己开发呢,当然可控性是最高的,没事自己改着玩的都可以,额外的工作量自然也就是它的不足了. 毕竟现在javascript框架多得跟什么似的,有句广告语不是说 "总有一款是适合你的" . actionscript就没什么悬念了,这里框架的meaning和前面的不大相同,这个主要功能是提供合理的OO结构,将代码模块化,解耦化,使应用能够更好的维护和扩展. 虽然官方的,民间的优秀框架不少,但大多数还是选择自己实现为自己游戏定制开发.大体思想对的就好,正乃, 思想在我心中,万变不离其宗(前些日子说是又有什么依赖注入的框架..还没来得及看..人生啊.)

组件嘛,传统网页客户端大多数还是使用DOM,偶尔也有像YUI那样,完全自己实现的一套UI.在游戏里面用的UI并不多,75%几乎都是按钮. 帝国里面按钮全部都是用<a>来定义的(其实我很奇怪为什么要这样), 实在是有需要的就如Tree这样的组件, 但凡是框架都会有各种各样的选择,这个自己写,还是用别人的都是可行的.如果对组件不是很熟悉,其实工作量感觉差不了多少. flash对于组件的要求就要高很多了.自带的组件一般都是不能忍的.除非你用的是flex framework. Aswing是个不错的选择,组件丰富齐全,能够极大的节省开发时间.但是需要一些学习成本, 不是每一个人都用过Aswing并且很熟悉的. 自己写也不错,实际上,天书航海都是自己写, 可控性只是一方面,甚至我觉得是很小的一方面,在游戏里自己写组件最大的好处在于精简. 前面也说了,游戏里面用到的组件其实并没有多少.有的组件等游戏倒闭了都没出场机会,一辈子做板凳. 这里还是要说一句迷惑大家却又是正确的话: 用什么不用什么,自己写还是使用开源的,都取决于项目本身,根据实际情况而定.

最后嘛说个标准和体验. 标准就只针对帝国了. 有时候真的很不想打开那些个恶心的,看了让人头昏眼花的代码. 都不用验证我就能知道红的肯定是一大片. 上次忘记是谁说的要到手机上试试. 当时心里就想, 你耍吧, 我还想让自己手机的寿命更长一些. 现在也不能追究但是页面为什么会写成这样,css为什么让我修改得这么痛心疾首.  在可能的情况下 能标准一点还是标准一点吧. 如果突然有一天说要支持无线平台,你也许会觉得手机这玩意真是该死,谁发明来着的.

体验就是我们常说常听到人们说的用户体验.这里我就不瞎叽歪什么可用性,自我解释这些东西了.我觉得一款游戏,特别是一款webgame, 流畅是体验的重中之重. 这不仅仅是你页面或是flash加载的速度, 你的代码效率有多高. 是让玩家能顺利的玩下去. 如果让玩家出现 "我现在应该干什么"这样的问题那就不好了.我们应该有个,是应该让玩家有个阶段性的目标,他们为了达到这样的目标才会在游戏里面投入时间投入精力. 任务是个非常好的idea. 就和wow一样,任务能让玩家完成短期的目标,然后到一个新的目标. 问题就在于如何把这个目标清晰的明确的传达给玩家.

好了,先到这里吧. 封闭回来还是没有缓过劲. 写着写着感觉还有遗漏,再补,再补.

2009十月28

提高网站性能2

 和页面里的javascript正好相反. CSS也就是所谓的样式表需要放在顶部..呃,当然我指的是 head里面这个顶部了. 会更加好一些. 至少是在IE里面, 就算浏览器获得了所有显示需要的组件, 它依旧会等待样式表完全下载完成之后再显示. 把这个样式放在什么地方对下载的速度来说并没什么影响,但是会对页面的呈现有影响.

浏览器为什么要这样做David Hyatt做过一个解释,大致上是说, 如果样式表没有加载完成,那么显示Dom对象其实就是一种浪费. 你可以想象一下本来是个默认的颜色,结果加载到一半的时候变成红色,然后加载结束后却又因为别的规则变成蓝色的情况, 那就应该明白了.

那为什么不和javascript一样放在底部呢. 这个Dom树啊,是可以一边加载一边显示的. 就如上面所说, 浏览器会等样式表都加载完之后再显示页面. 如果放在底部恰巧页面有点大. 那用户将会在一个白屏的状态下等待很长时间. 这是一种不好的用户体验. 这样做虽然不能加快下载的速度或是什么,但至少让用户觉得没有死机,这个网站还是在运作的.

最后注意@import也会出现类似白屏的问题, 即使它存在于head中.

2009十月25

提高网站性能1

页面中组件的数量可以说是影响响应速度一个至关重要的因素.在没有缓存时,每一个组件都会产生一个http请求(其实即使有缓存ms也会产生,看的时候得到的是一个304的回馈).那为什么请求会影响到响应到响应的速度呢?难道是请求阻塞了,浏览器就不能一口气都下载下来吗?

本来我懒得去理会这样的问题,遗憾的是我还是顺手搜索了下. 这一扯就是http规范了. 该规范建议浏览器从每个主机名并行下载两个组件.当然这个是可以对浏览器设置的.不过脚本就不一样了,就算是从不同的主机,也只能一个一个下载.

所以基本上最差的情况就是将脚本全部放在顶部,最理想的情况当然就是脚本在文档的末尾.这样虽然可能加载整个页面的时间变长,但是对页面的影响也降到了最低.说白了就是进入页面的时候不是白屏的,让用户感觉是死机.哈哈哈.其实本来也就要Dom全部可控了之后才运行javascript的说. jquery,yui都有这样专门的事件.

现在好多事情都是未知数,写写画画浪费这晚上的时间. 夜色如此,却无人共赏,对影酌酒亦是不能, 哎, 不看也罢.