zero斌斌 2008-6-17 21:38
flash灵异事件
工作了没时间上来玩了,发现一些灵异现象,多数是关于时间轴的,给大家帮忙看看吧.
[color=blue]1.奇怪的不能跳帧事件[/color]
这个好像是flash cs3的bug,我在公司用正版测试出现同样的问题,如果adobe出过补丁了就当我火星人略过吧...
1.新建一fla,as2或as3无所谓
2.导入两张图片分别放在主场景的第一帧和第二帧里
3.在第一帧上写[code]gotoAndStop(2)[/code],导出,就出问题了:动画并没跳过去!
4.把其中一幅图片删掉或换成纯色的矩形就没事了!
[color=blue]2.动画第一帧不执行[/color]
这个勉强解决了,貌似是因为我用2.0的思维去做3.0造成的
1.新建一fla,as3
2.建个元件叫A,链接类名A,建三个关键帧,画不画东西无所谓,第1帧上写[code]trace(1)[/code] ,第2帧上写[code]trace(2)[/code] ,第3帧上写[code]trace(3);stop();[/code] 3.建个按钮元件,放到主场景上,加上点击事件,实现一按按钮就把A加载到主场景中的效果:
[code] btn.addEventListener(MouseEvent.CLICK,addA);
function addA(event:Event){
this.addChild(new A());
}[/code]
4.导出测试,点击按钮,和想像中的一样,trace出1 2 3来,一切正常
5.建个元件叫A_Container(就是A的容器的意思,英语比我好的略过),链接类名A_Container,把A拖到里面
6.把上面的
[code]this.addChild(new A());[/code]
改成:
[code] this.addChild(new A_Container());[/code]
7.导出测试,点击按钮,出问题了,只trace出2 3来,少了1
8.把代码改成不是一点击按钮就马上加载而是延迟一帧加载的:
[code] btn.addEventListener(MouseEvent.CLICK,addADelay);
function addADelay(event:Event){
stage.addEventListener(Event.ENTER_FRAME,addA);
}
function addA(event:Event){
this.addChild(new A_Container());
stage.removeEventListener(Event.ENTER_FRAME,addA);
}[/code]
9.导出测试,点击按钮,trace出1 2 3来,一切正常
结果就是我以后都不敢一点击按钮就马上干什么事情了,都是延迟一帧干...
[color=blue]3.跨帧问题[/color]
这个我一直想不明白是什么原因造成的,只能说在编程时尽量避免...
1.新建一fla,as3
2.建两个元件,叫Sp1,Sp2,链接类名和名字一样
3.建两个类,就是上面那俩家伙,构造里只要trace能区分出两者的东西就可以
[code]package{
import flash.display.Sprite;
public class Sp1 extends Sprite{
public function Sp1(){
trace("Sp1初始化");
}
}
}[/code] [code]package{
import flash.display.Sprite;
public class Sp2 extends Sprite{
public function Sp2(){
trace("Sp2初始化");
}
}
}[/code] 4.新建一元件叫mc,建三个关键帧,第1帧写[code]gotoAndStop(3)[/code]第2帧放个Sp1,第3帧放个Sp2 把mc拖到主场景里
5.导出测试,和想像中的一样,trace出"Sp2初始化"来,一切正常
6.新建一个元件叫"来捣乱的",mc里原来的层上面新建一个图层,拖个"来捣乱的"进去,随便起个实例名
7.导出测试,傻眼了,trace出"Sp1初始化","Sp2初始化"来
8.把"来捣乱的"的实例名去掉,就正常了
9.双击"来捣乱的",在帧上随便写个能让外界直接访问到它的办法,例如:[code](root as MovieClip).xxx=this;[/code]就又出现7的情况了
10.初步得出结论:只要不给放上去的"来捣乱的"起名字,或者是任何可以用[code]getChildAt()[/code]之外的办法访问到这个"来捣乱的"的就没事
11.把起了实例名的"来捣乱的"移到最底层,也没事
这个在做简单的游戏还好避免,稍微复杂些的东西就经常因为这个莫名其妙的出一些问题
[color=blue]4.构造中把自己从显示列表中移除引起的问题[/color]
这个也比较奇怪,好在我不常这样写
1.新建一fla,as3
2.直接拷上面建好的Sp1和Sp2来用就成了,连类文件一起拷
3.在主场景上建两层,第一层放个Sp1,第二层放个Sp2
4.导出测试,和想像中的一样,trace出"Sp1初始化","Sp2初始化"来,一切正常
5.在Sp2的构造里加个[code]this.parent.removeChild(this);[/code]也就是说变成了这样:
[code] package{
import flash.display.Sprite;
public class Sp2 extends Sprite{
public function Sp2(){
trace("Sp2初始化");
this.parent.removeChild(this);
}
}
}[/code]
6.导出测试,再次傻眼了,只trace出"Sp2初始化"来,也就是Sp1没有正常初始化
源文件在附件里,大家一起研究哦~
ps:北京的妞好难泡啊,8月份回老家泡去
终极讨厌 2008-6-17 21:47
好长啊,哈哈
最后一句,我看清楚了
ps:北京的妞好难泡啊,8月份回老家泡去:lol
china-cell 2008-6-18 08:30
这个好像不对吧:
btn.addEventListener(MouseEvent.CLICK,addA);
function addA(event:Event){
this.addChild(new A());
}
应该是:function addA(event:MouseEvent) {
zero斌斌 2008-6-18 09:07
这个...主要是下面有个 stage.addEventListener(Event.ENTER_FRAME,addA);
嘿嘿,是想改动尽量的小,MouseEvent继承的Event,所以没事
kingofkofs 2008-6-18 22:53
跟我这个现象有少许相像
[url]http://space.flash8.net/bbs/thread-354321-1-1.html[/url]
就是不能在第一帧写GOTOANDPLAY:b45
beijing1995xz 2008-6-28 17:18
厉害!
xuyali1986 2008-8-6 10:47
一个一个的都是高手.郁闷
jubupx2006 2008-8-6 14:01
说一句吧
文档加载是要时间的,从第一帧加载到最后一帧
请等文档加载完成,再做操作,谢谢!