打印

[AS1&2] 关于Mouse的onMouseDown事件

有2个swf文件swf1跟swf2,swf1里边有个按钮时加载swf2的,
swf1的代码如下:
btn.onRelease=function(){
       mc.loadMovie("swf2.swf");
       }
swf2的代码是
var mouseListener:Object = new Object();
mouseListener.onMouseDown= function() {
       trace("1111111111111");
};
Mouse.addListener(mouseListener);
想要时间的效果是在swf1里加载swf2.swf后每次按下鼠标就trace 1111111111111,但是有个问题
如果多次点击(假设是N次)btn加载swf2.swf的话,swf1里边按一次鼠标会trace出来N个1111111111111;
求助,怎么解决这个问题?
高手都去吃饭了……
关注下这个问题
我想你是想加载是想加载swf2后只要按下鼠标就输出一次
为什么不直接将
var mouseListener:Object = new Object();
mouseListener.onMouseDown= function() {
       trace("1111111111111");
};
Mouse.addListener(mouseListener);
写在swf1中呢
那么你就能够达到这样的结果

不过你说的现象真的很奇怪,是不是as2的漏洞
提供各种图书资料、需要的话可以联系本人!

TOP

一登陆就看到这个东西
确实很怪,我试过remove再重载,结果一样

TOP

其实要加载的swf2是独立的一个swf文件,里边有很多东西,而swf1是加载用的容器,所以写在一起不太好。

昨天在网上搜来搜去,找不到解决这个问题的办法……
继续关注

TOP

复制内容到剪贴板
代码:
btn.onRelease = function() {
    if (mc._height>0) {
        mc.unloadMovie("2.swf");
        trace(_root.mc.mouseListener);
        Mouse.removeListener(mc.mouseListener);
    } else {
        mc.loadMovie("2.swf");
    }
};
将那个容器的代码改为这样的

建议看看这个说明:
复制内容到剪贴板
代码:
合理地管理事件。在调用侦听器之前,通过使用条件来检查侦听器是否存在(不为 null),从而保持事件侦听器数组的紧凑性。通过调用 clearInterval 来清除任何活动间隔,并通过调用 removeListener 来删除任何活动侦听器之后,再使用 unloadapplication 或 removeapplicationClip 删除内容。在卸载影片剪辑时,如果任何 ActionScript 函数仍引用 SWF 数据,则 Flash 不会回收 SWF 数据内存(例如,从间隔和侦听器回收)。
当不再需要变量时,请将其删除或将其设置为 null,这会对其进行标记以便进行垃圾回收。由于删除变量的操作可从 SWF 文件中删除不需要的资源,因而有助于在运行时优化内存使用。删除变量比将变量设置为 null 更好。
在进行垃圾回收之前,可通过调用 removeListener 从对象中显式删除侦听器。
之前有朋友说了,删除了影片还是会这样,是因为鼠标还在帧听那个Object:mouseListener,所以并没有把所删除的这个mouseListener清除,而没调用一次,都var mouseListener了一个Object出来,所以看到“11111111”这个也就越来越多。

开始我也想到了是内存中这个mouseListener变量搞得鬼,手动delete mouseListener,也是没有作用的,后来查看了资料,说如果还有AS引用这个变量的话,虽然可以删除,但是还是可以应用的到:
复制内容到剪贴板
代码:
btn.onRelease = function() {
    if (mc._height>0) {
        mc.unloadMovie("2.swf");
        delete _root.mc.mouseListener
        trace("1:"+_root.mc.mouseListener);// trace为1:undefined
    } else {
        mc.loadMovie("2.swf");
    }
};
//但是如果点击鼠标的话,还是会显示多个11111
所以只能通过removeListener来实现,当removeListener完后,没有AS引用这个mouseListener这个Object的话,flash就会清楚这个变量

对于这种问题,大家应该看看flash垃圾回收方面的资料~

TOP

原来如此

TOP

btn.onRelease = function() {
    if (mc._height>0) {
        mc.unloadMovie("2.swf");
        trace(_root.mc.mouseListener);
        Mouse.removeListener(mc.mouseListener);
    } else {
        mc.loadMovie("2.swf");
    }
};
多谢libins兄哈,以后得多看看这方面的资料才是

TOP

对了,每次加载swf2,在swf2里都会var一个变量mouseListener,如果没有removeListener(mc.mouseListener)会产生多个mouseListener,
这问题就出现了,一个flash里头可以存在多个名为mouseListener的Object?

TOP

这个就属于内存的处理范围了,AS2的话按理说应该可以无限的,貌似内存存储变量是可以按mouseListener*N这种方式来的(忘记在哪看了,不确定)。

LZ去我博客,看下AS3的垃圾回收:
http://hi.baidu.com/nscartoon/bl ... 29cedaa9ec9a52.html

TOP

真是奇怪
我在swf2中设置变量
发现一个奇怪的现象
刚好单击一次,变量增加一
然后输出也比上次单击多一条数吃
第一次输出 就输出1条
第二次单击 就输出2条
第三次单击 就输出3条
.
.
.

第N次单击 就输出N条


看来flash莫名其妙的东西还真多呀
提供各种图书资料、需要的话可以联系本人!

TOP

研究下

TOP

引用:
原帖由 libins 于 2008-9-19 17:40 发表
这个就属于内存的处理范围了,AS2的话按理说应该可以无限的,貌似内存存储变量是可以按mouseListener*N这种方式来的(忘记在哪看了,不确定)。

LZ去我博客,看下AS3的垃圾回收:
http://hi.baidu.com/nscartoon/b ...
呵呵 多谢分享 学习中

TOP