在游戏中记录下玩家的得分,然后将得分排序是经常的事情,这就涉及到Flash游戏与后台之间的通信问题了。Flash能与任何后台语言进行通信,比如ASP,PHP,JSP,Perl,Java等。这里介绍一下Flash与PHP及ASP通信的方法。
5.2.1 在Flash 5中有load外部变量的语句
loadVariablesNum与loadVariables具有完成从动画的外部或者后台程序中取得变量值的功能。实际上它先调用一个URL,这个URL如果有输出,就把输出的内容传到Flash中。请看下面PHP语言的例子:
_root.now_url = url+"dispscore.php?buf="+getTimer();
loadVariablesNum (now_url, 0, "POST");
dispscore.php程序内容:
<?
$disp_score = "myscore=500";
$disp_name = "name=dongua";
echo "$disp_score$disp_name&score_ret=1";
?>
这里就返回了一个得分与用户名称,同时也返回了一个score_ret=1。这个变量的作用就是标志所有要返回的内容已经全部返回结束,在Flash中只需检查它就知道数据有没有返回;GetTimer()的作用是为了调试方便,因为IE有缓存,如果不每次再加一个随机内容,就有可能直接从缓存中读取数据了。请再看ASP的如下代码。
_root.now_url = url+"./score.asp?buf="+getTimer();
loadVariablesNum (now_url, 0, "POST");
score.asp程序代码如下:
<%
response.write "name=dongua"
response.write "&my_score=400”
response.write "&score_ret=1"
%>
这仅仅是一种理论上的代码,实际操作过程中还要有循环等待时间,以便程序有足够的时间来与后台交换数据,一般来说15s就足够了。当然,如果网速快,数据量少,时间会短一些。因此在编程的时候,要设定一个最大空等待时间。如果超过这个时间没有检查到score_ret变量的值,就停止等待结果,同时提示数据传送失败。
懂编程的人可以从这两种编程语言的返回中看出,返回数据的语句就相当于用后台编程语言在屏幕上显示内容,根本不用其他的特定语句!也就是说如果用Perl,JSP与Flash通信,只需用在屏幕上显示内容的语句便可。
上面讲到的是在Flash 5或4中用到方法。在MX中又增加了新的方法,那就是LoadVars对象。MX中加入这个对象,其意义是显而易见的,就是让代码更简单,更易读,更便于控制!
请看下面的程序:
dongua_load_var = new LoadVars();
//调用上面的score.asp程序
dongua_load_var.sendAndLoad("http://localhost//score.asp?buf="+getTimer(), dongua_load_var, "POST");
dongua_load_var.onLoad = function() {
trace("------------");
};
_root.createEmptyMovieClip("dongua", 1);
_root.dongua.onEnterFrame = function() {
if (dongua_load_var.loaded) {
trace(dongua_load_var.name);
trace(dongua_load_var.my_score);
trace(dongua_load_var.score_ret);
trace(dongua_load_var.contentType);
removeMovieClip("dongua");
} else {
trace("请等待.....");
}
};
输出结果如下:
请等待.....
请等待.....
请等待.....
请等待.....
请等待.....
请等待.....
请等待.....
------------
dongua
400
1
application/x-www-form-urlencoded
从这里很明显可以看出,通过实例化一个loadVars变量可以自动取得后台的变量名与变量值。这个方法比以前版本方便多了!上面程序中还用到了loadVars对象中提供的检查是否已经load完成的变量loaded。这个变量非常有用,编程时再也不用像以前那样通过从后台传一个变量来检查了。而这个对象的另一个事件onLoad则可以做成一个事件驱动的函数形式。当然了,从测试的结果来看好像是在成功的时候调用的,将asp文件名改一下再测试,发现这个事件仍然在同样时间里被调用了。通过这两点推测得出结论,这个事件函数可能是当数据传送有结果时就会被调用,而不管调用返回的是true或false。经过试验可以利用这个事件函数的返回值对上面的程序进行优化,这个返回值就是用来标志返回数据的正确与否的。把前面代码做一点修改,列出如下:
dongua_load_var = new LoadVars();
//调用上面的score.asp程序
dongua_load_var.sendAndLoad("http://localhost//score.asp?buf="+getTimer(), dongua_load_var, "POST");
dongua_load_var.onLoad = function(success_flag) {
if (success_flag) {
trace("返回值正确,取相应的数据进行处理")
trace(dongua_load_var.name);
trace(dongua_load_var.my_score);
trace(dongua_load_var.score_ret);
trace(dongua_load_var.contentType);
} else {
trace("返回值错误,程序无需再等待")
}
removeMovieClip("dongua");
};
_root.createEmptyMovieClip("dongua", 1);
_root.dongua.onEnterFrame = function() {
trace("请等待.....");
};
这段程序跟前面的相比只是将相应的程序摆放到不同的函数中而已,执行的情况是只要后台程序一有返回值,等待就结束,因此它的响应速度得到明显提高。
在loadVars对象中还有两个非常重要的方法函数就是MyLoadVars.getBytesLoaded()和MyLoadVars.getBytesTotal()。它们可以取得已经通信的数据字节数,这对于取XML的文档是非常实用的。可以通过这两个方法的配合做出一个通信过程的loading效果来,在这里就不给出代码了,请大家自己动手试一试!