GameMaker8.0 新手教程 Part 7 -对象与代码(二)-

分类栏目:gamemaker教程

735

GameMaker8.0 新手教程 Part 7 -对象与代码(二)-

3、对象之间的交流:成员运算符

两个对象之间要如何实现数据的交流?方法之一就是使用成员运算符(.)。对的,就是一个小数点。他可以在一个对象里使用/改变另一个对象的变量。
例如,在上一章中对象实例的创建这一小节所举的例子中,我们如何做到不把代码speed = 6;写在objBullet里,而是用objControl来控制objBullet的速度?
只要在objControl的alarm0(计时器0)事件中加上objBullet.speed = 6;即可。
这句代码要放在instance_create(100,200,objBullet);的后面,至于放在alarm[0] = 50;的前面还是后面可以随意。

进阶:对单个实例的数据交流
以“对象名.变量名”的形式进行数据交流时,如果此时房间中有多个该对象的实例,譬如上一个例子中,房间中有多个objBullet的实例,objBullet.speed = 6;实际上是对所有的objBullet的实例发出了指令。而如果以"spd = objBullet.speed;"来获取数据的话,获得的是游戏中现存的最早被创造的那个objBullet的实例的speed。
在我们的例子中,由于所有objBullet的speed都是6,所以直接objBullet.speed = 6;没有问题。

但是现在,我们想要在创建每一个objBullet的实例时,都给它一个随机的2~8的速度,而不是固定的6。
如果通过objBullet.speed = random_range(2,8);,经过测试,你会发现,每次创建新的实例时,其他已经存在的objBullet的实例的速度也会发生改变——因为他们都是objBullet,所以都会受到objBullet.speed = random_range(2,8);的影响。
所以要把alarm0事件的代码改成:

inst = instance_create(100,200,objBullet);
inst.speed = random_range(2,8);
alarm[0] = 50;

通过变量inst来储存最新创建的objBullet的索引,并且对inst发出指令,这样一来,每次执行alarm0事件只会改变最新创建的那个实例的speed。

原理:
在游戏运行时,所有的实例都会被系统分配一个独一无二的索引(ID,Index),譬如屏幕里有四个objBullet,但是他们的索引都各不相同,可能分别是1000001,1000002,1000003,1000004(随便写的),但是实际上游戏运行的时候一个实例究竟被分配哪个索引,我们很难预料,所以一般更多的利用instance_create函数会返回被创建的实例的索引的特性,使用一个变量来储存这个新实例的索引。由于索引可以用在成员运算符中,所以就可以对单个实例的变量进行访问/修改。
由于instance_create()函数直接返回实例的索引,所以上述例子可以直接写成:

(instance_create(100,200,objBullet)).speed = random_range(2,8);//函数instance_create一定要用括号括起来

从而不使用变量去储存索引也是可以的。但是这样每个新的实例就只能被改变一个值了(可用with解决)。

PS:同一个对象的不同实例之间也可以使用索引互相控制。

在布置房间时,把鼠标放在一个实例上,状态栏会显示它的索引。
GameMaker8.0 新手教程 Part 7 -对象与代码(二)-
在已知索引的情况下,我们也可以直接使用索引来访问/修改这个实例的变量。
例如,上图中实例的索引为100012,我们让别的对象/实例改变它的速度,就可以写:

(100012).speed = 12;//注意索引一定要用括号括起来