为了让我的游戏更具动态性,我创建了一个脚本,其中使用了参数以便被预先定义的变量替换。
点击左侧mouse_button后,会出现代码:
script_execute(scrShoot, weapon1, ammo1);
其中weapon1和ammo1是局部变量。
简单脚本'scrShoot'如下:
if argument0 = 1
{
argument1 -= 0.05;
instance_create(x,y,objBullet);
}
if argument0 = 2
{
argument1 -= 0.05;
repeat(4)
{
instance_create(x,y,objBullet2);
}
}
argument0按预期工作,被weapon1成功替换,但变量ammo1永远不会减少。
当我手动用ammo1代替argument1时,脚本运行正常;每次点击都会减少0.05。
使用脚本的其他测试让我相信问题在于使用变量替换参数:字符串和数字可以正常工作。
我在多个场景中遇到过这个问题,我很困惑,互联网上没有其他人似乎遇到过同样的问题。
答案 0 :(得分:3)
当您将一个数字作为参数传递给脚本时,您将为该脚本提供要使用的数字的副本。也就是说,脚本没有看到你传递它ammo1
- 它只看到你传递了它,比如50
。行argument1 -= 0.05
只修改脚本收到的副本,而不是ammo1
本身。
这称为传递参数按值(给脚本一个可以修改的副本),而按引用(将脚本指向一个变量)修改)。
请参阅:What's the difference between passing by reference vs. passing by value?
GML本身没有通过引用传递参数的语法,所以你运气不好。我相信,您可以做的是将实例ID(例如self
或other
或调用instance_create
的结果)传递给脚本:
/// scrShoot()
var o = argument0;
if (o.weapon == 1) {
o.ammo -= 0.05;
instance_create(x, y, objBullet);
}
/// Your object
script_execute(scrShoot, self);