Game Maker Studio,脚本参数不响应变量

时间:2016-07-15 10:00:47

标签: arguments local-variables game-maker gml

为了让我的游戏更具动态性,我创建了一个脚本,其中使用了参数以便被预先定义的变量替换。

点击左侧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。

使用脚本的其他测试让我相信问题在于使用变量替换参数:字符串和数字可以正常工作。

我在多个场景中遇到过这个问题,我很困惑,互联网上没有其他人似乎遇到过同样的问题。

1 个答案:

答案 0 :(得分:3)

当您将一个数字作为参数传递给脚本时,您将为该脚本提供要使用的数字的副本。也就是说,脚本没有看到你传递它ammo1 - 它只看到你传递了它,比如50。行argument1 -= 0.05只修改脚本收到的副本,而不是ammo1本身。

这称为传递参数按值(给脚本一个可以修改的副本),而按引用(将脚本指向一个变量)修改)。

请参阅:What's the difference between passing by reference vs. passing by value?

GML本身没有通过引用传递参数的语法,所以你运气不好。我相信,您可以做的是将实例ID(例如selfother或调用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);