加载外部swf文件到空影片剪辑“定位”的万全之策
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
加载外部swf文件到空影片剪辑“定位”的万全之策本文为作者原创,转载请注明出处!
说明:
A、“index.swf”的大小是800*600。
场景中心有个蓝色的米字。
截图如下:
B、
用来测试的“被加载的swf.swf”的大小是550*400,场景设计截图如下:
近日想做个模板,将课件中各个环节的内容做成单独的swf文件,通过导航菜单加载到主场景,这样可以避免导入到flash中的资源过多时,做好的课件导出时死机的
但在载入时遇到了两个问题:
1、用代码定位出错;
2、被加载的动画场景外的元件出现在index.swf场景中分别截图如下:
居中定位出错:
被加载的动画场景外的元件出现在index.swf场景中:
为了解决问题我进行了艰难的探索,首先去百度上去搜,然后在flash技术群中请教高手,有幸遇到了网友“蚕子”,是一位教师同行,研究问题思路开阔,在他的帮助下,我开阔了思路,解决了问题。
下面把我的探索过程,介绍一下,让我们一起体会探索的乐趣,分享成功的快乐。
第一部分“我走过的弯路”,没有耐心的同学可以跳过,直接看第二部分“分享成功的喜悦”。
一、我走过的弯路
一开始,我使用如下方法进行定位。
1、思路:A、自定义一个名为“定位”的函数。
当swf文件加载完成时调用它。
为了准确定位,在“定位”函数内部加了判断:当影片的宽度不是零时,才开始获取影片数据,进行定位。
2、具体代码如下:
//====定位函数======
function 定位(_mc:MovieClip) {
trace("“定位函数”已经运行");
onEnterFrame = function () {
if (_mc._width != 0) {
_mc._yscale = 100;
_mc._xscale = 100;
trace("加载后影片宽度:"+_mc._width);
trace("加载后影片高度:"+_mc._height);
_mc._x = Stage.width/2-_mc._width/2;
_mc._y = Stage. height /2-_mc._ height /2
//对动画场景进行居中定位;
trace("定位后的影片x坐标是:"+_mc._x);
trace("定位后的影片y坐标是:"+_mc._y);
delete onEnterFrame;
}
};
}
//利用加载类加载外部swf文件到空影片剪辑,并判断载入事件,调用“定位”函数。
var myMCL = new MovieClipLoader();
myMCL.onLoadComplete = function(targetMC) {
//文件全部载入,调用定位函数,对影片进行居中定位;
};
myMCL.loadClip("梁祝.swf", "_root.kong_mc");
//将动画“梁祝.swf”,加载到场景中的空影片剪辑_root.kong_mc;
为了查找问题所在,我设计了如上所述的“index.swf和被加载的swf.swf”,进行加载测试,被加载的动画没有正确定位:
输出面板:
“定位函数”已经运行
加载后影片宽度:663
加载后影片高度:483
定位后的影片x坐标是:68.5
定位后的影片y坐标是:58.5
截图如下:
从输出模板中的信息可以看出:代码获取的不是被加载的swf文件的场景宽度和高度,在计算影片宽度和高度时,把“加载的swf文件的场景外的元件”也计算在内。
我想既然宽度和高度多算了,在定位时考虑在内,减去就是了。
但接下来,我就悲哀地发现这是一个无法解决的问题,因为我们不知道场景跟外部元件之间的位置关系。
但总得试试吧,报着死马当活马医的态度,我设计了三种情况:
a:场景位于整个影片的中心;
b:场景位于整个影片的右下角;
c:场景位于整个影片的左上角;
为了便于观察,我在index.swf场景中画了两条定位虚线:
定位成功被加载的swf场景的左上角应该位于:
x:800/2-550/2=125;
y:600/2-400/2=100;
如果定位成功,被加载的swf文件场景的左上角应该与这两条虚线对齐。
上述三种情况加载结果如下:
输出面板中的信息相同都是:
“定位函数”已经运行
加载后影片宽度:663
加载后影片高度:483
定位后的影片y坐标是:58.5
a:场景位于整个影片的中心;定位截图:
b:场景位于整个影片的右下角;
c:场景位于整个影片的左上角;
比较上述三个截图,你会发现,无论场景与外面的元件的位置关系如何,定位代码执行后,代表“被加载swf文件场景边界的蓝色矩形”的位置是一样的。
这时我惊喜地发现,代码在计算空影片剪辑的宽度和高度时虽然将超出场景的元件计算在内,但在定位载入影片后的空影片剪辑时,是以“被载入的swf文件场景”的左上角为基点的。
在与网友“蚕子”交流中,他提到可以用软件获取swf文件诸如版本、场景宽度、场景高度等等信息。
我如获至宝,再次感谢,蚕子网友的分享。
于是,峰回路转,柳暗花明,让我们一起分享成功的快乐。
二、分享成功的喜悦
问题1的解决思路:利用软件获取要载入的swf文件场景的宽度和高度等信息,存入数组,自定义“定位”函数和“加载”函数,通过给函数传递参数,载入动画。
问题2的解决思路:在空影片剪辑所在的层上新建一层,该层重命名为“载入动画的遮罩”;在该层上放置一个空影片剪辑,实例名为:dhmask_mc。
用代码在其内部画一个跟载入的动画一样大小的矩形,“mc.setMask(_root.dhmask_mc);”载入的动画以此矩形为遮罩。
B、具体代码如下:
var myjz:Array = [["梁祝.swf", "500", "250"], ["被加载的swf.swf", "550", "400"], ["吉祥三宝.swf", "550", "400"]];
//将被加载的swf文件的有关信息,存入数组;
/*画矩形函数,函数接受三个个参数:
my_mc告诉函数在哪个影片剪辑内画矩形;
w:要画的矩形的宽度;
h:要画的矩形的高度;
function drawwh(my_mc:MovieClip , w:Number, h:Number) {
//下面的代码画矩形
with (my_mc) {
beginFill(0xFFFFFF, 100);
lineStyle(1, 0xffffff, 100);
moveTo(0, 0);
lineTo(w, 0);
lineTo(w, h);
lineTo(0, h);
lineTo(0, 0);
endFill();
}
/*========定位函数,它接受四个参数:
_mc被定位的影片剪辑;
dhsuoyin_num:被加载的动画在数组中的索引值,用来读取动画的场景宽度和高度
xscale_num:x缩放值;
yscale_num:y缩放值。
*/
function 定位(_mc:MovieClip, dhsuoyin_num:Number, xscale_num:Number, yscale_num:Number) {
trace("“定位函数”已经运行");
onEnterFrame = function () {
if (_mc._width != 0) {
_mc._yscale = xscale_num;
_mc._xscale = xscale_num;
//先执行缩放值,将影片剪辑的宽度和高度确定下来,非常重要,否则宽度一有数据,代码就执行,也会造成定位出错。
trace("加载后影片宽度:"+_mc._width);
trace("加载后影片高度:"+_mc._height);
var chjw = myjz[dhsuoyin_num][1];
//从数组中读取动画的场景宽度;
trace("被加载影片场景宽度:"+chjw);
var chjh = myjz[dhsuoyin_num][2];
//从数组中读取动画的场景高度
trace("被加载影片场景高度:"+chjh);
_mc._x = 400-chjw*xscale_num/200;
//对动画场景进行横向居中定位;
_mc._y = 300-chjh*yscale_num/200;
//对动画场景进行垂直居中定位;
drawwh(_root.dhmask_mc, chjw*xscale_num/100, chjh*yscale_num/100);
_root.dhmask_mc._x = _mc._x;
_root.dhmask_mc._y = _mc._y;
_mc.setMask(_root.dhmask_mc);
/*以上四行代码是在空影片剪辑dhmask中画一个跟载入的动画场景一样大的矩形,并将其位置设置为跟载入的动画重合,载入的动画以后的空影片剪辑以它为遮罩;*/
trace("定位后的影片x坐标是:"+_mc._x);
trace("定位后的影片y坐标是:"+_mc._y);
delete onEnterFrame;
}
};
}
/*===加载外部swf到空影片剪辑的函数,接受三个参数:
dhsuoyin_num 用来读取数组中被加载动画的相对路径;
xscale_num:x缩放值;
yscale_num:y缩放值。
*/
function jiazai_swf(dhsuoyin_num:Number, xscale_num:Number, yscale_num:Number) {
//设置缩放的默认值;
if (xscale_num == undefined and yscale_num == undefined) {
xscale_num = yscale_num=100;
trace("您没有设置缩放值,程序执行默认值");
trace("xscale_num = yscale_num="+xscale_num);
} else {
trace("您设置的缩放值分别是:xscale_num ="+xscale_num+";yscale_num="+yscale_num);
}
var myMCL = new MovieClipLoader();
myMCL.onLoadInit= function(targetMC) {
/*在此事件触发后,空的影片剪辑才会在场景中初始化;若用事件onLoadComplete
触发定位会出现问题,你可以试试在onLoadComplete中trace空影片剪辑的宽度和高度都是0。
*/
targetMC._xscale = xscale_num;
targetMC._yscale = yscale_num;
trace(targetMC._width);
trace(targetMC._height);
trace("加载的动画是:"+myjz[dhsuoyin_num][0]);
//设置空影片剪辑的位置和缩放值;
定位(targetMC, dhsuoyin_num, xscale_num, yscale_num);
};
myMCL.loadClip(myjz[dhsuoyin_num][0], "_root.kong_mc");
//给加载类添加加载对象和加载目标
}
jiazai_swf(0, 100, 100);
测试如下:
1、加载“梁祝.swf”
a:载入成功,没有播放时;
b:载入成功,播放时
三、问题2成因分析
为什么会出现这样的问题呢?
早期的作品为了使处于场景外的元件不可见,常常采用在场景外画一个较大的黑色块进行遮盖的方法,其实在场景中所有层的最上层设置一个跟场景一样大小的遮罩层就可以避免作品被载入时出现这个问题。
如下有一个网友更成功的解决方案,分享给大家。
//获取目前可用层深;
var cengshen = _root.getNextHighestDepth();
//建立一个空mc在根上
_root.createEmptyMovieClip("mask", cengshen);
/*画矩形函数,函数接受三个个参数:
my_mc告诉函数在哪个影片剪辑内画矩形;
w:要画的矩形的宽度;
h:要画的矩形的高度;
*/
function drawwh(my_mc:MovieClip , w:Number, h:Number) { //下面的代码画矩形
with (my_mc) {
beginFill(0xFFFFFF, 100);
lineStyle(1, 0xffffff, 100);
moveTo(0, 0);
lineTo(w, 0);
lineTo(w, h);
lineTo(0, h);
lineTo(0, 0);
endFill();
}
}
var w= Stage.width;
var h= Stage. height;
trace("场景宽度是:"+w);
trace("场景高度是:"+h);
drawwh(_root.mask, w, h);
_root.setMask("mask");
//在场景的最上层,把整个动画用与场景一样大的矩形遮罩
技术总结:
加载外部swf文件到场景中的空影片剪辑时,代码定位不能以获取的影片宽度和高度数据进行定位,因为一旦被加载的外部动画场景外有元件,就会导致定位出错。
最理想的定位方法是:在加载之前利用软件,获取要加载的动画的场景宽度和高度,这样定位万无一失。