Flash社交游戏开发攻略连载(五)——反射的应用

来源:互联网 发布:手机国外电视直播软件 编辑:程序博客网 时间:2024/05/18 01:56

反射(Reflection),是众多面向对象语言都有的功能,不过我在论坛上常常看到有人不理解反射的用途,甚至有人说反射没有任何用处。今天我不讲反射究竟有多少可挖掘的地方,我们就着我们的游戏内容,来讲一下反射的现实应用,很多东西,不用你是不知道的。

我们来到花园游戏,花园游戏中有许多的花,很多很多,估计有108种,并且一直在不断的增加。大家都知道,花肯定是flash做好的元件,因此我们要去库里面取,从库里面取也有很多种方法。最简单的就是在库里面元件中的属性点导出,然后在程序里就可以去实例化这个类了。比如你导出类的名字是Flower1, 那么在程序里你就可以这么写:var flower=new Flower1();然后就可以将这个类的实例添加到屏幕了。那么,如果真的这么去做游戏,你就会发现很多问题:1、每次新增加一朵花,我就不得不修改程序,重新新增加一个类的实例化过程。2、如果你想要把主程序和这些资源文件分离的话,你甚至都无法正确编译你的程序,因为在主程序中,并没有Flower1这个类。
所以我们使用了反射,在这种情况下,反射的作用相当于用字符串来取代类名,正因为他是字符串,你可以不顾及这个类当前存不存在。
好了我们开始做了,我很简单的讲一下我们的做法,我们把花的元件全部放到一个单独的fla中,每个花都有单独的导出,从Flower1到Flower108,然后生成flower_asset.swf,我们在主程序中加载这个swf文件,与此同时我们加载一个XML配置文件(具体如何加载我之后会详细说明),总之我就是加载,并且读取到了每个id的花所对应到的导出类名(比如id为20001的红玫瑰花对应的元件的类是Flower1),现在我要显示出某个用户的所有的花,比如这个用户有个花朵的数组,数组中有如下数据[20001,20002,20001,20003],那么我们就做一个循环,实例化所有的FlowerXXX的类,然后添加到舞台上。
我们先在文档类中添加一个静态方法:
public static function getMovieClip(mcname:String) : MovieClip
        {
try
{
var mcClass:* = Class(getDefinitionByName(mcname));
if (mcClass == null)
{
return null;
}
return new mcClass;
}
catch (e)
{
return null;
}
return null;
        }
注意我使用了try,这是为了系统的稳定性,即便因为一些特殊原因,我们取到了一些错误或者过期的数据(比如有一朵花现在已经在我们的库中删除了,但是因为策划疏忽而没有删除),我们也可以良性地处理这个问题而不至于flash报错。
然后我们在程序中就可以调用这个方法,根据从配置文件中取到的类名的字符串,调用getMovieClip方法去库中取到相应的元件。几乎在我们所有涉及到显示的类中,最后都有调用到该方法。

反射的好处在于,动态的决定了主程序将要调用的类,比如一个玩家的场景中只有5种花,我们就没必要让程序导入108个花的类(从性能上来说,反射其实是有待考究的,因为动态的东西通常比静态的慢,但是这其中的性能的得失很复杂,大家可以再讨论。)就从开发以及维护的角度来说,尽量减少编译以及版本发布的次数,让程序更容易被“定制”总是比将代码写死在程序中要好得多。
原创粉丝点击