2016-07-15 22 views
0

Um mein Spiel dynamischer zu machen, habe ich ein Skript erstellt, in dem Argumente verwendet werden, um durch vordefinierte Variablen ersetzt zu werden.Game Maker Studio, Skriptargumente reagieren nicht auf Variablen

Auf der linken mouse_button klicken, dort ist der Code:

script_execute(scrShoot, weapon1, ammo1); 

Wo weapon1 und ammo1 sind lokale Variablen.

Die einfache Skript 'scrShoot' ist wie folgt:

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 wie erwartet funktioniert, erfolgreich durch weapon1 substituiert ist jedoch die Variable ammo1 nie abnimmt.

Wenn ich manuell anstelle von argument1 in ammo1 schreibe, funktioniert das Skript gut; mit jedem Klick um 0,05 verringern.

Andere Tests mit Skripten haben mich zu der Annahme verleitet, dass das Problem darin liegt, Variablen zu verwenden, um Argumente zu ersetzen: Zeichenfolgen und Zahlen funktionieren wie erwartet.

Ich habe dieses Problem in mehr als einem Szenario und ich bin verblüfft, dass niemand sonst im Internet scheint, das gleiche Problem zu haben.

Antwort

3

Wenn Sie eine Zahl als Argument an ein Skript übergeben, geben Sie diesem Skript eine Kopie der Nummer, mit der gearbeitet werden soll. Das heißt, das Skript sieht nicht, dass Sie es übergeben ammo1 - es sieht nur, dass Sie es übergeben, sagen wir 50. Die Zeile argument1 -= 0.05 ändert nur die Kopie, die das Skript empfängt, nicht ammo1 selbst.

Dies ist ein Argument übergeben von Wert (was dem Skript eine Kopie, die sie ändern können) genannt, als zu durch Bezugnahme gegen (das Skript auf eine Variable zeigen zu ändern).

See: What's the difference between passing by reference vs. passing by value?

GML selbst keine Syntax für Argumente von Verweis vorbei, so dass Sie kein Glück. Was Sie kann tun, glaube ich, ist eine Instanz-ID übergeben (wie self oder other, oder das Ergebnis eines Aufrufs zu instance_create) an das Skript:

/// scrShoot() 
var o = argument0; 
if (o.weapon == 1) { 
    o.ammo -= 0.05; 
    instance_create(x, y, objBullet); 
} 

/// Your object 
script_execute(scrShoot, self);