Game Maker Studio, аргументы скрипта не реагируют на переменные

Чтобы сделать мою игру более динамичной, я создал сценарий, в котором аргументы используются для замены предопределенными переменными.

При нажатии левой кнопки мыши появляется код:

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);
    }
}

аргумент0 работает как положено, успешно заменяется на weapon1, однако переменная ammo1 никогда не уменьшается.

Когда я вручную пишу ammo1 вместо arguments1, скрипт работает нормально; уменьшается на 0,05 с каждым кликом.

Другие тесты с использованием сценариев привели меня к мысли, что проблема заключается в использовании переменных для замены аргументов: строки и числа работают так, как вы ожидаете.

Я столкнулся с этой проблемой более чем в одном сценарии, и я сбит с толку тем, что никто в Интернете, похоже, не сталкивался с такой же проблемой.


person Legatro    schedule 15.07.2016    source источник


Ответы (1)


Когда вы передаете число в качестве аргумента сценарию, вы даете этому сценарию копию числа для работы. То есть скрипт не видит, что вы ему передаете ammo1 — он видит только то, что вы ему передаете, скажем, 50. Строка argument1 -= 0.05 просто изменяет копию, которую получает скрипт, а не саму ammo1.

Это называется передачей аргумента по значению (предоставление скрипту копии, которую он может изменить), а не по ссылке (указывая скрипту на изменяемую переменную).

См.: В чем разница между передачей по ссылке и .передача по значению?

Сам GML не имеет синтаксиса для передачи аргументов по ссылке, так что вам не повезло. Что вы можете сделать, я думаю, так это передать идентификатор экземпляра (например, 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);
person Lynn    schedule 15.07.2016