最近开始使用GameMaker做一些东西,所以要对GameMaker的脚本语言GML的基础有一些了解。
由于这门语言基本来讲是一门面向过程的语言,所以在有些事情上的实现方法上会和面向对象的语言所使用的常用方法有些区别。
比如在面向对象的语言中,我们经常会把一些相关的数据、方法等封装成一个类(Class),之后可能会把这个类进行实例化,便产生了一个对象(Object)。而当我们需要使用这个对象中的数据或方法的时候,可能就会用如下的方式进行调用:
1 Object obj = new Object (); //实例化一个对象 2 3 int valInt = obj.mInt; //获取成员数据 4 5 obj.mMethod (); //调用成员方法
在GML中,也有Object的这个概念,然而这个Object并不是传统意义上的由Class实例化出来的对象,而更像是在Unity中的GameObject,也就是触发事件,执行脚本的一个运行单位。
因此想要实现类似于传统的Object的效果的话,就需要通过另一种方式来进行,也就是GameMaker里的map。
GameMaker里的map其实就是C#里面的Hashtable也就是通过<Key, Value>形式来进行数据存放的一种数据结构。在这个map中,你一样也可以存放你想要的各种数据:
1 dataMap = ds_map_create(); //创建一个map 2 3 ds_map_add(dataMap, "mNumber", 1); //添加一个number类型的数据 4 ds_map_add(dataMap, "mScript", script_0); //添加一个Script
当这个map被创建之后,其中的数据成员mNumber,只需要通过下面的方法就可以正常访问到:
1 var numberVal = dataMap[? "mNumber"];
然而当博主尝试访问其中的成员Script的时候,尝试了如下方式,但最终都会在编译的时候报错:
1 dataMap[? "mScript"](); //直接尝试调用 2 3 var scr = dataMap[? "mScript"]; //把Script单独取出 4 scr(); //尝试执行取出之后的Script
后来笔者尝试着输出了一下存放到map里的Script的类型
1 show_debug_message(typeof(dataMap[? "mScript"]));
得到了如下结果:
也就是说Script被存放为了“数字”类型。
结合之前的一些实验和了解,想到了在GameMaker中,大量的东西都是通过一个索引值来进行标记的,这个索引值的类型就是number,所以也就是说这个存放进去的可能并不是Script本身,而应该是它对应的索引值。
知道了这些,便去google了一下,最后看到了API中有这样一个函数
script_execute(<script_name>, <arg0>, <arg1>...)
显然这个函数应该就是来干这件事的 于是进行了尝试:
1 script_execute(dataMap[? "mScript"]);
成功的到了想要的结果,问题愉快的被解决了 ^_^