假期实在没事做,参加了b站的第二届弹幕大赛玩玩,就做了个围住刀哥(这个审核不让过,就改名成ChatNoir了,连接)。
这个游戏的逻辑很快就写好了,然后UI花了我几天时间。总之还是花了不少时间的,而且碰到了不少坑(未在文档里提及),下面先谈谈这些坑。

###坑
首先我想吐槽的是b站提供的文档实在是糟糕,很多重要的api提都没提过,要自己去查ActionScript的api文档。
还有虽然说是ECMAScript的标准,但有些地方却还是没有完美实现,比如结尾的分号省略会报错,函数的优先级问题等。
下面说几点具体的:

  • interval的第一个参数的函数内部不能声明变量,如果有声明变量的行为会没有任何提示的停止执行下去。
  • 函数只能在声明后调用,而ECMAScript中对于函数声明会提前的。
  • 数字数组的返回值不是数字类型。这样就有一个问题,数组下标不能嵌套,如a[b[0]]这里由于b[0]是字符串,返回的就是一个undefined了,如果要嵌套得a[parseInt(b[0])]这样。
  • CommentField修改属性时,fontsize要放在textColor之前,不然后者会失效。这里的理由我也不清楚。

###其他的建议和问题

  1. ==元素的优先级==: 虽然在文档里没提到,这里面还是有绘制层次和优先级的。一般来说元素按添加进parent的顺序进行绘制,如果创建的时候没有带这个参数,那么父元素就是$.root,想修改绘制顺序可以调用父元素的setChildIndex(obj, index)进行修改。

  2. ==绘图层次==: 利用好Canvas元素来将你的视图分层,每块区域都最好以同一个Canvas为父元素,由于元素的位置是相对于父元素定义的,这样在进行一些动画的时候就会方便很多。

  3. ==鼠标的点击事件==: 我只发现Button这一个元素能响应鼠标的点击事件。如果要在你的弹幕中响应的话,可以在可能点击的区域放置一个透明的Button。还有另一种方法是使你想要响应点击事件的元素继承于Button,这种方法有一个好处:只有鼠标在该元素内部点击才响应,可以配合Shape进行一些复杂区域的响应判定而不用自己判断区域;当然有一个坏处:继承的元素同样会继承Button的阴影动画,这个我不知道怎么去掉,不过你背景是黑色的话这个不碍事。

  4. ==得到鼠标位置==:这个不需要响应事件,每个元素都有mouseX和mouseY属性,这两个属性代表了鼠标当前相对于该元素的位置。

  5. ==加载图片==:想要在弹幕里显示图片有两种方法,一个是矢量表示,一个是位图表示。有人写过将图片矢量化的工具,想显示分辨率比较高的图片这种方法比较合适。另一种就是将每个像素值放到代码里,利用BitmapDataBitmap来显示,这种方法如果有as的开发环境就十分简单了,只要调用已有的api将图片的bytearray进行BASE64编码,将结果放到代码里,使用的时候解码调用setPixels就行了,或者直接将每个像素值放到一个数组里再到代码里利用setPixel一个个设置,后者应该会慢很多吧。

###自己的一些看法
高级弹幕的api还不是很完善,很多地方用的都是ActionScript里的东西,没有封装好。这样对于html5的播放器来说不是个好消息,如果有谁能完善这方面的话就好了。