DreamFairy正在把前年的 苍白的茧大冒险 移植到starling上.
之前的游戏在这里 点我进入
一些一般性常识就不提了,直接记录我遇到的问题
1.创建starling后, 要么设置 starling.start() 要么在 某个render中调用 starling.nextfame(); 否则所有的监听都会失效. 比如 Event.TRIGGERED
2.创建一个MovieClip后 必须使用 Starling.juggler.add 加载后,才会播放帧. 移除MovieClip 后从 juggler移除,然后执行dispose ,它的事件会自动移除
3.在用之前的洛克素材创建MovieClip的时候,发现每帧会出现拉伸和模糊. 原因是 MovieClip会根据其第一个Texture来设置其宽高, 而洛克的素材原本就是矢量的逐帧动画,每帧宽高不一样,导致部分帧被拉伸.
要解决模糊问题, 直接调用 Texture.fromBitmapData(bmd,false); 第二个参数设置为 false即可.
要解决拉伸问题. 我试过几种方法.
1) 遍历洛克的所有帧,取出最大宽和最大高,然后创建一个空的Texture插入 Texture数组. 待创建MovieClip后 将其移除. 结果画面仍然被拉伸, 虽然还没去看源码,但我估计是 MovieClip设置宽高依据的不是第一个 Texture的width 和 height 而是 colorBounds ,因此第一个空的Texuture因为没有任何像素而导致宽高失效.
2) 试着使用TexturePacker 但是这货要导出一张位图和一张xml配置表.这样导致项目的复杂度又高了…(其实是DreamFairy很懒,不舍得写混合loader,连greensock的queueloader都不舍得用, 更别说写一个 xml+png 打包成一个文件的 打包工具了)
3) 于是考虑着既然游戏的体积不大,就适当的浪费一下性能吧.
代码如下:
[cc lang=”actionscript” nowrap=”false”]
private function createIdelTexture() : void
{
var cls : Class = getDefinitionByName(“stand”) as Class;
var standMovie : flash.display.MovieClip = new cls();
var textureList : Vector.
var bmd : BitmapData;
var maxWidth : Number = 0;
var maxHeight : Number = 0;
for(var i : int = 0; i <= standMovie.totalFrames; i++)
{
standMovie.gotoAndStop(i);
if(standMovie.width > maxWidth) maxWidth = standMovie.width;
if(standMovie.height > maxHeight) maxHeight = standMovie.height;
}
for(var j : int = 0; j <= standMovie.totalFrames; j++)
{
standMovie.gotoAndStop(j);
bmd = new BitmapData(maxWidth, maxHeight, true, 0);
bmd.draw(standMovie);
textureList.push(Texture.fromBitmapData(bmd,false));
}
m_idelMovie = new starling.display.MovieClip(textureList);
m_idelMovie.pivotX = m_idelMovie.width >> 1;
m_idelMovie.pivotY = m_idelMovie.height;
}
[/cc]
非常笨的方式,先循环一次,计算出最大宽高.
再循环一次,创建全部等大且为最大宽高的BitmapData.然后构建成Texture
最后设置中心点为洛克的脚下中央…
by the way… stage3d的 实时阴影部分的源码,很多大神明明写出来了,却不公开源码. 我懂得,这是潜规则. It’s ok 我也已经研究出来flare3d 创建实时投影的办法,虽然在我看来我的实现方式比较笨. 嘛嘛~既然是潜规则,你们不公开,那我也不公开.