如何使用 Class 来扩展你的 MovieClip
时间:2007-06-13 来源:softwindow
你可能不信,但事实是这样子的。
如果你正在用这样的方法来构建组件或者你的强大的 MovieClip 。我仍然可以访问你的私有属性,或者将你的具有 String 特性的变量改为 Number 值。我可以向你的函数(无论是否将它设为私有)传递一个不是规定类型的参数而逃避过你的关于参数类型的强制定义检查。
这看起来更像是某些恶意的黑客在搞破坏。但请注意,现在正在遭受破坏的是你自已,而不是你在破坏别人(当然,你也可以这么做,现在没有人能阻止你)
如果你现在有兴趣,交且愿意接受这个事实,你不妨打开 Macromeida 自已的关于组件的 .as 源文件。查查 private 是否会被出现在里面。以及他们是否使用了私有的受保护的函数和方法。
但也不要因此而开始责备 Macromeida ,Macromeida 的战线开始拉得有点长。它可能在某种程度上欺骗了你。但更可能的是你对它的信任欺骗了你。Flash MX 2004 至少进步了。Player 7 提供了更快的运算速度;公开了更多的方法。具有了某些先进的设计思想(如 Java 类)和更像 OOP 的模型。某些可视化的编辑模式。。。
对于那些使用传统的方式的设计师而言,你并不需要经受像 ActionScript 程序员一样的茫然。毕竟经受洗礼的是他们。最舒服的办法就是将这一堆组合需求交给那些编写 ActionScript 的人去处理。而你可以泡一杯咖啡在旁边看着他们挠着头抉择是应该选择这样还是选择另一种方式。你大可将时间花在去深造你的设计理念和寻找灵感上面。而不必去管 Flash MX 2004。有空有兴趣的时候倒可以听听那些 ActionScript 有什么新功能发现以及从他们的观点来看这些功能能做些什么。这可能对你会有帮助。或者说它至少可以让你不丢弃某些难以实现的想法。
毕竟现在只有 Flash 让你可以将这么多的东西自由地组织在一起,并且和你的用户一起分享你的奇妙想法。
如果 Flash 最终能在这场互联网大潮获得胜利。作为设计师的你,是首要功臣。没有了有才华的设计师配合,Flash 几乎是一文不值。直到现在为止,Flash 仍然不适合建造一个大工程。(我都开始对我现在正进行的 Flash 工程有点沮丧)天生的限制使它速度没有JavaScript快。功能没有像Java那样的网络语言强。想想你有什么理由让你的用户去选择用一个运行缓慢、有着丑陋界面却功能不强的 Flash ?当然如果你能说服你的用户安装一台企业服务器,可能会让事情另有转机。
话可能有点多而且偏题了。 让我们回到 ActionScript 的立场。
可能我正在动摇你对 Flash 的信心。但懂得防范盲目也相当重要。避开这些可能的陷阱,也许可以让你将信心重新拾起来。
建一个 Class 文件:
class myTest extends MovieClip {
private var name:String = "zas";
function myTest() {
trace(this+"::");
}
}
在你的.fla中:
使用链接的方法将一个 MovieClip 指定为使用这个类(方法是将它设为链接,并在 AS2.0类中填上你的类地址);
现在将它拉到场景中,命名为 a 。接着开始你的测试。现在开始要注意你的测试方式和结果了。
在第一帧中写上:
trace(a.name);
a.name = 6;
trace(a.name);
现在睁大眼睛看看输出的结果:
_level0.a::
zas
6
第一行表明你的类的构造函数在起作作,它正确的输出了 this.也就是 a 的地址。
注意你的第二行, 在类中你将 name 设为私有:private var name:String = "zas",也就是说你不能在这个 MovieClip外访问它。但你在_root中的ActionScript却越过了这种限制成功访问了它。
接下去是更让你惊奇的事:你 _root 上的 ActionScript 成功了越过了私有的访问权限限制写了它,更进一步了,它成功的突破了类型限制将name由String改写为Number 6。
虽然它相当的成功,但这并不是什么好事。
现在看看你的a的私有属性成了什么?:trace(a.name),得到的结果是 6。
这是一个最简单的例子,如果你的兴趣可以试试对私有方法的访问和重写。或者其它试验。 这里 是刚才试验源文件和类的压缩包。
很抱歉,FK Swing 1.2 中以前对组件作的限制访问将全部崩溃。这让我头都有点大了。。可能我们会花些时间想想别的方案。我们将推迟 1.3 的方案完成日期。
在这里,作为一种对策, 我不反对你继续使用你的 Class 类扩展你的 MC 。但要在写代码的时候牢记一点:它们并不是真的在起作用。你应该时时紧记你现在的构想其实是一个幌子。至少现在不要将依赖于这些的重要部份交给它们。即使交给它们,你也应该时刻提醒自已:它相当的脆弱。
时刻这样想可能会让你有点神经质。但如果想要坚持梦想而又不想被现实打倒,也只有这个办法。作为另一种解决方案。至少减轻你的思想矛盾和痛苦。狠下心来将那些私有属性和方法都去掉那些关键字。就像在编辑onLoad事件一样,只不过你将代码移到了 .as 外部文件中。
或者干脆选择你更喜欢 Flash MX 的方式:直接写在 MovieClip 上,而放弃 Class。
但也别太灰心,Object 的方式可能会提供给你另一种方案:保持你的权限和安全。
但也要注意一点,即使你将这个类从 MovieClip 继承。它仍然不具备 MovieClip 的特性。这很重要。它让你少犯错误。你需要的只是以一种技巧来绕着实现它。
让我们来做一个简单的例子:
Class 文件:
class myTest extends MovieClip {
private var name:String = "zas";
static var num:Number = 6;
private var targetMovie:MovieClip;
function myTest(father:MovieClip) {
targetMovie = father;
trace(this+"::");
}
public function 画方形(width:Number):Void {
targetMovie.beta = "ert";
with (targetMovie) {
beginFill(0, 100);
moveTo(0, 0);
lineTo(width, 0);
lineTo(width, width);
lineTo(0, width);
lineTo(0, 0);
endFill();
}
}
}
.fla 文件:
在你的MC时间线中第一帧:
import moreTools;
var b:moreTools = new moreTools(this);
//trace(b.name);
//trace(b.targetMovie);
b.画方形(250);
第二帧:
试着将注释去掉,这时如果你试图访问私有属性,
trace(b.name);
trace(b.targetMovie);
将会得到编辑期错误:
**错误** 场景=场景 1, 图层=图层 1, 帧=1:第 3 行: 该成员为私有成员,无法访问。
trace(b.name);
**错误** 场景=场景 1, 图层=图层 1, 帧=1:第 4 行: 该成员为私有成员,无法访问。
trace(b.targetMovie);
现在你可以保证它的安全性了。
使用这种方法,你可以扩展你的_root,特别是当你需要以loadMovie技术来组织文件的是时候这很有用处。但记得实现这个:
var b:moreTools = new moreTools(this);
和类中的:
function myTest(father:MovieClip) {
targetMovie = father;
trace(this+"::");
}
它将你当前的影片地址告诉这个类的实例。这样它才能访问和控制你的 MovieClip 或者说更特殊的 MovieClip (_root),你不能用 _parent 来访问这个类实例所在的 TimeLine 和 MovieClip 。
在这里,它帮助 MovieClip 画一个方形。你可以增加更多的功能,以扩展这个 MovieClip 。管理好这些在此 MovieClip 中的 Object (类)将更具有挑战性。但也更容易让你的 MovieClip 变得不可一世。
点击 这里 下载这个示例的源文件和类。
注意你的类中的on事件和影片中on事件的微小区别,当你在其中引用某个变量时,这并不是指你的当前类,而是这个事件的宿主影片。
//示例中A为类中的变量,它指向某个MovieClip
targetMovie.cc.onMouseMove = function() {
trace("move"+A.bb._xmouse);
};
这里你将得到 undefined。
作为突破口,你可以在定义on事件,前先将类中的变量附加到on事件宿主的影片中,然后在on事件函数中用this.变量来访问。当然,如果能够,别忘了在不需要的时候删除这个变量。
targetMovie.cc.tar = A;
targetMovie.cc.onMouseMove = function() {
trace("move"+this.tar.bb._xmouse);
};
现在你可以得到正确的值了。
最后,很不幸的告诉你,你仍然可以在运行时逃避所有的不安全因素检查。你得努力提高自身的能力,别太指望 Flash MX 2004 Pro 所谓的编译器。这不是一个真正意义上的编译器。
感谢您的阅读,同时也希望你能找到更技巧的方式。如果可能,我们非常愿意将你的这些想法记录在 FK (.org)