今天的项目又用到了Gaia,只不过这次用AS2.不是AS3.
去年上一次的见此。
《Flash之gaia专栏——又见Gaia 项目中用到的方法汇总》。
1 goto的值是XML的id.
2 不用复制以前的FD模板,Gaia会自动生成,用了反而混淆
3 不要用自定义的滚动条,会出现>>INTERRUPTIN<<的经典错误. 为什么呢?我推测是这样的:
1) 自定义滚动条在根上创建了空mc,作为onEnterFrame的载体
2) 这个mc和tweenMax类在根上创建的空mc相冲突,可能是覆盖.
3) 导致单独页面的onTransitionOut函数无法执行,无法调用完成事件.
比如活动页面要按步骤,1-2-3,不能直接跳到3,就要在拦截事件中判断。判断的方法可能很多,我想的很简单,就是判断上一个branch是不是,比如3之前是不是2,2之前是不是1.
if (now = step2) { if (old=step1) { 跳到2(); }else { 退回1(); } } if (now = step3) { if (old=step2) { 跳到3(); }else { 退回1(); } }
应该用哪个拦截事件呢?试了下,感觉onBeforeTransitionOut和onBeforeTransitionIn区别不大。
关键代码如下:
var myListener:Function = Delegate.create(this, onBeforeTransitionOut); //加拦截事件 releaseGaia = Gaia.api.beforeTransitionOut(myListener, true); //回调事件 function onBeforeTransitionOut(event:GaiaEvent) { var nowbranch = event.validBranch; trace("nowbranch/////"+nowbranch); if (nowbranch == "index/nav/action/step2") {//目标分支 if ( LASTbranch == "index/nav/action/step1" && 1==Main.step[1]) {//判断旧分支是不是上一个 LASTbranch = event.validBranch; //记录分支 releaseGaia();//跳到Step2 }else { LASTbranch = "index/nav/action";//记录分支 Gaia.api.goto("index/nav/action");//退回Step1 } return; } LASTbranch = event.validBranch; //记录分支 releaseGaia();//该去哪去哪 }
上一次是把bg.swf作为assets放到index,控制代码在。在FDT搜索assets['bg'],找到。
要等到加载完成后,再播放。
报错
branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 branch-----------------------index/nav/action/step1 在一个动作列表中,递归超过了 256 级。 这可能是一个无限循环。 已禁止在此影片中继续执行动作。
asset可以加载swf也可以是xml。
像动画师做的东西就可以单独拿出来作为asset,这样,动画模块就和代码分离了。
<page id="index" title="Single Page Gaia" src="index.swf" depth="middle" seo="true"> <asset id="MyPreloader" src="MyPreloader.swf" /> <asset id="bg" src="swf/assets/bg.swf" />
在Page类文件加代码,文件既能单独打开看,又能在整体的时候,使用框架统一的淡入淡出。
//在构造器中 if (this._parent != undefined) { _alpha = 0; }else { my_init(); } //在transitionIn中 if (this._parent != undefined) { my_init(); }
bg是一张很长的背景图片,类似横幅长卷《清明上河图》,连接6个场景。
每当要切换场景的时候,要先判断子影片是否加载完成,加载完成,让bg缓动到相应的x位置。
gaia里注册的拦截事件是afterTransitionOut:
releaseGaia = Gaia.api.afterTransitionOut(onAfterTransitionOut, true);
在onAfterTransitionOut事件中,通过判断分支,如果是指定的场景,就让bg缓动到相应的x位置。并在onComplete完成事件中,使子影片淡入。
function onAfterTransitionOut(event:GaiaEvent):void { var branch:String = Gaia.api.getCurrentBranch(); if(是指定的场景){ TweenLite.to(bg, 1, { x: -_posArr[id - 1], ease:Circ.easeInOut, onComplete:function():void { releaseGaia(); } } ); } }
上次经验不足,绕了个大圈子。
1)先用Flash导出BgImg.SWC
2)再写个BgAsset类实例化BgImg
3)再用BgAsset导出bg.swf.
4)最后这个swf作为assets放到indexPage下
5)最可恶的是控制bg的代码没有写在indexPage里面,而是写在mainContext.as。在FDT找了半天才找到线索。
var bg:IMovieClip = IMovieClip(Gaia.api.getPage("index").assets.bg);
要等到加载完成后,再播放。
onAfterTransitionOut事件中做缓动。
在site.xml的site节点加上属性 preloader="MyPreloader.swf"
并在index page节点加上 <asset id="MyPreloader" src="MyPreloader.swf"/>
以前的做法是
1)Flash把素材导出成LoadingBar.SWC.
2)把Gaia默认的Preloader.as复制成MyPreloader.as.
3)用FDT写MyPreloader.as,在transitionIn中实例化SWC的LoadingBar类,加到舞台,淡入缓动。
4)在onProgress中操作进度条和文本框。
5)上一次首页还有个进入按钮,Gaia是直接进入内页。此时,内页内容已经在舞台上,只能让他们不显示,如果是动画
,就停在第一帧。点按钮后,再让其显示,并播放动画。
if(event.perc==1){ //加载完成 btn.onRelease=function(){ 发送事件,显示内页。 } }
项目中像链接,后台路径都是不固定的,基本上不到最后一天,AE是给不到上线地址了。所以要给自己留条活路,不要在Flash里写死,要留出接口。我一般就在Gaia的site.xml里加自已的节点,就加在page节点之后。
<my nocache="no" alertJS="yes" > <BTsend_for_gift href="http://localhost/h/app/send_for_gift.aspx" nocache="yes" />
用下面的测试,xxx,yyy换成想要的内容
<a href="http://v.t.sina.com.cn/share/share.php?url=yyy&title=xxx" window="_blank">新浪</a> <br /> <a href="http://www.kaixin001.com/repaste/share.php?rurl=yyy&rcontent=yyy&rtitle=xxx" window="_blank" >开心</a> <br /> <a href="http://share.renren.com/share/buttonshare.do?link=yyy&title=xxx" window="_blank">人人网</a> <br /> <a href="http://www.douban.com/recommend/?url=yyy&title=xxx" window="_blank" >豆瓣</a>参考 js 几个网站的分享链接
http://blog.csdn.net/ypb137154098/article/details/6590515
在AS3中访问assets要加个判断,以免以后在xml删asset节点,flash报错。
if(this.assets.hasOwnProperty("AsearchBar")){ this.assets["AsearchBar"].visible = true; }AS2就不用这一步了。
参考
http://www.sqflash.com/Flashwenti/aswenti/2010-07-25/150.html
如何给动态类动态添加属性和方法【Flash AS3.0】